Open6

devenv + Nix + uv (0.4.x) 色々

ピン留めされたアイテム
mkpolimkpoli

そもそものきっかけとしては、複数人にコードを配布しなければならないことになっておりますが、それらのコードには複雑で古いPython依存環境があり、また外部依存もあるので、ryeなどを使っても簡単には再現性が保証されないので、Nixを使ってみたいということでした

mkpolimkpoli

その通りにやればまず問題はなさそうですが……
https://devenv.sh/getting-started/

devenv.yamlではnixpkgsがgithub:cachix/devenv-nixpkgs/rollingとあるので、devenv.nixpkgsはstable、なんならそれよりも遅いNixチャンネルになっているようです

なので、以下のように書き換えます

devenv.yml
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
devenv.nix
{ 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;
    };
  };
}
mkpolimkpoli

Ryeのプロジェクトからuvプロジェクトの移行にはこの自動変換CLIツールを使いました。

https://github.com/lucianosrp/rye-uv

cargo install rye-uv
rye-uv pyproject.toml

すると書き換えられ、例えばtool.ryetool.uvに変わったり、virtual=truepackage=falseなどになっているようです

mkpolimkpoli

どうやら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
  '';
mkpolimkpoli

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)

https://github.com/nix-community/nix-ld/issues/46
https://github.com/NixOS/nixpkgs/issues/327854
https://github.com/NixOS/nix/issues/6665