身為長年的 Linux 使用者,你是否覺得維護作業系統環境是一大困擾?無論是那些套件服務的組態相依、或者那堆針對各個程式打的 patch,這些散落各處、無法被管理或重現的設定是否讓你徹夜難眠:哪天要搬系統怎麼辦?環境壞了是不是很難修?會不會有人偷偷動了我的設定?
又或者你是開發者,常常苦於為新機器設定開發環境都要花上近一整天、或是不同專案倚賴於不同系統套件不知道該如何解決。
Nix 或許可以解決你的煩惱!本議程將簡單介紹 Nix 套件管理工具以及 NixOS 的基本概念:Nix Store、Nix Language、Nix Derivation、Nixpkgs、NixOS、nix-env,來看看 "Purely Functional"、"Declarative" 的 Nix 套件管理工具以及 NixOS 如何解決系統環境問題吧!
個人套件集與 NixOS 設定檔:
- https://github.com/zetavg/nix-packages
- https://github.com/zetavg/nixos-configs
## 參考資料
- [Nix Pills](https://nixos.org/nixos/nix-pills/)
個人最推薦的入門指南,共有 20 篇短篇文章,從安裝、基本使用、原理,一路涵蓋到語言、如何寫套件、一些架構和設計模式,不僅教你如何用 Nix,讀完之後還能任意暴改你的系統以及包裝你自己的 package。
- [Continuous integration for iOS with Nix and Buildkite - Pinterest Engineering](https://medium.com/@Pinterest_Engineering/continuous-integration-for-ios-with-nix-and-buildkite-ef5b36c5292d)
Pinterest 的工程師分享他們如何用 Nix 來統一他們 mobile app 在開發者的機器以及 CI 上的環境,並用 [Buildkite](https://buildkite.com/) 這套 CI Interface as a Service 來打造他們的 CI 環境。
- [Nix: Haskell Concepts for Package Management - HackerNoon.com](https://hackernoon.com/nix-haskell-concepts-for-package-management-65830ac89659)
介紹 Nix 如何利用 Functional、Declarative 的特性,解決傳統系統環境容易被污染、無法版本控管等問題,也提出了每次都要從原始碼編譯很耗時(但我想 binary cache 可以解決這個問題,現在也有很方便的 binary cache as a service,CI 也可以用 Hydra 來獨立測試每個單元,因此除了像是 node 的 npm 一個程式 depend on 數千個 package 會造成就算有 cache 但用正常的方式 handle 數千個 deps 的計算量就很大會慢之外,不算太大的問題)的問題。
- [Eelco Dolstra 在荷蘭烏特勒支大學的博士論文](https://nixos.org/~eelco/pubs/phd-thesis.pdf)
是 Nix 套件管理工具的前身 ([Nix Community - Academia - NixOS Wiki](https://nixos.wiki/wiki/Nix_Community#Academia)) 。
- [Cheatsheet - NixOS Wiki](https://nixos.wiki/index.php?title=Cheatsheet&useskin=vector)
- [How we use Nix at IOHK - Input Output](https://iohk.io/blog/how-we-use-nix-at-iohk/)
## 社群
- [r/NixOS on Reddit](https://www.reddit.com/r/NixOS/)