Journal Créer et partager des paquets Nix

Posté par (page perso) . Licence CC by-sa.
14
26
avr.
2018

Suite aux différents journaux sur la création de paquets, voici quelques astuces pour Nix/Nixos.

article original sur github

vidéo bonux sur youtube

Introduction

Comment créer un paquet nix pour gérer une dépendance dans un projet.
Comment gérer des paquets nix via un dépôt git.

Créer un paquet localement

On développe un projet et on a besoin d'une bibliothèque (par exemple, myhellolib).

  • écrire un fichier empaquetant la dépendance test_myhellolib1/myhellolib.nix :
{ stdenv, fetchurl, cmake }:

stdenv.mkDerivation rec {
  name = "myhellolib";
  version = "0.1";
  src = fetchurl {
    url = "https://github.com/nokomprendo/${name}/archive/v${version}.tar.gz";
    sha256 = "1msg5dy3flqiaqz8vmjdrsgc21c1anpqpc1827c5vsvzc70n8ig8";
  };
  buildInputs = [ cmake ];
}
  • écrire un fichier empaquetant le projet principal test_myhellolib1/default.nix :
with import <nixpkgs> {};

let
  _myhellolib = import ./myhellolib.nix { inherit stdenv fetchurl cmake; };
in

stdenv.mkDerivation {
  name = "test_myhellolib1";
  src = ./.;
  buildInputs = [ _myhellolib ];
  buildPhase = "g++ -o test_myhellolib1 test_myhellolib.cpp -l myhellolib";
  installPhase = ''
      mkdir -p $out/bin
      cp test_myhellolib $out/bin/
  '';
}
  • compiler le projet : nix-build

Créer un paquet via un dépôt nixpkgs

On veut mettre nos paquets de dépendances dans un dépot fork de nixpkgs (par exemple, pour éviter de dupliquer les paquets dans plusieurs projets ou pour soumettre les paquets à la communauté nixpkgs).

  • créer une nouvelle branche du dépôt fork :
cd /path/to/my/nixpkgs/
git checkout -b myhellolib
  • créer un dossier pour le paquet :
mkdir pkgs/development/libraries/myhellolib
  • écrire/copier le paquet dans ce dossier et dans un fichier default.nix

  • ajouter le paquet dans le fichier pkgs/top-level/all-packages.nix :

myhellolib = callPackage ../pkgs/development/libraries/myhellolib { };
  • éventuellement, tester la compilation ou installer le paquet :
nix-build -A myhellolib
nix-env -f . -iA myhellolib
  • compiler les projets en utilisant le dépôt fork :
cd test_myhellolib2
nix-build -I nixpkgs=/path/to/my/nixpkgs/
  • pour soumettre le paquet à la communauté nixpkgs, committer/pusher la branche et créer un Pull Request.

Tester un paquet d'un Pull Request

On veut tester un paquet proposé par quelqu'un dans un Pull Request.

  • si ce n'est pas déjà fait, ajouter le dépôt principal dans les dépôts remote :
cd /path/to/my/nixpkgs/
git remote add upstream https://github.com/nixos/nixpkgs
  • passer dans la branche du Pull Request :
git fetch upstream pull/<id>/head:<branch>
git checkout <branch>
  • tester dans un projet, en utilisant le dépôt du Pull Request :
cd helloeigen
nix-build -I nixpkgs=/path/to/my/nixpkgs/
./result/bin/helloeigen

Conclusion

nix permet facilement de :
- créer des paquets localement
- regrouper des paquets dans un dépôt
- soumettre des paquets à la communauté
- tester des paquets soumis

manuel nixpkgs

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.