Как получить имя из деривации nixpkgs в выражении nix, которое будет использоваться nix-shell?

Я пишу.nix выражение для использования в основном nix-shell, Я не уверен, как это сделать. Обратите внимание, что это не на NixOS, но я не думаю, что это очень актуально.

Конкретный пример, на который я смотрю, это то, что я хочу получить это зависящее от версии имя, которое выглядит так:

  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 как это зависит от получения idea_name в let-clause. Как интересное примечание, как есть, это не перестает работать, если я оставляю это без комментария, но вызывает очень странную ошибку при выполнении 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>

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 get копируется в хранилище nix и IDEA_JDK установлен, чтобы указать на файл в /nix/store, Это было твоё намерение?

Что касается nix-instantiate:

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

но вы все равно должны удалить двойные кавычки ( https://gist.github.com/danbst/a9fc068ff26e31d88de9709965daa2bd)

Кроме того, придурок, assert pkgs.jetbrains.idea-ultimate.name != ""; может быть отброшен, так как невозможно иметь пустое имя деривации в Nix.

И еще один придурок. Скоро вам будет очень неудобно каждый раз запускать IDE из оболочки. Кажется хорошей идеей указать, что какой-то пакет используется для разработки, но 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, Это обернет ваши программы этими env vars, не загрязняя ваше рабочее пространство (вы можете загрязнить его дальше, используя nix-shell с раковиной, если хотите).

Другие вопросы по тегам