Nixos

如何將環境變數傳遞給 nixos buildFHSUserEnv?

  • June 22, 2017

我有一個 Javascript 建構環境,我最近將建構命令(yarn在這種情況下,而不是npm)包裝在 FHS 環境中。這是必要的,因為對於此建構,yarn會拉下幾個與 NixOS 文件系統不兼容的二進制依賴項,因此將整個建構過程包裝在 FHS 環境中是有益的。

但是,我們有一個環境變數,我需要能夠將其傳遞給 yarn 以在我進行時調整建構過程。我怎樣才能在命令行上傳遞它?

我的紗線環境文件如下所示:

{ 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文件中指定依賴分支。

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

引用自:https://unix.stackexchange.com/questions/372692