Nix 使用介绍

发布时间: 更新时间: 总字数:1536 阅读时间:4m 作者: IP:上海 网址

Nix 是一款软件包管理器/构建工具,侧重于可重现的构建环境

介绍

  • Nix 是一种采用独特方法来包装管理和系统配置的工具
  • Nixpkgs 是 Nix 包管理器对应的软件发行版,使用 Nix 函数式语言编写,除软件包外提供用于软件定制、构建、开发环境配置的工具
  • NixOS 是一个基于 Nix 和 Nixpkgs 的 GNU/Linux 发行版
    • 在 Nixpkgs 中的软件之上 NixOS 使用 Nix 语言提供了声明式的系统配置,实现系统完整可复现、版本快速切换等功能
  • devenv 使用 Nix 构建快速、声明式、可重现和可组合的开发人员环境

安装 Nix

在大多数 Linux 发行版上,你可以通过以下命令安装 Nix:

bash
# 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 flakes

nix 提供的相关命令如下:

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 可以临时运行一个软件包中的命令,而无需实际安装它。

bash
# 临时运行 cowsay 命令
$ nix run nixpkgs#cowsay hello world
 _____________
< hello world >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

# 临时运行 go 命令并查看版本
$ nix run nixpkgs#go -- version
go version go1.24.3 linux/amd64

说明:

  1. 这里的 nixpkgs#cowsay 是 Flake 语法,表示从 nixpkgs 这个 flake 中获取 cowsay 软件包
  2. 相关的包,会从 https://cache.nixos.org 下载

进入一个临时 shell 环境

nix shell(旧版为 nix-shell)允许你进入一个临时 shell,该 shell 包含指定的软件包及其依赖。当你退出 shell 后,这些软件包就会从环境中消失。

bash
# 临时进入一个包含 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 文件,例如:

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 文件的项目目录下,运行:

bash
nix develop

这会进入一个 shell 环境,其中包含 flake.nix 中声明的所有工具(Go、Git 等)。

c. 运行项目命令:

如果你的 flake.nix 包含一个 apps 部分,你可以直接运行项目中的命令:

nix
# 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 文件
    };
  };
}

然后,在项目目录下运行:

bash
# 假设你有一个 main.go 文件,内容是简单的 Go 程序
nix run .#hello-go

基本包管理

Nix 的包管理命令与传统包管理器略有不同

搜索软件包

使用 nix search 命令来查找软件包。Nix 会在本地缓存中搜索,你也可以使用 -u 参数更新缓存。

bash
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

bash
nix-env -iA nixpkgs.hello      # 安装 GNU hello
nix-env -iA nixpkgs.git        # 安装 Git
nix-env -iA nixpkgs.neovim     # 安装 Neovim

安装后,你可以直接运行它们:

bash
hello
git --version
nvim --version

c. 列出已安装软件包:

bash
nix-env -q                     # 列出当前用户环境中所有已安装的软件包

d. 升级软件包:

bash
nix-env -u                     # 升级所有已安装的软件包
nix-env -u firefox             # 升级指定软件包 (如果 firefox 已经安装)

e. 卸载软件包:

bash
nix-env -e hello               # 卸载 GNU hello

f. 回滚到上一版本:

这是 Nix 的一个强大特性。每次安装、升级或卸载都会创建一个新的“世代”(generation)。

bash
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
本文总阅读量 次 本站总访问量 次 本站总访客数