devenv + Nix + uv (0.4.x) 色々
そもそものきっかけとしては、複数人にコードを配布しなければならないことになっておりますが、それらのコードには複雑で古いPython依存環境があり、また外部依存もあるので、ryeなどを使っても簡単には再現性が保証されないので、Nixを使ってみたいということでした
この文章やRyeの公式サイトによれば、今年2024年でRyeはAstralに管理されるようになり、さらにuvがバックエンドとして動くようになり、その上Rye自体がuvに取って代わられるようになったということなので、uvを使ってみる
その通りにやればまず問題はなさそうですが……
devenv.yaml
ではnixpkgsがgithub:cachix/devenv-nixpkgs/rolling
とあるので、devenv.nix
のpkgs
はstable、なんならそれよりも遅いNixチャンネルになっているようです
なので、以下のように書き換えます
inputs:
nixpkgs:
url: github:cachix/devenv-nixpkgs/rolling
nixpkgs-unstable:
url: github:NixOS/nixpkgs/nixpkgs-unstable
nixpkgs-python:
url: github:cachix/nixpkgs-python
inputs:
nixpkgs:
follows: nixpkgs
{ pkgs, lib, config, inputs, ... }:
let
pkgs-unstable = import inputs.nixpkgs-unstable { system = pkgs.stdenv.system; };
in {
packages = [
# pkgs.git
];
languages.python = {
enable = true;
# version = "3.12";
uv = {
enable = true;
package = pkgs-unstable.uv;
};
};
}
Ryeのプロジェクトからuvプロジェクトの移行にはこの自動変換CLIツールを使いました。
cargo install rye-uv
rye-uv pyproject.toml
すると書き換えられ、例えばtool.rye
がtool.uv
に変わったり、virtual=true
がpackage=false
などになっているようです
どうやらryeみたいにrye sync
したら自動的にvenvが作られ、依存がインストールされるわけではなく、uv sync
したあとにuv venv
で仮想環境を作り、さらにactivateしたあとに、uv pip install -r pyproject.toml
をする必要があるようです。この場合、以下のようにenterShellにそれらのコマンドをshell起動時に実行するようにします。
enterShell = ''
uv venv
source .devenv/state/venv/bin/activate
uv pip install -r pyproject.toml
'';
VSCode の integreted terminal の場合、LD_LIBRARY_PATH が code の環境を node_pty を通じて反映されてしまうので、Nix の gcc 環境と衝突して GLIBC が見つからないというエラーが出てしまい、あらゆる実行可能ファイルが実行できなくなるという問題になる
manylinux をオフにする(devenvのlanguages.python.manylinux.enable = false;
にすることで、すくなくともbashが動くようになりますが、fish の場合そもそもshellが起動できないので、大変な状況になってしまいます
/usr/bin/fish: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by /nix/store/c2yb135iv4maadia5f760b3xhbh6jh61-gcc-13.2.0-lib/lib/libstdc++.so.6)
/usr/bin/fish: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.36' not found (required by /nix/store/c2yb135iv4maadia5f760b3xhbh6jh61-gcc-13.2.0-lib/lib/libstdc++.so.6)