Chapter 09
§5. Flakeのoutputs
outputsのスキーマ
技術的にはflake.nix
のoutputsには任意のNix式を記述することができますが、実際は標準のスキーマに則っていることが望ましいです。使い方や詳しい挙動は第2部: 実践Nixで解説します。
CLIが利用するattribute
Nixのコマンドの多くはflake.nix
をエントリーポイントとしてNix式を評価します。その際、コマンドによってoutputsのどのattributeを利用するかが決まっています。
flake.nixのoutputs
outputs = { ... }:
{
# `nix build <flake-url>#name`でビルド
packages."<プラットフォーム>"."<パッケージ名>" = <Derivation>;
# `nix build <flake-url>`でビルド
packages."<プラットフォーム>".default = <Derivation>;
# Nixpkgsで使われているattribute
# packagesとほぼ同じ
legacyPackages."<プラットフォーム>"."<パッケージ名>" = <Derivation>;
# `nix run `<flake-url>#<name>`で実行
apps."<プラットフォーム>"."<パッケージ名>" = {
type = "app";
program = "<ストアパス>";
};
# `nix run `<flake-url>`で実行
apps."<プラットフォーム>".default = <Derivation>;
# `nix fmt`で実行
formatter."<プラットフォーム>" = <Derivation>;
# `nix develop <flake-url>#<name>`でNixシェルを起動
devShells."<プラットフォーム>"."<name>" = <Derivation>;
# `nix develop <flake-url>`でNixシェルを起動
devShells."<プラットフォーム>".default = <Derivation>;
# `nix flake check`で実行
checks."<プラットフォーム>"."<name>" = <Derivation>;
# `nix flake init -t <flake>#<name>`でテンプレートを使う
templates."<name>" = {
path = "<ストアパス>";
description = "templateの説明文";
};
# `nix flake init -t <flake>`でテンプレートを使う
templates.default = ...
}
Nix言語から利用するattribute
Nix言語からflake.nix
をインポートする際に利用するattributeです。Overlayに関しては、2.4. Overlaysで解説します。
flake.nixのoutputs
outputs = { ... }:
{
# derivation以外の汎用的なNix言語ライブラリ
# CLIからは利用せず、Nix式としてインポートする
lib.<name> = <任意のNix式>;
# Overlay
# CLIからは利用せず、Nix式としてインポートする
overlays."<name>" = final: prev: { };
}
Nix以外のツールが利用するattribute
Nix以外のツールが独自のattributeを要求することがあります。
flake.nixのoutputs
outputs = { ... }:
{
# NixOS
## `sudo nixos-rebuild switch --flake .#<hostname>`でNixOSの設定を適用
nixosConfigurations."<hostname>" = {};
## NixOS module
nixosModules."<name>" = { config, ... }: { options = {}; config = {}; };
# home-manager
## home-managerの設定
homeConfigurations = {
"<ユーザー名@ホスト名>" = ...
};
## home-manager module
homeManagerModules = # home-managerのモジュール
# Hydra
## Hydraのジョブセット
hydraJobs."<AttrSet>"."<プラットフォーム>" = derivation;
# deploy-rs
deploy.nodes.<name> = # デプロイノード
}