NixOS/nix.dev 教程:使用Nix打包现有软件
2025-07-10 03:07:33作者:虞亚竹Luna
前言
在软件开发中,依赖管理和软件打包一直是令人头疼的问题。Nix作为新一代的包管理系统,通过其独特的函数式方法和确定性构建机制,为解决这些问题提供了全新的思路。本教程将带你从零开始学习如何使用Nix打包现有软件。
基础概念
什么是Nix包?
在Nix生态中,一个"包"可以理解为:
- 文件和其他数据的集合
- 表示这种集合的Nix表达式(在构建前)
Nix包遵循特定的结构规范,这使得它们可以被搜索并与其他包组合使用。
准备工作
开始前请确保:
- 熟悉Unix shell和文本编辑器
- 了解基本的Nix语言语法
- 已安装Nix包管理器
第一个Nix包:Hello World
创建基础骨架
我们从最简单的Nix表达式开始:
{ stdenv }:
stdenv.mkDerivation { }
这是一个函数,接收包含stdenv
的属性集,产生一个派生(目前为空)。
添加包元数据
GNU Hello是一个经典的"Hello World"实现。我们需要添加包的基本信息:
{ stdenv, fetchzip }:
stdenv.mkDerivation {
pname = "hello";
version = "2.12.1";
src = fetchzip {
url = "https://ftp.gnu.org/gnu/hello/hello-2.12.1.tar.gz";
sha256 = ""; // 初始留空
};
}
解决构建问题
- 参数缺失问题:直接构建会报错,需要创建
default.nix
来提供参数:
let
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.05";
pkgs = import nixpkgs { config = {}; overlays = []; };
in {
hello = pkgs.callPackage ./hello.nix { };
}
- 哈希校验问题:首次构建会报哈希不匹配,Nix会提示正确的哈希值:
error: hash mismatch in fixed-output derivation
specified: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
got: sha256-1kJjhtlsAkpNB7f6tZEs+dbKd8z7KoNHyDHEJ0tmhnc=
更新正确的哈希后即可成功构建。
验证结果
构建成功后:
- 当前目录会生成
result
符号链接 - 执行程序:
./result/bin/hello
- 输出:
Hello, world!
进阶示例:打包icat工具
项目介绍
icat是一个在终端显示图像的工具,比Hello World复杂,有外部依赖。
修改基础配置
- 更新
default.nix
添加icat入口 - 创建
icat.nix
,使用fetchFromGitHub
获取源码
{ stdenv, fetchFromGitHub }:
stdenv.mkDerivation {
pname = "icat";
version = "v0.5";
src = fetchFromGitHub {
owner = "atextor";
repo = "icat";
rev = "v0.5";
sha256 = "0wyy2ksxp95vnh71ybj1bbmqd5ggp13x3mk37pzr99ljs9awy8ka";
};
}
处理依赖问题
首次构建会报缺少Imlib2.h
头文件的错误。解决方法:
- 添加imlib2到构建依赖:
{ stdenv, fetchFromGitHub, imlib2 }:
stdenv.mkDerivation {
# ...其他配置...
buildInputs = [ imlib2 ];
}
- 后续构建又报缺少
X11/Xlib.h
,需要添加X11库:
buildInputs = [ imlib2 libX11 ];
依赖查找技巧
在Nix生态中查找依赖包的方法:
-
使用search.nixos.org:
- 搜索关键词如"x11"
- 在左侧筛选xorg包集
-
本地代码搜索:
nix-shell -p git ripgrep git clone https://github.com/NixOS/nixpkgs --depth 1 cd nixpkgs rg "x11 =" pkgs
-
查看Nixpkgs源码结构:
libX11
通常位于xorg
包集中- 可以通过
xorg.libX11
引用
调试技巧
- 阅读错误信息:Nix会提供详细的错误信息,包括缺失的文件和依赖
- 逐步添加依赖:从最直接的错误开始,逐步解决每个依赖问题
- 使用nix-shell:进入包含所有构建工具的环境进行手动测试
- 查看完整日志:
nix log /nix/store/...drv
查看完整构建日志
总结
通过本教程,你学会了:
- 创建基本的Nix包定义
- 处理不同来源的源代码获取
- 解决构建过程中的依赖问题
- 在Nix生态中查找所需依赖包
Nix的强大之处在于其可重复性和确定性构建。虽然初次打包可能会遇到各种问题,但一旦解决,这些构建配方就可以在任何Nix环境中可靠地重现。
随着经验的积累,你会发现Nix能够解决传统打包方式中许多棘手的问题,如依赖冲突、环境不一致等。希望本教程为你开启了Nix打包之旅的大门!