Как получить имя из деривации 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
, Я также попробовал более простой случай let
idea_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
с раковиной, если хотите).