第 10 章:Nix 包管理 - 进阶
学习目标
- 学会创建自定义包
- 理解 Flakes
- 掌握跨平台开发
10.1 创建自定义包
简单的包定义
创建 default.nix:
{ pkgs ? import <nixpkgs> {} }:
pkgs.stdenv.mkDerivation {
pname = "myapp";
version = "1.0";
src = ./.;
buildInputs = [ pkgs.gcc ];
buildPhase = ''
gcc -o myapp main.c
'';
installPhase = ''
mkdir -p $out/bin
cp myapp $out/bin/
'';
}
构建:
nix-build
./result/bin/myapp
10.2 Nix Flakes
Flakes 是 Nix 的新特性,提供更好的可复现性。
启用 Flakes
mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
创建 flake.nix
{
description = "XUPTArch development environment";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs = { self, nixpkgs }: {
devShells.x86_64-linux.default =
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in pkgs.mkShell {
buildInputs = [ pkgs.gcc pkgs.gnumake ];
};
};
}
使用:
nix develop
10.3 跨平台支持
{
outputs = { self, nixpkgs }:
let
systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" ];
forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
in {
devShells = forAllSystems (system:
let pkgs = nixpkgs.legacyPackages.${system};
in {
default = pkgs.mkShell {
buildInputs = [ pkgs.gcc ];
};
}
);
};
}
实践练习
- 创建一个自定义包
- 使用 Flakes 管理项目
- 添加跨平台支持