【问题标题】:Generating a Nix package from a stack project从堆栈项目生成 Nix 包
【发布时间】:2017-10-21 07:23:14
【问题描述】:

我有一个可以使用stack 构建和安装的软件应用程序。我也想为 Linux 和 Mac 提供一个二进制包。为此,我正在考虑nix,因为它可以在Linux 和Mac 中使用。这将省去我必须维护两种包类型的麻烦。

在阅读了nix 包是如何定义的之后,我希望可以使用如下配置构建一个基于stack 的项目:

{ 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 {  # ...
  };
}

查看网上可用的资源,我找不到任何关于如何做到这一点的描述。我不知道这是否意味着stacknix 不打算以这种方式使用。

我在手册中唯一能找到的是how stack can use nix 和一个stack to nix 转换工具。

我也对多平台打包的替代方案持开放态度。

【问题讨论】:

  • Nix 手册中有一个名为“如何使用 Stack 构建 Haskell 项目”nixos.org/nixpkgs/manual/… 的部分。使用haskell.lib.buildStackProject 而不是stdenv.mkDerivation

标签: haskell package-managers haskell-stack nix


【解决方案1】:

有了最近的merge,我可以使用以下步骤构建和安装一个简单的堆栈项目:

  1. 使用stack new hello 创建新的hello 项目
  2. 将以下行添加到stack.yaml

    nix:
      enable: true
      shell-file: default.nix
    
  3. 创建default.nix

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

此时,我可以运行nix-build 来构建项目,结果将在./result/bin/hello-exe

如果我想安装,我会运行nix-env -i -f default.nix


旁注:nix-build 每次运行时都会下载堆栈的构建计划。

我想在进行更改的同时逐步构建我的项目,所以我主要只是放入 shell 并在那里调用stack build

【讨论】:

  • 关于如何使用最新的nix(包括这些更改)的任何想法?
  • @DamianNadales 您可以将-I nixpkgs=/path/to/repo 标志与大多数nix-* 命令一起使用。如果您不想克隆nixpkgs,您可以使用 github 提供的快照 url,例如 nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/master.tar.gz -p stack
  • 我收到以下错误:派生 '/nix/store/xxx.drv' 设置了 '__noChroot',但是当 'sandbox' 为 'true' 时这是不允许的
猜你喜欢
  • 2017-01-25
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多