Wombat's Book of Nix 為想要實際使用 Nix 與 flakes 的開發者提供了清晰、有系統的學習路徑。書中從 Nix 語言的基礎資料型別開始,引導讀者理解如何用純函數式的思維描述建置結果,再一步步過渡到更實務的 flake 結構、nixpkgs 常用函式與實際應用案例。對於渴望穩定、可重現開發環境與可攜式部署流程的工程師來說,這本書既是入門手冊,也是實務參考。 學習 Nix 的出發點在於明白它的核心理念:描述結果而非敘述步驟。與傳統的腳本或 Dockerfile 不同,Nix 把每個包或環境定義為不可變的導出物,也就是 derivation。透過將依賴寫進語法結構中,Nix 能夠以精確的方式重現某個環境或建置產物。
Wombat 的書清楚展示了各種基本型別的用法,包括字串、整數、浮點數、布林、路徑、列表、屬性集合、函式與 derivation。熟悉這些型別後,讀者能夠快速在 REPL 中試驗表達式,透過 :t、:p 與 :b 等命令得到類型與建置資訊,這對除錯與探索非常重要。 Flakes 是近年來 Nix 生態的一大進化。雖然一度被標示為實驗性功能,但 flakes 已成為社群主流。Wombat 解釋了為何在大多數專案中採用 flakes 能帶來更強的可重現性與可移植性。flake 的三大要素為 description、inputs 與 outputs。
inputs 指定外部依賴,例如 nixpkgs 或各式工具庫;flake.lock 則把所有外部依賴的確切版本與雜湊鎖定,保證不同機器、不同時間復現相同結果。outputs 是一個函式,根據輸入回傳 devShells、packages 與 apps 等可執行資源。Wombat 的範例說明了如何使用 flake 的輸入與輸出來建立可共用的開發環境與可執行套件。 nixpkgs 提供了龐大的套件集合與實用庫。書中強調幾個實務上非常實用的函式,例如 lib.genAttrs 可以根據系統清單動態生成每個系統的輸出定義,lib.getExe 與 lib.getExe' 可以從套件中取得可執行檔的路徑,而 lib.systems.flakeExposed 列出適合被 flake 支援的系統。理解這些工具能讓你以最少重複的程式碼,為多個架構產生 devShell 與 package 定義,這在需要同時支援 x86_64 與 aarch64 等多平台時尤其重要。
實務操作部分,Wombat 以 hello-flake 的範例帶領讀者從簡單到深入。最初展示了如何用一個簡單的 shell 腳本做為可執行檔,接著示範 flake.nix 的最基本結構,說明 inputs 如何引用 nixpkgs 與輔助工具,outputs 如何透過 stdenv.mkDerivation 或 writeShellApplication 來建立包裹。範例中也示範了 apps 的定義方式,讓 nix run 有預設目標可執行。透過這些範例,讀者可以看到整個流程如何從原始碼到 Nix store,再由 nix run 或 nix shell 提供可用的執行檔。 開發環境的管理是 Nix 的核心賣點之一。Wombat 介紹了 mkShell 與 mkShellNoCC 範式,說明如何把需要的工具列入 devShells,讓所有共同開發者能以相同工具鏈開發與測試。
實務上推薦先為每個專案寫一個簡單的 flake,將所有必要的建置工具、編譯器與命令行工具列為包裝,開發者只要執行 nix develop 就能得到正確的環境。書中也示範了對腳本使用 Nix shebang 的方法,使單一腳本能自動建立所需環境,這對小工具或單檔程式非常方便。 處理語言生態特有的需求時,Wombat 以 Haskell、Python 與 Bash 為例示範如何運用語言專屬的工具。Haskell 生態建議採用 haskell-flake 或 ghcWithPackages,因為 Haskell 套件依賴複雜,直接用 ghc 與單一套件會導致找不到 module。Wombat 示範如何撰寫 cabal 檔案,並在 flake 裡面定義 haskellProjects,以便使用 cabal2nix 或 haskell-flake 提供的便利。Python 範例則展示了透過 pyproject.toml 與 setuptools 設定,再搭配 python3.withPackages 來產生可複現的 virtual environment,最後使用 buildPythonApplication 來打包為可運行的發行物。
對於 Bash 腳本,通常只要依賴少量工具,使用 mkDerivation 或 writeShellApplication 即能達成輕量級部署。 在實務排錯方面,Wombat 強調幾個常見陷阱及其解法。首先是路徑與執行檔尋找的問題; buildInputs 與 runtimeInputs 的差異會導致在建置時能找到依賴,但執行時卻找不到。針對此類情況,可以在 installPhase 中替換腳本中的命令為完整路徑,或使用 writeShellApplication 讓 Nix 自動產生包含正確 PATH 的 wrapper。另一個常見問題是字符串與路徑的混淆,例如在 Nix 語言中 6/2 若沒空白會被解析為路徑。為避免類似誤解,撰寫表達式時應保留適當空白並在 REPL 中多做測試。
對於多平台支援,Wombat 建議把系統清單抽出,使用 nixpkgs.lib.genAttrs 或 flake-utils 來為每個系統生成對應的 pkgs 與輸出。透過這種模式,可以把系統相關的 import 與配置集中管理,只要把支援的系統新增到清單中,devShells、packages 與 apps 就能自動擴展到新平台。這對於需要同時支援 macOS 與 Linux,或需要在多種 Linux 架構上打包軟體的專案,非常實用。 書中也介紹了 derivation 的運作流程與差別。理解 instantiation 與 realisation 的概念對開發者很重要:instantiate 只是評估 Nix 表達式產生 .drv 檔案,realise 是實際執行建置並把結果放到 Nix store。使用 nix repl 的 :b、nix-build 與 nix show-derivation 等命令可以觀察 derivation 的內容與建置需求,並協助診斷系統屬性不符或缺少某些特性的情況。
在生態整合面,Wombat 提醒開發者善用 flake.lock 的力量。flake.lock 能確保所有輸入的精確版本與雜湊一致,避免不同開發者或 CI 在不同時間拉到不同版本而導致不可重現的錯誤。建立與提交 flake.lock 成為團隊共同維護的習慣,能大幅提升專案的穩定性與可追溯性。 最後,Wombat 的書以大量範例與可執行步驟落地,從最簡單的 hello-flake 到較複雜的多語言範例,逐步引導讀者理解 Nix 的思維與實際應用。從設計可重現開發環境、撰寫 mkDerivation、處理 runtimePath、到使用 writeShellApplication 和 haskell-flake 等進階工具,讀者能把抽象的 Nix 概念轉為可操作的專案實踐。對於希望將環境管理從 ad hoc 移向可重現、可分享的架構的開發團隊,掌握 Wombat 提供的技巧與模式,能顯著提升協作效率與部署可靠性。
總結來說,Wombat's Book of Nix 是一本實用且務實的指南,既涵蓋基礎語法也重視實務工作流程,特別適合想要將 Nix 引入日常開發與 CI/CD 的讀者。透過閱讀並模仿書中的範例,從簡單腳本到多平台 package 的逐步練習,可以在短時間內建立起關於 Nix 與 flakes 的實作能力,並在團隊中推動可重現、可追溯的開發環境文化。 。