rix: environnements de développement reproductibles pour développeurs R

Bruno Rodrigues

Qui suis-je?

Nix et les problèmes qu’il résout

  • Nix: un gestionnaire de paquets dispo pour Linux, Windows (via WSL2) et macOS
  • Permet de construire des environnements de développements reproductibles
  • Autrement dit, adieu…
  • … la collaboration sur environnements hétérogènes
  • … les projets pas reproductibles
  • … pas pouvoir déployer le même environnement “partout”

La solution “classique”

  • Docker + {renv} (ou autre tant qu’on arrive à installer…)
  • … les mêmes paquets R
  • … la même version de R
  • … les mêmes dépendances “système” (gdal pour {terra} par exemple)

Le gestionnaire de paquets Nix (1/3)

  • Pas une alternative à Docker!
  • Mais permet de résoudre les mêmes problèmes
  • La promesse de Nix:

Installe tous les logiciels nécessaires (R, paquets R, librairies de développement, etc) de manière totalement reproductible et sur n’importe quelle plate-forme en écrivant une seule expression dans le langage Nix.

Le gestionnaire de paquets Nix (2/3)

  • Avec Nix, on configure une fois et on exécute partout!
  • Partout: ordinateur ou serveur: Windows (via WSL2), Linux (même Android) ou macOS
  • Pour R: 99% des paquets CRAN + Bioconductor disponibles
  • Aussi possible d’installer des paquets Git-hub/lab
  • Installe les dépendances Z d’un paquet X, les dépendances Y de Z, et ainsi de suite…

Le gestionnaire de paquets Nix (3/3)

  • Nix: gestionnaire de paquets fonctionnel (inspiré du lambda-calcul)

Attention aux effets de bord!

Un gestionnaire de paquets fonctionnel et déclaratif

Nix utilise des expressions écrite dans le langage Nix pour installer des paquets:

let
  pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/976fa3369d722e76f37c77493d99829540d43845.tar.gz") {};
  system_packages = builtins.attrValues {
    inherit (pkgs) R ;
  };
in
  pkgs.mkShell {
    buildInputs = [ system_packages ];
    shellHook = "R --vanilla";
  }

rix: usage de base (1/2)

  • {rix} (site) génère des expressions Nix!
  • Il suffit d’utiliser la fonction rix():
library(rix)

rix(r_ver = "4.3.1",
    r_pkgs = c("dplyr", "ggplot2"),
    system_pkgs = NULL,
    git_pkgs = NULL,
    tex_pkgs = NULL,
    ide = "rstudio",
    project_path = ".")
  • Génère default.nix avec l’expression Nix qu’il faut!

rix: usage de base (2/2)

  • Build: nix-build
  • Run: nix-shell

rix: usage de base (2/2)

rix et targets

rix et targets

  • Aussi possible d’exécuter les pipelines sur Github Actions!
  • rix::tar_nix_ga() génère le fichier yaml qu’il faut
  • On commit et pousse et c’est parti!

rix et targets

rix et les subshells

  • Possible d’exécuter du code dans un “sous-environnement”
  • On peut récupérer le résultat dans la session principale!

rix et les subshells

Pour en apprendre plus