Nix 是一款软件包管理器/构建工具,侧重于可重现的构建环境
介绍
- Nix 是一种采用独特方法来包装管理和系统配置的工具
- Nixpkgs 是 Nix 包管理器对应的软件发行版,使用 Nix 函数式语言编写,除软件包外提供用于软件定制、构建、开发环境配置的工具
- NixOS 是一个基于 Nix 和 Nixpkgs 的 GNU/Linux 发行版
- 在 Nixpkgs 中的软件之上 NixOS 使用 Nix 语言提供了声明式的系统配置,实现系统完整可复现、版本快速切换等功能
- devenv 使用 Nix 构建快速、声明式、可重现和可组合的开发人员环境
安装 Nix
在大多数 Linux 发行版上,你可以通过以下命令安装 Nix:
# Linux、Mac
curl -L https://nixos.org/nix/install | sh
curl -L https://nixos.org/nix/install | sh -s -- --daemon
# 根据提示操作。安装完成后,需要 source 一下 ~/.nix-profile/etc/profile.d/nix.sh
# 或者重新启动终端,让环境变量生效。
# 通常会提示你运行:
. "$HOME/.nix-profile/etc/profile.d/nix.sh"
# 验证安装
$ nix --version
nix (Nix) 2.29.0修改配置文件,在 ~/.config/nix/nix.conf (local install) 中添加 /etc/nix/nix.conf
experimental-features = nix-command flakesnix 提供的相关命令如下:
nix nix-collect-garbage nix-env nix-prefetch-url
nix-build nix-copy-closure nix-hash nix-shell
nix-channel nix-daemon nix-instantiate nix-store临时环境 (nix-shell 或 nix develop/run)
Nix 最有用的特性之一是创建隔离的、临时的开发环境,而无需污染你的全局系统。
快速运行一个命令
使用 nix run 可以临时运行一个软件包中的命令,而无需实际安装它。
# 临时运行 cowsay 命令
$ nix run nixpkgs#cowsay hello world
_____________
< hello world >
-------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
# 临时运行 go 命令并查看版本
$ nix run nixpkgs#go -- version
go version go1.24.3 linux/amd64说明:
- 这里的
nixpkgs#cowsay是 Flake 语法,表示从nixpkgs这个 flake 中获取cowsay软件包 - 相关的包,会从 https://cache.nixos.org 下载
进入一个临时 shell 环境
nix shell(旧版为 nix-shell)允许你进入一个临时 shell,该 shell 包含指定的软件包及其依赖。当你退出 shell 后,这些软件包就会从环境中消失。
# 临时进入一个包含 git 和 neovim 的 shell
nix shell nixpkgs#git nixpkgs#neovim
# 在这个 shell 里,你可以使用 git 和 nvim
git --version
nvim --version
# 退出 shell
exit
# 退出后,git 和 nvim 就不可用了使用 Flake – 现代 Nix 实践
Flakes 是 Nix 的现代构建系统,旨在提高可复现性和可用性,它通过 flake.nix 文件来声明项目的输入和输出。
创建一个简单的 flake.nix 文件
在一个项目目录下创建一个 flake.nix 文件,例如:
{
description = "A simple development environment for a Go project";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11"; # 使用稳定的 nixpkgs 分支
# 或者 nixpkgs.url = "nixpkgs"; 如果你想使用默认的 channel
};
outputs = { self, nixpkgs }: {
devShells.default = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; # 根据你的系统架构调整
modules = [{
environment.systemPackages = with nixpkgs.legacyPackages.x86_64-linux; [
go # Go 语言工具链
gopls # Go LSP 服务器
git # Git
delve # Go 调试器
];
}];
};
};
}进入开发 shell
在包含 flake.nix 文件的项目目录下,运行:
nix develop这会进入一个 shell 环境,其中包含 flake.nix 中声明的所有工具(Go、Git 等)。
c. 运行项目命令:
如果你的 flake.nix 包含一个 apps 部分,你可以直接运行项目中的命令:
# flake.nix (添加一个简单的 app 示例)
{
description = "A simple development environment for a Go project";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11";
};
outputs = { self, nixpkgs }: {
devShells.default = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [{
environment.systemPackages = with nixpkgs.legacyPackages.x86_64-linux; [
go
gopls
git
delve
];
}];
};
apps.hello-go = {
type = "app";
program = "${nixpkgs.legacyPackages.x86_64-linux.go}/bin/go run ./main.go"; # 假设有一个 main.go 文件
};
};
}然后,在项目目录下运行:
# 假设你有一个 main.go 文件,内容是简单的 Go 程序
nix run .#hello-go基本包管理
Nix 的包管理命令与传统包管理器略有不同
搜索软件包
使用 nix search 命令来查找软件包。Nix 会在本地缓存中搜索,你也可以使用 -u 参数更新缓存。
nix search hello # 搜索包含 "hello" 的软件包
nix search -u firefox # 搜索 firefox 并更新缓存输出会显示软件包的名称及其描述,例如:
* nixpkgs.hello (hello-2.12)
The GNU Hello program这里 nixpkgs.hello 就是软件包的完整属性路径。
b. 安装软件包:
使用 nix-env -iA 来安装软件包到当前用户的 ~/.nix-profile。
nix-env -iA nixpkgs.hello # 安装 GNU hello
nix-env -iA nixpkgs.git # 安装 Git
nix-env -iA nixpkgs.neovim # 安装 Neovim安装后,你可以直接运行它们:
hello
git --version
nvim --versionc. 列出已安装软件包:
nix-env -q # 列出当前用户环境中所有已安装的软件包d. 升级软件包:
nix-env -u # 升级所有已安装的软件包
nix-env -u firefox # 升级指定软件包 (如果 firefox 已经安装)e. 卸载软件包:
nix-env -e hello # 卸载 GNU hellof. 回滚到上一版本:
这是 Nix 的一个强大特性。每次安装、升级或卸载都会创建一个新的“世代”(generation)。
nix-env --rollback # 回滚到上一个世代
nix-env --switch-generation 1 # 切换到指定世代(例如世代1)
nix-env --list-generations # 查看所有世代你会看到类似这样的输出:
1 2024-01-01 10:00:00 (current) installed nixpkgs.hello
2 2024-01-02 11:00:00 installed nixpkgs.git nixpkgs.hello--rollback 会切换到上一个带有 (current) 标记的世代。
F&Q
error: the group ’nixbld’ specified in ‘build-users-group’ does not exist
- 参考 安装时出现上述错误,使用如下命令安装
curl -L https://nixos.org/nix/install | sh -s -- --daemon