nix 安装第三方工具
1. 全局安装(非 devShell,但系统级可用)
如果你希望这个工具不是只在 dev 里而是所有用户 shell 直接能用:
用 nix profile install 安装 nixpkgs 里的版本(如果有):
nix profile add nixpkgs#uv
然后在 /etc/profile.d/
里确保 ~/.nix-profile/bin
或 global profile bin
在 PATH 里。
2. 最常见(也是推荐):把工具加到 flake 的 buildInputs 里
如果那个工具在 nixpkgs
里有打包(比如 ripgrep / htop / fd / bat / curl
等),直接在你的 flake.nix
的 mkShell
里加:
buildInputs = with pkgs; [
rustup
go
python313
python313Packages.pip
ripgrep # 举例:rg
bat # 美化的 cat
htop
];
保存后再进:
nix develop /etc/nix/devflake#default
3. 如果工具不是 nixpkgs 里有(例如某些 GitHub release 的 prebuilt 二进制,比如你说的 uv,假设它是一个单一可执行文件)
你可以在 flake.nix 里添加一个自定义 derivation,把二进制 fetch 下来并包装进 shell。
下面是一个完整示例:假设我们要引入一个 GitHub release 里压缩的 uv 可执行(改成实际 URL/版本):
{
description = "Dev shell with Rust, Go, Python 3.13 and external uv binary";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
outputs = { self, nixpkgs, ... }@inputs:
let
system = "x86_64-linux";
pkgs = import nixpkgs { inherit system; };
uvBinary = pkgs.stdenv.mkDerivation {
pname = "uv";
version = "vX.Y.Z"; # 你实际的版本
src = pkgs.fetchurl {
url = "https://github.com/yourorg/uv/releases/download/vX.Y.Z/uv-linux-x64.tar.gz"; # 改成真实下载地址
sha256 = "0000000000000000000000000000000000000000000000000000"; # 用 nix-prefetch-url 拿真实 sha256
};
buildInputs = [ pkgs.tar ];
unpackPhase = ''
mkdir -p $out/bin
tar -xzf $src -C /tmp
# 假设解压后有 uv 可执行
cp /tmp/uv-linux-x64/uv $out/bin/
chmod +x $out/bin/uv
'';
buildPhase = "true"; # 因为我们手动处理在 unpackPhase
installPhase = "true";
};
in
{
devShells = {
"${system}" = {
default = pkgs.mkShell {
buildInputs = with pkgs; [
rustup
go
python313
python313Packages.pip
uvBinary # 我们自己打包好的 uv
];
shellHook = ''
export RUSTUP_HOME=$HOME/.rustup
export CARGO_HOME=$HOME/.cargo
if [ -f "$HOME/.cargo/env" ]; then . "$HOME/.cargo/env"; fi
'';
};
};
};
};
}
拿到真实 sha256 的方法(一次性用临时命令):
# 使用此命令
nix-prefetch-url --type sha256 https://github.com/forkdo/m3u8-downloader/releases/download/250731/m3u8-downloader_250731_linux_amd64.tar.gz
# 此处有问题
nix-prefetch-url --unpack https://github.com/yourorg/uv/releases/download/vX.Y.Z/uv-linux-x64.tar.gz
它会打印一个 hash,把那个填到上面 sha256
里。
4. 临时快速做法(不修改 flake,用 shellHook 下载)
如果你只是临时需要某个二进制、不想再改 flake
,可以在 shellHook
里加一段下载逻辑,比如:
shellHook = ''
export RUSTUP_HOME=$HOME/.rustup
export CARGO_HOME=$HOME/.cargo
if [ -f "$HOME/.cargo/env" ]; then . "$HOME/.cargo/env"; fi
if [ ! -x "$HOME/.local/bin/uv" ]; then
mkdir -p $HOME/.local/bin
curl -L -o $HOME/.local/bin/uv https://github.com/yourorg/uv/releases/download/vX.Y.Z/uv-linux-x64
chmod +x $HOME/.local/bin/uv
fi
export PATH=$HOME/.local/bin:$PATH
'';
这样每次 dev
进入会确保 uv
在 ~/.local/bin
并在 PATH 里。