Como posso passar uma variável enivironment para um nixos buildFHSUserEnv?

0

Eu tenho um ambiente de criação de Javascript que recentemente envolvi o comando de compilação ( yarn neste caso, em vez de npm ) em um ambiente FHS. Isso foi necessário porque, para essa compilação, yarn reduz várias dependências binárias que não são compatíveis com o sistema de arquivos NixOS, portanto, envolver todo o processo de compilação em um ambiente FHS foi benéfico.

No entanto, temos uma variável de ambiente que eu preciso ser capaz de passar para o fio para ajustar o processo de construção como eu vou. Como posso passar isso na linha de comando?

Meu arquivo de ambiente de fio é assim:

{ 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";
    };
}

Então, eu incluo este arquivo em shell.nix maior para que eu tenha o comando yarn por perto, e assim eu tenho vários outros comandos que usamos na construção e implementação.

Eu gostaria de poder especificar esse ramo de dependência na minha linha de comando em vez de no arquivo yarn-env.nix .

    
por Savanni D'Gerinel 22.06.2017 / 13:41

1 resposta

2

Tanto nix-shell como nix-build suportam a transmissão de argumentos com --arg e --argstr . --arg será avaliado como uma expressão nix e --argstr será tratado como uma string literal.
Usando a expressão fornecida na pergunta, você poderia usá-los para substituir o valor de pkgs da seguinte maneira:

nix-shell -A yarn --arg pkgs 'import /home/me/nixpkgs {}'

Você pode adicionar outro argumento à sua expressão que representa o ramo de dependência:

branch ? "2310-nifty-unmerged-feature"

e referencie-o dentro da expressão com:

profile="export DEPENDENCY_BRANCH=${branch}";

A ramificação pode então ser passada na linha de comando com:

nix-shell --arg branch \"somebranch\"
nix-shell --argstr branch somebranch

Com isso, deve-se ajustar as expressões externas de maneira semelhante e fazê-las propagar o argumento branch .

A página de manual

nix-shell tem mais detalhes sobre o tratamento de --arg e --argstr .

    
por 22.06.2017 / 22:20

Tags