Чтобы создать свою виртуальную среду с помощью Nix Flake, мне нужно добавить несколько пакетов Python, которых нет в менеджере пакетов Nix. У меня проблема с установкой "jina-hubble-sdk"
я бегу
nix develop
в каталоге, содержащем flake.nix, это выглядит так:
{ description = "Python environment with ollama";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils, ... }:
flake-utils.lib.eachDefaultSystem (system: let
pkgs = nixpkgs.legacyPackages.${system};
# Define Python package jina-hubble-sdk
jina-hubble-sdk = with pkgs.python3Packages;
buildPythonPackage rec {
pname = "jina-hubble-sdk";
version = "0.39.0";
src = pkgs.fetchPypi {
inherit pname version;
sha256 = "9021417794a6d3cf3fad8a880cf668a3a986b9d53d5be5fa391aae1767a5b9b0";
};
nativeBuildInputs = [
];
propagatedBuildInputs = [
pip
requests
aiohttp
rich
importlib-metadata
filelock
pathspec
docker
pyyaml
python-jose
];
};
# Define Python environment with necessary packages
pythonEnv = pkgs:
pkgs.python3.withPackages (ps:
with ps; [
jina-hubble-sdk # Include jina in the environment
]);
in {
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
curl
(pythonEnv pkgs)
];
};
}); }
и я получаю следующее сообщение об ошибке:
ошибка: строитель для '/nix/store/d4ncmq68cjksfzdhz2klsrr1wm5jm9aj-python3.11-jina-hubble-sdk-0.39.0.drv' ошибка с кодом выхода 1; последние 10 строк журнала: > os.mkdir(сам, режим) > PermissionError: [Errno 13] Разрешение отклонено: '/homeless-shelter' > > > -------------------------------------------------- --------------------- > Провёл 1 тест за 0,002 с. > > ОШИБКА (ошибка=1) > Тест не пройден: <unittest.runner.TextTestResult run=1 ошибки=1 ошибки=0> > ошибка: тест не пройден: <unittest.runner.TextTestResult run=1 ошибки=1 сбои=0> Чтобы просмотреть полные журналы, запустите nix-store -l /nix/store/d4ncmq68cjksfzdhz2klsrr1wm5jm9aj-python3.11-jina-hubble-sdk-0.39.0.drv. ошибка: 1 зависимости вывода '/nix/store/5p0ffk9xjmb3zx73d1gzab0pjngmasbh-python3-3.11.8-env.drv' не удалось построить ошибку: 1 зависимости деривации '/nix/store/g9qd2rvp2fkbz47mzbjnqzlfnkk6hvjm-nix-shell-env.drv' не удалось строить
Он взят из jina-hubble-sdk-0.39.0.drv. Я прочитал это сообщение, в котором говорится о похожей проблеме и говорится о HOME и TMPDIR. Поэтому я даю вам их ценность в среде, аналогичной той, которую я хочу создать.
$HOME
bash: /home/nixos: это каталог
$TMPDIR
bash: /tmp/nix-shell.QHZzjA: Это каталог
(кстати, по какой причине вы используете $HOME
вместо чего-то вроде echo "$HOME"
или declare -p HOME
или тому подобного?)
... однако еще раз внесем ясность: вам нужно изменить значение HOME в производной версии, запускающей сборку, а не в вашей личной оболочке. /home/nixos
, конечно, не ценность ДОМА в застройщике — застройщик использует /homeless-shelter
специально. Эта изоляция предотвращает проникновение деталей среды пользователя, запросившего сборку, в собираемое программное обеспечение.
Попробуйте прочитать nix show-derivation /nix/store/d4ncmq68cjksfzdhz2klsrr1wm5jm9aj-python3.11-jina-hubble-sdk-0.39.0.drv
, если хотите увидеть переменные среды и шаги сборки, использованные во время конкретной сборки, которая не удалась.
Обратите внимание: вам не нужны poetry-core
в качестве входных данных для сборки этого пакета Python, поскольку он не входит в состав Poetry.
@ЧарльзДаффи. У меня нет особой причины использовать $HOME вместо другого. Разве что немного короче
@LoïcReynier Ты прав. Вы знаете, что это результат копирования другого пакета Python, созданного с помощью peotry. я удалю это
Как подчеркивается в комментариях Чарльза Даффи, настройка переменной $HOME
необходима в процессе сборки, а не в вашей среде.
В nixpkgs
, когда сборке пакета нужен доступный для записи домашний адрес, мы обычно используем export HOME=$(mktemp -d)
. Чтобы избежать конфликта с предварительно настроенными пакетами buildPhase
для Python, вам следует экспортировать переменную на этапе preBuild
:
src = { ... };
preBuild = ''
export HOME=$(mktemp -d)
'';
nativeBuildInputs = [ ... ];
вы можете увидеть полную версию вашего решения здесь stackoverflow.com/questions/78183326/…. (Я использовал preConfig, но когда я тестировал, это не имело никакого значения). Это все равно не работает, но по другой причине.
К вашему сведению, вы можете пропустить export
-- установку нового значения для любой переменной, уже существующей в среде, это значение экспортируется автоматически; так что просто HOME=$(mktemp -d)
достаточно. (Тем не менее, я предпочитаю HOME=$PWD
в производных Nix - снижает вероятность того, что изменение временного каталога проникнет в ваши сборки и нарушит двоичную воспроизводимость).
Сборки происходят в песочнице; они не могут ничего изменить за пределами этой песочницы, поэтому у них нет действительных домашних каталогов; по этой причине домашний каталог, который вы установили снаружи, не копируется в среду, в которой выполняется сборка. Вы, конечно, можете установить HOME самостоятельно из кода, выполняющего сборку, указав его на место, доступное для записи из песочницы —
HOME=$PWD
это очень распространенная практика.