首页
/ NixOS/nix.dev 教程:使用Nix打包现有软件

NixOS/nix.dev 教程:使用Nix打包现有软件

2025-07-10 03:07:33作者:虞亚竹Luna

前言

在软件开发中,依赖管理和软件打包一直是令人头疼的问题。Nix作为新一代的包管理系统,通过其独特的函数式方法和确定性构建机制,为解决这些问题提供了全新的思路。本教程将带你从零开始学习如何使用Nix打包现有软件。

基础概念

什么是Nix包?

在Nix生态中,一个"包"可以理解为:

  1. 文件和其他数据的集合
  2. 表示这种集合的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 = "";  // 初始留空
  };
}

解决构建问题

  1. 参数缺失问题:直接构建会报错,需要创建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 { };
}
  1. 哈希校验问题:首次构建会报哈希不匹配,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复杂,有外部依赖。

修改基础配置

  1. 更新default.nix添加icat入口
  2. 创建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头文件的错误。解决方法:

  1. 添加imlib2到构建依赖:
{ stdenv, fetchFromGitHub, imlib2 }:

stdenv.mkDerivation {
  # ...其他配置...
  buildInputs = [ imlib2 ];
}
  1. 后续构建又报缺少X11/Xlib.h,需要添加X11库:
buildInputs = [ imlib2 libX11 ];

依赖查找技巧

在Nix生态中查找依赖包的方法:

  1. 使用search.nixos.org

    • 搜索关键词如"x11"
    • 在左侧筛选xorg包集
  2. 本地代码搜索

    nix-shell -p git ripgrep
    git clone https://github.com/NixOS/nixpkgs --depth 1
    cd nixpkgs
    rg "x11 =" pkgs
    
  3. 查看Nixpkgs源码结构

    • libX11通常位于xorg包集中
    • 可以通过xorg.libX11引用

调试技巧

  1. 阅读错误信息:Nix会提供详细的错误信息,包括缺失的文件和依赖
  2. 逐步添加依赖:从最直接的错误开始,逐步解决每个依赖问题
  3. 使用nix-shell:进入包含所有构建工具的环境进行手动测试
  4. 查看完整日志nix log /nix/store/...drv查看完整构建日志

总结

通过本教程,你学会了:

  1. 创建基本的Nix包定义
  2. 处理不同来源的源代码获取
  3. 解决构建过程中的依赖问题
  4. 在Nix生态中查找所需依赖包

Nix的强大之处在于其可重复性和确定性构建。虽然初次打包可能会遇到各种问题,但一旦解决,这些构建配方就可以在任何Nix环境中可靠地重现。

随着经验的积累,你会发现Nix能够解决传统打包方式中许多棘手的问题,如依赖冲突、环境不一致等。希望本教程为你开启了Nix打包之旅的大门!