【问题标题】:How to get the name from a nixpkgs derivation in a nix expression to be used by nix-shell?如何从 nix-shell 使用的 nix 表达式中的 nixpkgs 派生中获取名称?
【发布时间】:2018-02-20 07:09:50
【问题描述】:

我正在编写一个主要供nix-shell 使用的.nix 表达式。我不知道该怎么做。请注意,这不在 NixOS 上,但我认为这不是很相关。

我正在查看的特定示例是,我想获得如下所示的 this version-dependent name:

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

我的 nix 表达式如下:

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,因为它取决于在let 子句中获取idea_name。作为一个有趣的旁注,如果我不加注释,这不会失败,但在执行nix-shell 时会导致一个非常奇怪的错误,因为无法执行bash。我也尝试过更简单的letidea_name = pkgs.jetbrains.idea-ultimate.name; 案例,但后来在设置idea_name 时使用PATH 时失败,因为idea_name 最终未定义。

更新:

我开始用nix-instantiate探索,但兴趣的推导似乎是空的:

[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>

【问题讨论】:

  • 我也尝试使用 nix-shell --verbose --verbose --verbose --verbose --verbose --verbose --show-trace 之类的东西来了解断言失败的原因,但尽管打印了大量信息,但这些信息并不包括断言值。

标签: nix nixpkgs


【解决方案1】:

如果您的意图是让idea-ultimate 进入nix-shell 环境,那么只需将该包包含到buildInputs。我看到它已经包含在内,所以它应该已经出现在您的 PATH 中。

顺便说一句,您可以扩展您的 shellHook 并导出 PATH 和其他变量,而不是从那里获得完整的 bash。你为什么要从 bash 做呢?少抄袭。当你指定

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

在 Nix 中,文件 /usr/lib/jvm/zulu-8-amd64 被复制到 nix 存储区,IDEA_JDK 设置为指向 /nix/store 中的文件。这是你的意图吗?

关于 nix 实例化:

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

但您仍然需要删除双引号 (https://gist.github.com/danbst/a9fc068ff26e31d88de9709965daa2bd)

另外,nitpick,assert pkgs.jetbrains.idea-ultimate.name != ""; 可以被删除,因为在 Nix 中不可能有空的派生名称。

还有一个挑剔的。您很快就会发现每次都从 shell 启动 IDE 非常不方便。指定某些包用于开发似乎是个好主意,但nix-shell 不适用于非 cli 应用程序。更不用说 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 挂钩的 nix-shell 进一步污染它)。

【讨论】:

  • 感谢所有建议!是否可以使用 nix 表达式来指定用户环境?顺便说一句,我想获得想法路径,以便直接运行idea.sh,作为使用与 nix 中的不同的 JDK 不同的 JDK 的解决方法的一部分。
  • @bbarker 这是一个棘手的问题,因为虽然在 Nix 中是可能的,但它有缺点。然后我会在我的答案中添加必要的步骤
  • 谢谢!我在容器中使用它,所以在某种程度上我将整个事物视为瞬态环境。
猜你喜欢
  • 2019-11-17
  • 2019-11-22
  • 1970-01-01
  • 2017-11-28
  • 2017-03-24
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多