Bruno Rodrigues, responsable des départements “statistiques” et “stratégie de données” du Ministère de la Recherche et de l’Enseignement supérieur au Luxembourg
Utilisateur de R depuis 2009
Cette présentation est disponible sur le lien suivant https://is.gd/nix_russ
Code source disponible ici: https://github.com/b-rodrigues/russ_workshop
Apprendre juste ce qu’il faut de Nix pour “être dangereux”
Programme:
Si le temps le permet: créer son propre cache de binaires avec Cachix
Le sujet d’aujourd’hui: le gestionnaire de paquets
Nix est un outil complexe
Il faut de l’investissement de la part des utilisateurs
Mais {rix}
va nous aider!
Gestionnaire de paquets: un outil pour administrer des …paquets
Paquet: n’importe quel logiciel (pas seulement des paquets R)
Voici un gestionnaire de paquets populaire:
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.
{renv}
(Remarque: on peut s’abstraire de rig
si Docker inclut la bonne version de R)
Nix permet de tout gérer d’un seul coup!
Sans Nix (ou Docker + {renv}
) on doit accepter les risques suivants:
Une vraie bombe à retardement
Nix est un gestionnaire de paquets fonctionnel
Fonctionnel, comme la programmation fonctionnelle inspirée du lambda-calcul
Lambda-calcul? Pour faire simple:
-> f(x)=y
f(x) va toujours donner y
Autrement dit, y ne dépend de rien d’autre que de x qui est transformé par f
The idea is to always deploy component closures: if we deploy a component, then we must also deploy its dependencies, their dependencies, and so on. That is, we must always deploy a set of components that is closed under the ‘’depends on’’ relation. Since closures are selfcontained, they are the units of complete software deployment. After all, if a set of components is not closed, it is not safe to deploy, since using them might cause other components to be referenced that are missing on the target system.
Eelco Dolstra, Nix: A Safe and Policy-Free System for Software Deployment
install.packages("dplyr")
ne va pas toujours donner le même résultat!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";
}
pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/976fa3369d722e76f37c77493d99829540d43845.tar.gz") {};
system_packages
: une variable qui liste les paquets à installersystem_packages = builtins.attrValues {
inherit (pkgs) R ;
};
pkgs.mkShell {
buildInputs = [ system_packages ];
shellHook = "R --vanilla";
}
system_packages
(buildInputs
)R --vanilla
au démarrage (shellHook
){rix}
est la solution!{rix}
(site) génère des expressions Nix!rix()
:rix::rix()
génère un fichier default.nix
nix-build
(dans le terminal) ou rix::nix_build()
depuis R pour installer le shell défini dans default.nix
nix-shell
"dplyr@1.0.0"
)Jettons un coup d’œil à expressions/rix_intro/
maintenant…
{rix}
rend possible d’exécuter des pipelines dans le bon environnement{targets}
)expressions/nix_targets_pipeline
cd /absolute/path/to/pipeline/ && nix-shell default.nix --run "Rscript -e 'targets::tar_make()'"
{targets}
dans Github actionsrix::tar_nix_ga()
pour générer les fichiers nécessairesexpressions/subshell
nixpkgs
rPackages
est mis à jour avec une nouvelle sortie de R (tous les 3 mois grosso modo)nixpkgs
: rstats-on-nix
ici!rix(r_ver = "bleeding_edge",
r_pkgs = c("dplyr", "ggplot2"),
...
}
Documentation officielle de Nix: https://nix.dev/
Tuto Nix par l’INRIA: https://nix-tutorial.gitlabpages.inria.fr/nix-tutorial/
Mon blog: https://b-rodrigues.github.io/rix/
Mon livre (ne parle pas de Nix, mais de reproductibilité avec Docker et renv): https://raps-with-r.dev/