2017-12-09 25 views
2

나는 nix-build 내 패키지를 구축하고 얻을이 default.nix를 사용 env 생성 nix-shellcabal2nix에 패키지를 추가하는 방법`env`를 생성 했습니까?

{ pkgs ? import <nixpkgs> {} }: 
with pkgs; 
with haskellPackages; 

let 
    myPackage = callPackage ./myPackage.nix {}; 
in 
    if lib.inNixShell then myPackage.env else myPackage 

myPackage.nix 이것은 구축하기위한 제대로 작동 cabal2nix . > myPackage.nix

{ mkDerivation, base, split, stdenv }: 
mkDerivation { 
    pname = "myPackage"; 
    version = "0.1.0.0"; 
    src = ./.; 
    isLibrary = false; 
    isExecutable = true; 
    executableHaskellDepends = [ base split ]; 
    license = stdenv.lib.licenses.bsd3; 
} 

을 사용으로하지만 난 동안 개발 도우미 도구를 추가 할 나는 그것에 종사하고있다. myPackage.nix을 수정하고 싶지 않습니다. myPackage.cabal을 편집 할 때 cabal2nix을 다시 실행하고 싶습니다.

나는 buildInputsmkDerivation을 사용하려고 시도했지만 작동하지 않았습니다.

let 
    myPackage = callPackage ./myPackage.nix {}; 
in 
    stdenv.mkDerivation { 
    name = myPackage.name; 

    buildInputs = [ myPackage hlint hasktags ]; 
} 

nix-build 정지 작업의 옆에, 그것은 또한 myPackage의 실행 파일 만 myPackage의 ENV없이 쉘에서 저를 놓습니다.

위의 default.nix을 사용하는 경우 의 env에있는 동안 ghc은 사용할 수 없기 때문에이 사실을 알고 있습니다.

에서 생성 된 env에 어떻게 도구를 추가 할 수 있습니까?

답변

1

nix-shell 명령은 프로젝트의 모든 종속성을 빌드하고 모든 환경 변수를 각각의 파생 속성 값 및 소스 (bash) $stdenv/setup으로 설정합니다. 자세한 내용은 the Nix manual about nix-shell을 참조하십시오.

마지막 예에서 echo $buildInputs을 실행하면 빌드 된 패키지가 빌드 입력으로 표시됩니다. 그렇게 작동하지만 원하는 것은 아닙니다.

대신에 하스켈 관련 환경 파생어 인 myPackage.env을 다시 사용해야합니다. 나는 이것에 대한 shell.nix 파일을 사용) 내 프로젝트에서

, nix-shell에 대한이 더미 유도 등 만 종속

pkgs.lib.overrideDerivation myPackage.env (old: { 
    buildInputs = old.buildInputs ++ [ pkgs.haskellPackages.hlint ]; 
}) 

원치 않는 조언을 발견하도록 설정된 GHC있다 . 또한 참조 투명성을 깨는 lib.inNixShell 값을 피할 수 있습니다.

프로젝트가 하스켈 패키지 이상으로 구성된 경우 오버레이를 작성하는 것이 좋습니다. 그것은 당신의 프로젝트를 훨씬 더 일관되게 만들 것입니다.

shell.nix

오버레이의 예
# This imports the project + overlay. The overlay takes care of 
# adding `myPackage` to `haskellPackages`, to make it available 
# throughout the project. 
[email protected]{...}: 
let pkgs = (import ../nix attrs); 

# Adapt myPackage.env 
in pkgs.lib.overrideDerivation pkgs.haskellPackages.myPackage.env (old: { 
    buildInputs = old.buildInputs ++ [ pkgs.haskellPackages.hlint ]; 
}) 

, zimbatm's todomvc-nix 참조.