从堆栈项目生成 Nix 包

Generating a Nix package from a stack project

我有一个可以使用 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, and a stack to nix 转换工具。

我也愿意接受多平台打包的替代方案。

通过最近的 merge,我能够使用以下步骤构建和安装一个简单的堆栈项目:

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

    nix:
      enable: true
      shell-file: default.nix
    
  4. 创建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