2017-09-11 1 views
1

나는 주로 nix-shell에 의해 사용될 .nix 표현식을 쓰고있다. 어떻게해야할지 모르겠다. 이것은 NixOS에있는 것이 아니라는 점에 유의하십시오. 그러나 나는 이것이 매우 적절하다고 생각하지 않습니다.nix-shell이 ​​nix 표현식에서 nixpkgs 파생물 이름을 가져 오는 방법은 무엇입니까?

내가 찾고 있어요 특정 예를 들어 내가 보이는 this version-dependent name 싶어한다는 것입니다 :

let 
    pkgs = import <nixpkgs> {}; 
    stdenv = pkgs.stdenv; 
    # idea_name = assert pkgs.jetbrains.idea-ultimate.name != ""; pkgs.jetbrains.idea-ultimate.name; 
in rec { 
    scalaEnv = stdenv.mkDerivation rec { 
    name = "scala-env"; 
    builder = "./scala-build.sh"; 
    shellHook = '' 
    alias cls=clear 
    ''; 
    CLANG_PATH = pkgs.clang + "/bin/clang"; 
    CLANGPP_PATH = pkgs.clang + "/bin/clang++"; 
    # A bug in the nixpkgs openjdk (#29151) makes us resort to Zulu OpenJDK for IDEA: 
    # IDEA_JDK = pkgs.openjdk + "/lib/openjdk"; 
    # PATH = "${pkgs.jetbrains.idea-ultimate}/${idea_name}/bin:$PATH"; 
    IDEA_JDK = /usr/lib/jvm/zulu-8-amd64; 
    # IDEA_JDK = /opt/zulu8.23.0.3-jdk8.0.144-linux_x64; 
    # IDEA_JDK = /usr/lib/jvm/java-8-openjdk-amd64; 
    buildInputs = with pkgs; [ 
     ammonite 
     boehmgc 
     clang 
     emacs 
     jetbrains.idea-ultimate 
     less 
     libunwind 
     openjdk 
     re2 
     sbt 
     stdenv 
     unzip 
     zlib 
    ]; 
    }; 
} 

내가 PATH 설정 주석있다 :

idea-ultimate = buildIdea rec { 
    name = "idea-ultimate-${version}"; 
    version = "2017.2.2"; /* updated by script */ 
    description = "Integrated Development Environment (IDE) by Jetbrains, requires paid license"; 
    license = stdenv.lib.licenses.unfree; 
    src = fetchurl { 
     url = "https://download.jetbrains.com/idea/ideaIU-${version}-no-jdk.tar.gz"; 
     sha256 = "b8eb9d612800cc896eb6b6fbefbf9f49d92d2350ae1c3c4598e5e12bf93be401"; /* updated by script */ 
    }; 
    wmClass = "jetbrains-idea"; 
    update-channel = "IDEA_Release"; 
    }; 

내 괜찬 식을 다음입니다 그것은 let에서 idea_name을 얻는 것에 달려 있습니다. 흥미로운 부수적 인 메모로서, 내가 주석 처리하지 않은 상태로두면 bash을 실행할 수 없다는 것에 대해 nix-shell을 실행할 때 매우 기괴한 오류가 발생합니다. 나는 또한 letidea_name = pkgs.jetbrains.idea-ultimate.name;의 더 간단한 경우를 시도했지만 idea_namePATH 설정에 사용 된 경우 나중에 idea_name이 정의되지 않아 종료되지 않습니다.

업데이트 :

나는 nix-instantiate으로 탐구하기 시작했다, 그러나 관심의 유도가 비어 보인다 의도가 괜찬아 쉘 환경에 idea-ultimate을 얻을 경우

[nix-shell:/nix/store]$ nix-instantiate --eval --xml -E "((import <nixpkgs> {}).callPackage ./3hk87pqgl2qdqmskxbhy23cyr24q8g6s-nixpkgs-18.03pre114739.d0d905668c/nixpkgs/pkgs/applications/editors/jetbrains { }).idea-ultimate"; 


<?xml version='1.0' encoding='utf-8'?> 
<expr> 
    <derivation> 
    <repeated /> 
    </derivation> 
</expr> 
+0

나는 어설 션이 실패한 이유를 이해하기 위해'nix-shell --verbose --verbose --verbose --verbose --verbose --show-trace' 인쇄 된 정보의 양은 그 정보가 주장 값을 포함하지 않는다. – bbarker

답변

1

, 그럼 그냥 것을 포함 패키지는 buildInputs입니다. 이미 포함되어 있기 때문에 이미 귀하의 PATH에 있어야합니다.

현재, shellHook을 확장하고 PATH와 다른 변수를 내보낼 수 있습니다. 여기서 전체 bash를 사용할 수 있습니다. 왜 당신은 bash에서 그것을 할 것입니까? 덜 복사. 당신은 닉스의

IDEA_JDK = /usr/lib/jvm/zulu-8-amd64; 

를 지정하면, 파일은/usr/lib 디렉토리/JVM/줄루어-8 AMD64의 GET의 괜찬아 저장소에 복사 IDEA_JDK/nix/store에 파일을 가리 키도록 설정되어 있습니다. 그것이 당신의 의도였습니까?

괜찬 인스턴스화에 관한

:

$ nix-instantiate --eval -E 'with import <nixpkgs>{}; idea.pycharm-community.outPath'                     
"/nix/store/71jk0spr30rm4wsihjwbb1hcwwvzqr4k-pycharm-community-2017.1" 

하지만 당신은 여전히 ​​닉스에서 빈 유도 이름이 불가능로

는 또한 nitpick, assert pkgs.jetbrains.idea-ultimate.name != ""; 드롭 할 수 쌍 따옴표 (https://gist.github.com/danbst/a9fc068ff26e31d88de9709965daa2bd)를 제거해야합니다.

또 다른 nitpick. 매번 셸에서 IDE를 시작하는 것이 매우 불편할 것입니다. 일부 패키지는 개발에 사용되지만 비 -cli 응용 프로그램에서는 nix-shell이 제대로 작동하지 않음을 지정하는 것이 좋습니다. Nix GC 및 nix-shell의 가끔 문제는 말할 것도 없습니다. IDE를 전 세계적으로 또는 사용자별로 설치하는 것이 좋습니다. 장기적으로는 더 나은 솔루션입니다.


[부칙]

당신이 (dev-environment.nix)를 찾고 있습니다 :

with import <nixpkgs> { }; 

buildEnv { 
    name = "my-super-dev-env"; 
    paths = [ 
     #emacs 
     nano 
     idea.pycharm-community 
    ]; 
    buildInputs = [ makeWrapper ]; 
    postBuild = '' 
    for f in $(ls -d $out/bin/*); do 
     wrapProgram $f \ 
     --set IDEA_JDK "/path/to/zulu-jdk" \ 
     --set CLANG_PATH ... \ 
     --set CLANCPP_PATH ... 
    done 
    ''; 
} 

당신이 nix-env -if ./dev-environment.nix를 사용하여 설치합니다. 작업 공간을 오염시키지 않고 프로그램을 해당 환경으로 래핑합니다 (원하는 경우 shell hook를 사용하여 nix-shell을 사용하여 더 이상 오염시킬 수 있습니다).

+0

모든 제안을 주셔서 감사합니다! nix 표현식을 사용하여 사용자 환경을 지정할 수 있습니까? 그건 그렇고,'idea.sh'를 nix의 JDK와 다른 JDK를 사용하는 해결 방법의 일부로 직접 실행하기 위해 아이디어 경로를 얻고 싶었습니다. – bbarker

+0

@bbarker Nix에서 가능하지만 단점이 있기 때문에 까다로운 질문입니다. 내 대답에 필요한 단계를 추가 할 것입니다 – danbst

+0

고마워요! 컨테이너에서 이것을 사용하고 있습니다. 그래서 모든 것을 일시적인 환경으로 봅니다. – bbarker

관련 문제