我有一个 Javascript 构建环境,最近我将构建命令(yarn
在本例中为npm
)包装在 FHS 环境中。这是必要的,因为对于此构建,yarn
会删除几个与 NixOS 文件系统不兼容的二进制依赖项,因此将整个构建过程包装在 FHS 环境中是有益的。
然而,我们有一个环境变量,我需要能够将其传递给纱线以调整构建过程。我怎样才能在命令行中传递它?
我的纱线环境文件如下所示:
{ pkgs ? import <nixos> {}
, fetchurl ? pkgs.fetchurl
, nodejs ? pkgs.nodejs
, buildFHS ? pkgs.buildFHSUserEnv
, mkDerivation ? pkgs.stdenv.mkDerivation
}:
let
version = "0.19.1";
pkgUrl = "https://github.com/yarnpkg/yarn/releases/download/v${version}/yarn-v${version}.tar.gz";
pkgSha = "751e1c0becbb2c3275f61d79ad8c4fc336e7c44c72d5296b5342a6f468526d7d";
in rec {
yarn-env = mkDerivation {
name = "yarn-env";
src = fetchurl {
url = pkgUrl;
sha256 = pkgSha;
};
phases = [ "unpackPhase" "installPhase" ];
installPhase = ''
mkdir -p $out
cp -r * $out
'';
};
yarn = buildFHS {
name = "yarn";
targetPkgs = pkgs: [ nodejs
yarn-env
pkgs.git
pkgs.stack
pkgs.haskell.compiler.ghc802
pkgs.zlib
pkgs.ncurses5
pkgs.gmp
pkgs.neovim
];
runScript = "yarn";
profile="export DEPENDENCY_BRANCH=2310-nifty-unmerged-feature";
};
}
因此,我将此文件包含在一个更大的文件中,shell.nix
以便我可以使用yarn命令,并且我还有在构建和部署中使用的其他几个命令。
我希望能够在命令行上而不是在文件中指定该依赖分支yarn-env.nix
。
答案1
nix-shell
和都支持通过和nix-build
传递参数。将被评估为 nix 表达式,并将被视为字符串文字。 使用问题中提供的表达式,您可以使用它们来覆盖 的值,如下所示:--arg
--argstr
--arg
--argstr
pkgs
nix-shell -A yarn --arg pkgs 'import /home/me/nixpkgs {}'
您可以向表示依赖分支的表达式添加另一个参数:
branch ? "2310-nifty-unmerged-feature"
并在表达式中引用它:
profile="export DEPENDENCY_BRANCH=${branch}";
然后可以使用以下任一方法在命令行中传递分支:
nix-shell --arg branch \"somebranch\"
nix-shell --argstr branch somebranch
有了这个,就应该以类似的方式调整外部表达式并使它们传播参数branch
。
nix-shell
手册页有关于处理--arg
和 的更多详细信息--argstr
。