我正在尝试使用Nix来统一我的本地开发环境和我正在使用的基于docker的Gitlab CI构建。
我有一个简单的shell.nix,可以很好地工作-我可以在本地运行nix-shell并获得所需的一切。
[如果在我的CI配置中,我然后将nixos/nix:latest
用作我的docker映像,并用nix-shell --run "xxx"
包围所有有效的命令。整个地方的nix-shell
都很繁琐,难以理解实际发生的情况。我想做的就是将配置作为第一个命令以某种方式应用于docker镜像,以便所有后续构建命令都可以使用该环境。
我认为我想要的是类似nix-env -f shell.nix -i
的东西,但是失败了,“该推导并不旨在构建,正在中止”。
提前感谢。
您可以使用buildEnv
将您的工具合并为一个衍生工具。
default.nix:
{ pkgs ? import <nixpkgs> {} }:
pkgs.buildEnv {
name = "my-tools";
paths = [
pkgs.hello
pkgs.figlet
];
}
现在您可以在Docker映像中安装工具:
nix-env -i -f default.nix
并在您的shell.nix:
中使用它{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
name = "shell-dummy";
buildInputs = [ (import ./default.nix { inherit pkgs; }) ];
}
另请参见Nixpkgs手册中的Declarative Package Management部分。
这是魔术命令:
nix-env -f shell.nix -i -A buildInputs
这使用buildInputs
中的mkShell
列表作为要安装到环境中的派生列表。这比较简单,但是与罗伯特的回答相比,关注点分离得不太干净。