Chapter 01

はじめに

『Nix入門: ハンズオン編』へようこそ!

本書は『Nix入門』の後編です。前編がNixの仕組みにフォーカスして解説していたのに対し、本書は実践的な使い方をハンズオン形式で学んでいきます。

https://zenn.dev/asa1984/books/nix-introduction

本書は以下のGitHubリポジトリで管理されています。誤字や間違い、改善点があれば、IssueやPull Requestをお気軽にお寄せください。

https://github.com/asa1984/nix-zenn-articles

Nixでできること

解説に入る前にNixで何ができるのかを改めて整理しておきましょう。

1. 宣言的・再現可能なビルド + パッケージ公開

最も一般的な利用方法です。Nix言語を用いて宣言的にパッケージのビルドを定義し、ビルドを自動化します。Nixの高い再現性により、どんなに複雑なビルドでも一度Nixでビルドすることができれば何度ビルドしても同じ成果物が得られることが保証されます。

また、GitHubなど[1]でパッケージ定義を公開するだけで自由にパッケージを共有することができます。利用者はビルドの詳細を気にする必要がなく、コマンド一発でそのままパッケージをビルドすることができます。

2. 宣言的な開発環境の構築

devShellという機能で開発環境を宣言的に構築することができます。Nix言語で開発環境に導入したいパッケージやその他の設定を記述し、nix developコマンドで開発用のシェルを起動できます。

Dockerと異なり、仮想化はせずNix自体の独立性を利用するため、オーバーヘッドはありません。また、ホストシステムに既にインストールされているツール群を引き続き利用することができます。

3. ユーザー環境のパッケージマネージャとして使う

もちろん、グローバルなパッケージマネージャとして、apt, dnf, Pacman, Homebrewといったパッケージマネージャの代替として利用することもできます[2]。既存のパッケージマネージャと共存可能なため、一部だけNixで管理するという使い方も可能です。

また、Profilesによる非破壊的なパッケージ構成管理によって、インストールによる環境汚染やアンインストールによる依存関係の不整合が発生しません。

インストール/アップグレード/アンインストールを行う度にパッケージ構成を「世代」としてバージョニングするため、ユーザー環境をロールバックすることも可能です。

本書の構成

当初の案では、

Nix CLIの使い方 → Nix言語 → Nixによるビルド

というトップダウン式の構成にする予定でした。しかし、前編に対する反応と筆者自身の経験を踏まえ、学習の妨げとなる誤解を最小限にするために、

Nix言語 → Nix CLIの使い方 → Nixによるビルド

というNix言語から学習をスタートするボトムアップ式の構成に変更しました。

トップダウンに学びたい方にはZero to Nixをおすすめします。

https://zero-to-nix.com

目次

本書は以下の4つの部に分かれています。

  1. Nix言語
  2. 実践Nix
  3. ビルドユーティリティ
  4. チュートリアル

それぞれの部にはトピックに応じたセクションが含まれています。

「第1部: Nix言語」ではNix言語の基本的な書き方を学ぶと同時に、Nix言語がNixのビルドシステムとどのように連携するのかを深掘ります。続く「第2部: 実践Nix」ではNixの仕組みの解説からは一旦離れ、CLIの操作などツールとしての使い方を学びます。devShellというステキな開発環境構築機能のチュートリアルも含んでいます。

そして、「第3部: ビルドユーティリティ」でパッケージのビルドに欠かせない、Nixpkgsが提供する重要なビルドユーティリティについて学び、基礎を十分整えたところで最後に「第4部: チュートリアル」で実際にパッケージをビルドします。

前編と同様、本書も全体が連続した構成になっているので、順番通りに読み進めることをお勧めします。

前提知識

  • UNIX系システム(Linux, macOS)にある程度慣れている
  • Nix入門を読んでいる

読者は前編を読み終えているという前提のもと解説を進めていきます。まだ読んでいない方は、先に前編を読んでから本書に取り組むことをお勧めします。
ただし、前編と本書では内容にやや重複があるため、前編の以下の章は流し読み程度で大丈夫です。

一方、Chapter 01〜08は重要なので、しっかり読んでおいてください。

注意点

Nix言語の評価やコマンドの実行結果として出力されるストアパスは、読者の環境によって異なる可能性があります。ハンズオンの例で登場するストアパス文字列には「筆者の環境で導出された」という暗黙の前提が付いて回ることに留意してください。

余談

本書には【余談】から始まる見出しが何回か登場します。これは、歴史的経緯の説明、筆者の私見、関連するサードパーティーツールの紹介など、筆者が本文に含めたいと思ったものの、初学者の学習の妨げになりかねないため、あえて除外した情報をまとめたものです。適宜読み飛ばしてください。

脚注
  1. GitLabやアーカイブ形式の配布プラットフォームでも同様に公開できます。 ↩︎

  2. Nixはユーザー権限で動作するため、システムのパッケージマネージャの完全な代替は不可能です。 ↩︎