如何使用rust-overlay配置稳定版、测试版和 nightly 版Rust?
rust-overlay是一个纯且可复现的Nix覆盖层,用于打包二进制分发的Rust工具链。它是nixpkgs-mozilla的兼容替代品,提供了非覆盖层和Nix Flake接口,帮助开发者轻松配置稳定版、测试版和nightly版Rust环境。
快速了解rust-overlay
rust-overlay的核心优势在于预获取工具链组件的哈希值,确保评估过程纯净且无需网络访问。这些哈希值通过GitHub Actions每日自动更新,支持从1.29.0开始的稳定版本以及2024-01-01之后的nightly版本。目前主要支持x86_64-linux平台的nixos-unstable和受支持的NixOS发行版。
安装rust-overlay
经典Nix覆盖层安装
你可以将以下代码添加到~/.config/nixpkgs/overlays.nix文件中:
[ (import (builtins.fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz")) ]
然后通过nix命令安装Rust工具链:
$ nix-env -iA nixpkgs.rust-bin.stable.latest.default
或者,你也可以将其添加到nix通道:
$ nix-channel --add https://github.com/oxalica/rust-overlay/archive/master.tar.gz rust-overlay
$ nix-channel --update
之后,你可以在nix shell环境中使用它,例如:import <nixpkgs> { overlays = [ (import <rust-overlay>) ]; }。
Nix Flakes安装
对于快速体验,只需使用nix shell命令即可将最新的稳定Rust工具链带入环境:
$ nix shell github:oxalica/rust-overlay
$ rustc --version
$ cargo --version
配置不同版本的Rust
配置稳定版Rust
使用以下代码获取最新的稳定版Rust默认配置文件:
rust-bin.stable.latest.default
如果你只需要rustc、cargo和rust-std等核心组件,可以选择最小配置文件:
rust-bin.stable.latest.minimal
若需要特定版本的稳定版Rust,例如1.48.0:
rust-bin.stable."1.48.0".default
配置测试版(Beta)Rust
获取最新的测试版Rust默认配置文件:
rust-bin.beta.latest.default
同样,你也可以选择最小配置文件:
rust-bin.beta.latest.minimal
指定测试版日期,例如2021-01-01:
rust-bin.beta."2021-01-01".default
配置Nightly版Rust
为避免某些组件缺失导致构建失败,建议使用selectLatestNightlyWith函数选择最新的可用nightly版本:
rust-bin.selectLatestNightlyWith (toolchain: toolchain.default)
或者选择最小配置文件:
rust-bin.selectLatestNightlyWith (toolchain: toolchain.minimal)
如果你需要特定日期的nightly版本,例如2020-12-31:
rust-bin.nightly."2020-12-31".default
高级配置
添加额外组件或目标支持
你可以通过覆盖(override)来添加额外的组件或目标支持。例如,为最新稳定版添加"rust-src"组件和"arm-unknown-linux-gnueabihf"目标:
rust-bin.stable.latest.default.override {
extensions = [ "rust-src" ];
targets = [ "arm-unknown-linux-gnueabihf" ];
}
从rust-toolchain文件导入配置
如果你已有rustup的rust-toolchain文件,可以使用fromRustupToolchainFile函数直接导入配置:
rust-bin.fromRustupToolchainFile ./rust-toolchain
特定rustc git修订版的工具链
对于需要特定rustc git修订版的场景,例如开发MIRI等Rust组件,可以使用fromRustcRev函数:
rust-bin.fromRustcRev {
rev = "a2cd91ceb0f156cb442d75e12dc77c3d064cdde4";
components = {
rustc = "sha256-x+OkPVStX00AiC3GupIdGzWluIK1BnI4ZCBbg72+ZuI=";
rust-src = "sha256-13PpzzYtd769Xkb0QzHpNfYCOnLMWFolc9QyYq98z2k=";
};
}
在NixOS配置中使用
以下是在NixOS配置中使用rust-overlay的示例:
{
description = "My configuration";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { nixpkgs, rust-overlay, ... }: {
nixosConfigurations = {
hostname = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix # 你的系统配置
({ pkgs, ... }: {
nixpkgs.overlays = [ rust-overlay.overlays.default ];
environment.systemPackages = [ pkgs.rust-bin.stable.latest.default ];
})
];
};
};
};
}
在开发环境中使用
使用nix develop创建一个包含默认beta Rust工具链的开发环境:
{
description = "A devShell example";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
rust-overlay.url = "github:oxalica/rust-overlay";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, rust-overlay, flake-utils, ... }:
flake-utils.lib.eachDefaultSystem (system:
let
overlays = [ (import rust-overlay) ];
pkgs = import nixpkgs {
inherit system overlays;
};
in
{
devShells.default = with pkgs; mkShell {
buildInputs = [
openssl
pkg-config
eza
fd
rust-bin.beta.latest.default
];
shellHook = ''
alias ls=eza
alias find=fd
'';
};
}
);
}
从nixpkgs-mozilla迁移
- 将通道URL更改为
https://github.com/oxalica/rust-overlay/archive/master.tar.gz,或对于Nix Flakes,将URL更改为github:oxalica/rust-overlay。 latest.*、rustChannel*.*等属性与nixpkgs-mozilla兼容,无需其他更改。- 你也可以选择迁移到
rust-bin接口,以获得更多功能,如"特定组件可用的最新nightly"或"从rust-toolchain文件导入"。
通过以上步骤,你可以轻松配置和管理不同版本的Rust工具链,满足各种开发需求。详细的API参考请参见docs/reference.md,交叉编译相关内容请参见docs/cross_compilation.md。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



