【问题标题】:How to add a Nix project as dependency in a Haskell Stack+Nix project如何在 Haskell Stack+Nix 项目中添加 Nix 项目作为依赖项
【发布时间】:2019-11-18 12:21:52
【问题描述】:

我正在尝试使用 stack + nix 编写一个 haskell 项目。我目前的stack.yamlshell.nix如下:

resolver: lts-14.6
packages:
- .
nix:
  enable: true
  pure: true
  shell-file: shell.nix
{ghc}:
with (import <nixpkgs> {});

haskell.lib.buildStackProject {
  inherit ghc;
  name = "myproject";
  buildInputs = [ pkg-config libmysqlclient postgresql_10 pcre libsodium secp256k1 zlib ];
  PGPASSWORD = builtins.getEnv "PGPASSWORD";
}

现在,在我的haskell 项目中,我想执行tezos-clienttezos-baking-platform 提供的其他工具。我可以通过运行来构建它

nix-build -A tezos.babylonnet.kit

问题是,在构建之后,我可以在例如/nix/store/bgqva3wgi3knivdk9pf7gdd0384hj2qf-tezos-0.0.0/bin/ 中找到所有可执行文件。但是它们没有暴露于 nix-env 并且我在 ~/.nix-profile/bin/ 中找不到任何 tezos 的符号链接。

那么,(1) 我该如何解决这个问题? (2) 如何将 tezos-baking-platform 设置为我的 haskell 项目的依赖项? (即在构建我的 haskell 项目之前,通过堆栈要求 nix 为我构建 tezos)

【问题讨论】:

  • 没什么问题,但是在nix-shell 内部运行stack buildstack exec 不是更舒服吗?

标签: haskell haskell-stack nix


【解决方案1】:

我想出了一个可行(但可能并不完美)的解决方案。

因为 tezos-baking-platform 没有提供 nix 派生,所以最简单的方法是把整个仓库放到工作仓库中,import 它的 nix 文件。这将使tezos.babylonnet.kit 在 nix 中可用,因此我们可以直接将其设置为依赖项。

{ghc}:
with (import <nixpkgs> {});
with import ./tezos-baking-platform/default.nix {};
haskell.lib.buildStackProject {
  inherit ghc;
  name = "qq";
  buildInputs = [ tezos.babylonnet.kit ];
}

PS。理想情况下,如果 tezos-baking-platform 提供了 nix 派生,那么我们可以做类似

{ghc}:
with (import <nixpkgs> {});

stdenv.mkDerivation {
  name = "tezos-baking-platform";
  version = "0.0.0";
  src = fetchurl {
    url    = "https://gitlab.com/obsidian.systems/tezos-baking-platform/";
    rev    = "2f37c78a4b0ac26ee5e428711ab3c7ebeb9869fb";
    sha256 = "0h71ivsva7hfqy0zy1pbx68a4i8lbqln3k9zkw0j2rgain39844r";
  };
}

haskell.lib.buildStackProject {
  inherit ghc;
  name = "myproject";
  buildInputs = [ tezos-baking-platform ];
}

【讨论】:

    【解决方案2】:

    要在 PATH 中输入带有可执行文件的 shell:nix shell(默认情况下它引用 shell.nix)。

    要将tezos-baking-platform 添加为依赖项,我认为您只需将其添加到buildInputs 中即可。如果这是来自名为 tezoschannel,则必须导入:

    tezos = import <tezos> {};
    
    ...
    
    tezos.tezos-baking-platform
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多