如何在Haskell Stack + Nix项目中将Nix项目添加为依赖项

时间:2019-11-18 12:21:52

标签: haskell haskell-stack nix

我正在尝试使用 stack + nix 编写haskell项目。我当前的 stack.yaml shell.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-baking-platform提供的 tezos-client 和其他工具。我可以通过运行来构建它

  

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)

2 个答案:

答案 0 :(得分:2)

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

因为 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 ];
}

答案 1 :(得分:0)

要在PATH中输入包含可执行文件的shell,请执行以下操作:nix shell(默认情况下,它引用shell.nix)。

要将tezos-baking-platform添加为依赖项,我想您只需将其添加到buildInputs中即可。如果这来自名为channel的{​​{1}},则必须导入:

tezos
相关问题