如何在 Haskell Stack+Nix 项目中添加 Nix 项目作为依赖项
How to add a Nix project as dependency in a Haskell Stack+Nix project
我正在尝试使用 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-client 和 tezos-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)
要在 PATH 中输入带有可执行文件的 shell:nix shell
(默认情况下它引用 shell.nix
)。
要将 tezos-baking-platform
添加为依赖项,我认为您只需将其添加到 buildInputs
中即可。如果这是来自名为 tezos
的 channel
,您将必须导入:
tezos = import <tezos> {};
...
tezos.tezos-baking-platform
我想出了一个有效(但可能不完美)的解决方案。
因为 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 ];
}
我正在尝试使用 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-client 和 tezos-baking-platform 提供的其他工具。我可以通过 运行
构建它nix-build -A tezos.babylonnet.kit
问题是,构建后,我可以找到所有的可执行文件,例如/nix/store/bgqva3wgi3knivdk9pf7gdd0384hj2qf-tezos-0.0.0/bin/
。但是它们没有暴露给 nix-env,我在 ~/.nix-profile/bin/
.
那么,(1) 我该如何解决这个问题? (2) 如何将 tezos-baking-platform 设置为我的 haskell 项目的依赖项? (即在构建我的 haskell 项目之前通过堆栈请求 nix 为我构建 tezos)
要在 PATH 中输入带有可执行文件的 shell:nix shell
(默认情况下它引用 shell.nix
)。
要将 tezos-baking-platform
添加为依赖项,我认为您只需将其添加到 buildInputs
中即可。如果这是来自名为 tezos
的 channel
,您将必须导入:
tezos = import <tezos> {};
...
tezos.tezos-baking-platform
我想出了一个有效(但可能不完美)的解决方案。
因为 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 ];
}