2017-10-21 32 views
4

J'ai une application logicielle qui peut être construite et installée avec stack. Je voudrais aussi offrir un paquet binaire pour Linux et Mac. À cet effet, je considère nix, car, entre autres choses, il peut être utilisé sous Linux et Mac. Cela me sauvera la peine d'avoir à maintenir deux types de paquets.Génération d'un package Nix à partir d'un projet de pile

Après avoir lu sur la façon dont nix paquets sont définis, j'attendre à ce qu'un projet basé stack pourrait être construit avec une configuration qui ressemblerait à ceci:

{ stdenv, fetchurl, stack }: # we need to depend on stack 

stdenv.mkDerivation { 
    name = "some-haskell-package-0.1"; 
    builder = ./builder.sh; # here we would call `stack install` 
    src = fetchurl { # ... 
    }; 
} 

En regardant les ressources disponibles en ligne, je ne trouve pas description de la façon dont cela pourrait être fait. Je ne sais pas si cela signifie que stack et nix ne sont pas destinés à être utilisés de cette manière.

La seule chose que j'ai pu trouver dans le manuel est how stack can use nix, et un outil de conversion stack to nix.

Je suis également ouvert aux alternatives pour les emballages multi-plateformes.

+1

Le Manuel Nix comporte une section intitulée «Comment construire un projet Haskell en utilisant Stack» https://nixos.org/nixpkgs/manual/#how-to-build-a-haskell-project-using-stack. Utilisez 'haskell.lib.buildStackProject' à la place de' stdenv.mkDerivation'. – MarcDefiant

Répondre

1

Avec ce récent projet merge, je suis en mesure de construire et d'installer d'une simple pile en suivant les étapes suivantes:

  1. Créer un nouveau projet hello avec stack new hello
  2. Ajouter les lignes suivantes à stack.yaml

    nix: 
        enable: true 
        shell-file: default.nix 
    
  3. Créer default.nix

    with (import <nixpkgs> { }); 
    
    haskell.lib.buildStackProject { 
        name = "hello"; 
        src = ./.; 
    } 
    

A ce moment, je suis en mesure d'exécuter nix-build pour construire le projet et le résultat sera à ./result/bin/hello-exe

Si je veux installer, je courrais nix-env -i -f default.nix


Side note: nix-build va télécharger le plan de build de la pile à chaque exécution.

Je veux construire mon projet de manière incrémentielle tout en apportant des modifications, donc je dois simplement laisser tomber dans le shell et appeler stack build là.

+0

Des idées sur la façon d'utiliser le dernier 'nix' (qui inclut ces changements)? –

+1

@DamianNadales Vous pouvez utiliser l'indicateur '-I nixpkgs =/path/to/repo' avec la plupart des commandes' nix- * '. Si vous ne voulez pas cloner [nixpkgs] (https://github.com/NixOS/nixpkgs) vous pouvez simplement utiliser l'URL snapshot fournie par github comme ceci 'nix-shell -I nixpkgs = https: // github. com/NixOS/nixpkgs/archive/master.tar.gz -p pile' – wizzup