Flakes/ja: Difference between revisions
Created page with "Nix flakesはNixのプロジェクトに一定の構造を強制し、ロックファイルを用いて依存するプロジェクトのバージョンを指定することでより便利に再現可能なNix式を記述できるようにします。" |
No edit summary Tags: Mobile edit Mobile web edit |
||
(40 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
<languages /> | |||
'''Nix flakes''' は [https://nixos.org/manual/nix/stable/contributing/experimental-Features.html 試験的な機能] で Nix 2.4 で導入されました。 ([https://nixos.org/manual/nix/unstable/release-notes/rl-2.4.html リリースノートを参照してください])。 | '''Nix flakes''' は [https://nixos.org/manual/nix/stable/contributing/experimental-Features.html 試験的な機能] で Nix 2.4 で導入されました。 ([https://nixos.org/manual/nix/unstable/release-notes/rl-2.4.html リリースノートを参照してください])。 | ||
< | <span id="Introduction"></span> | ||
==== | ====概要==== | ||
Nix flakesはNixのプロジェクトに一定の構造を強制し、ロックファイルを用いて依存するプロジェクトのバージョンを指定することでより便利に再現可能なNix式を記述できるようにします。 | Nix flakesはNixのプロジェクトに一定の構造を強制し、ロックファイルを用いて依存するプロジェクトのバージョンを指定することでより便利に再現可能なNix式を記述できるようにします。 | ||
* [https://nixos.org/manual/nix/unstable/command-ref/new-cli/nix3-flake.html#description Flake]とは<code>flake.nix</code>というのNixファイルをルートに持つファイルシステムツリーを指します。 | |||
* | |||
* | * <code>flake.nix</code>ファイルの内容は、Nix言語でパッケージとその依存関係を宣言するための統一された命名スキーマに従っています。 | ||
* | |||
* | * Flakeは外部のソースを指定するために[https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#flake-references URLのような構文]を提供しています。 | ||
* | |||
* | * 長いURL構文を簡易にするために[https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-registry.html Flakeはレジストリを使用]して短い記号として登録できます。 | ||
* また、Flakesは参照(Gitのrefsの事)とバージョンを固定することができ、それらをプログラムによって照会したり更新したりすることができます。 | |||
* [https://nixos.org/manual/nix/stable/command-ref/new-cli/nix.html 実験的なコマンドラインインタフェース]はFlakeの参照を受け取りパッケージのビルド、実行やデプロイができます。 | |||
< | <span id="Enable_flakes_temporarily"></span> | ||
==== | ====flakesを一時的に有効にする==== | ||
任意の<code>nix</code>コマンドを使用する場合は、次のコマンドラインオプションを追加します: | |||
<syntaxhighlight lang="shell"> | <syntaxhighlight lang="shell"> | ||
--experimental-features 'nix-command flakes' | --experimental-features 'nix-command flakes' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
< | <span id="Enable_flakes_permanently_in_NixOS"></span> | ||
==== | ====NixOSでflakesを永続的に有効にする==== | ||
[[Overview_of_the_NixOS_Linux_distribution#Declarative_Configuration system configuration |NixOS configuration]]に以下を追加します | |||
<syntaxHighlight lang=nix> | <syntaxHighlight lang=nix> | ||
nix.settings.experimental-features = [ "nix-command" "flakes" ]; | nix.settings.experimental-features = [ "nix-command" "flakes" ]; | ||
</syntaxHighlight> | </syntaxHighlight> | ||
< | <span id="Other_Distros,_with_Home-Manager"></span> | ||
===== | =====その他ディストリビューション、Home-Managerあり===== | ||
home-managerの設定に以下を追加します: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
nix.settings.experimental-features = [ "nix-command" "flakes" ]; | nix.settings.experimental-features = [ "nix-command" "flakes" ]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
< | <span id="Other_Distros,_without_Home-Manager"></span> | ||
===== | =====その他ディストリビューション、Home-Managerなし===== | ||
{{注記: | [https://github.com/DeterminateSystems/nix-installer Determinate Nix Installer]ではデフォルトでflakesを有効化しています。}} | |||
{{ | |||
次の内容を<code>~/.config/nix/nix.conf</code>または<code>/etc/nix/nix.conf</code>に追記してください: | |||
<syntaxHighlight lang=text> | <syntaxHighlight lang=text> | ||
experimental-features = nix-command flakes | experimental-features = nix-command flakes | ||
</syntaxHighlight> | </syntaxHighlight> | ||
< | <span id="Basic_Usage_of_Flake"></span> | ||
=== | ===基本的なFlakeの使用方法=== | ||
この時点でnixコマンドを実行する前に、以下の2つの警告に注意してください。1つは暗号化に関するもの、もう1つはgitに関するものです。 | |||
< | <span id="Encryption_WARNING"></span> | ||
====暗号化に関する警告==== | |||
</ | |||
{{Warning | flakeファイルの内容は世界的に読み取り可能なNix storeフォルダにコピーされるため、暗号化されていない機密情報はflakeファイルに置かないでください。代わりに[[Comparison of secret managing schemes|secret managing scheme]]を使うべきです。}} | |||
< | <span id="Git_WARNING"></span> | ||
====Gitに関する警告==== | |||
</ | |||
Gitリポジトリ内のフレークでは、作業ツリー内のファイルのみがNix storeにコピーされます。 | |||
したがって、flakeに<code>git</code>を使用する場合は、プロジェクトファイルを作成した後、必ず<code>git add</code>を実行してください。 | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 102: | Line 77: | ||
</div> | </div> | ||
< | <span id="Generate_flake.nix_file"></span> | ||
==== | ====flake.nixファイルを生成する==== | ||
基本的な方法でFlakeを使い始めるにはプロジェクトディレクトリでflakeコマンドを実行します: | |||
<syntaxHighlight lang=text> | <syntaxHighlight lang=text> | ||
nix flake init | nix flake init | ||
</syntaxHighlight> | </syntaxHighlight> | ||
== Flake schema == | == Flake schema == | ||
< | flake.nixファイルはNixファイルですが、特殊な制限が設けられています(これについては後述します)。 | ||
</ | Flakeは4つのトップレベルアトリビュートを持ちます: | ||
* <code>description</code>はflakeを説明する文字列です。 | |||
* <code>inputs</code>はflakeの依存関係をアトリビュートセットとして記述したものです。下にスキーマを記述しています。 | |||
* <code>outputs</code>はすべてのrealizeされたinputを受け取り、下に記述されたスキーマのようにアトリビュートセットを返す関数です。 | |||
< | * <code>nixConfig</code>は[https://nixos.org/manual/nix/stable/command-ref/conf-file.html nix.confに使用できる値]を反映しています。これを用いてこのflake特有の設定を反映させることができます。例としてバイナリキャッシュを設定できます。 | ||
</ | |||
< | <span id="Input_schema"></span> | ||
=== Input スキーマ === | |||
[https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#flake-inputs Nixのflake inputsのマニュアル]. | |||
[https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#flake-references Nix flake referencesのマニュアル]. | |||
[https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#flake-references | |||
inputsアトリビュートはflakeの依存関係を定義します。例えば、システムflakeではシステムをビルドするためにnixpkgsに依存しています。 | |||
Nixpkgsは以下のコードで定義できます: | |||
<code>inputs.nixpkgs.url = "github:NixOS/nixpkgs/<branch name>";</code> | <code>inputs.nixpkgs.url = "github:NixOS/nixpkgs/<branch name>";</code> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 164: | Line 121: | ||
</div> | </div> | ||
<code>inputs.hyprland.url = "github:hyprwm/Hyprland";</code> | <code>inputs.hyprland.url = "github:hyprwm/Hyprland";</code> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
If you want to make Hyprland follow the nixpkgs input to avoid having multiple versions of nixpkgs, this can be done using the following code: | If you want to make Hyprland follow the nixpkgs input to avoid having multiple versions of nixpkgs, this can be done using the following code: | ||
</div> | </div> | ||
<code>inputs.hyprland.inputs.nixpkgs.follows = "nixpkgs";</code> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Using curly brackets({}), we can shorten all of this and put it in a table. The code will look something like this: | |||
</div> | </div> | ||
<syntaxhighlight lang="nix"> | |||
inputs = { | inputs = { | ||
nixpkgs.url = "github:NixOS/nixpkgs/<branch name>"; | nixpkgs.url = "github:NixOS/nixpkgs/<branch name>"; | ||
Line 186: | Line 142: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
=== Output schema === | |||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
This is described in the nix package manager [https://github.com/NixOS/nix/blob/master/src/nix/flake-check.md src/nix/flake-check.md]. | This is described in the nix package manager [https://github.com/NixOS/nix/blob/master/src/nix/flake-check.md src/nix/flake-check.md]. | ||
</div> | </div> | ||
Line 203: | Line 161: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
* <code><system></code> is something like "x86_64-linux", "aarch64-linux", "i686-linux", "x86_64-darwin" | * <code><system></code> is something like "x86_64-linux", "aarch64-linux", "i686-linux", "x86_64-darwin" | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* <code><name></code> is an attribute name like "hello". | * <code><name></code> is an attribute name like "hello". | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* <code><flake></code> is a flake name like "nixpkgs". | * <code><flake></code> is a flake name like "nixpkgs". | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* <code><store-path></code> is a <code>/nix/store..</code> path | * <code><store-path></code> is a <code>/nix/store..</code> path | ||
</div> | </div> | ||
<syntaxHighlight lang=nix> | <syntaxHighlight lang=nix> | ||
{ self, ... }@inputs: | { self, ... }@inputs: | ||
Line 225: | Line 191: | ||
# Executed by `nix run . -- <args?>` | # Executed by `nix run . -- <args?>` | ||
apps."<system>".default = { type = "app"; program = "..."; }; | apps."<system>".default = { type = "app"; program = "..."; }; | ||
# Formatter (alejandra, nixfmt or nixpkgs-fmt) | |||
# Formatter (alejandra, nixfmt or nixpkgs-fmt) | |||
formatter."<system>" = derivation; | formatter."<system>" = derivation; | ||
# Used for nixpkgs packages, also accessible via `nix build .#<name>` | # Used for nixpkgs packages, also accessible via `nix build .#<name>` | ||
Line 258: | Line 222: | ||
} | } | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 266: | Line 229: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
==== nix run ==== | ==== nix run ==== | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
When output <code>apps.<system>.myapp</code> is not defined, <code>nix run myapp</code> runs <code><packages or legacyPackages.<system>.myapp>/bin/<myapp.meta.mainProgram or myapp.pname or myapp.name (the non-version part)></code> | When output <code>apps.<system>.myapp</code> is not defined, <code>nix run myapp</code> runs <code><packages or legacyPackages.<system>.myapp>/bin/<myapp.meta.mainProgram or myapp.pname or myapp.name (the non-version part)></code> | ||
</div> | </div> | ||
Line 281: | Line 247: | ||
</div> | </div> | ||
<syntaxHighlight lang=nix> | <syntaxHighlight lang=nix> | ||
(import ( | (import ( | ||
Line 291: | Line 256: | ||
}).defaultNix | }).defaultNix | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 297: | Line 261: | ||
</div> | </div> | ||
<syntaxHighlight lang=nix> | <syntaxHighlight lang=nix> | ||
inputs.flake-compat = { | inputs.flake-compat = { | ||
Line 304: | Line 267: | ||
}; | }; | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 310: | Line 272: | ||
</div> | </div> | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
(import ( | (import ( | ||
Line 325: | Line 286: | ||
) { src = ./.; }).defaultNix | ) { src = ./.; }).defaultNix | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 345: | Line 305: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
* fetchurl and fetchtar [https://github.com/NixOS/nix/blob/36c4d6f59247826dde32ad2e6b5a9471a9a1c911/src/libexpr/primops/fetchTree.cc#L201 require] a sha256 argument to be considered pure. | * fetchurl and fetchtar [https://github.com/NixOS/nix/blob/36c4d6f59247826dde32ad2e6b5a9471a9a1c911/src/libexpr/primops/fetchTree.cc#L201 require] a sha256 argument to be considered pure. | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* builtins.currentSystem is non-hermetic and impure. This can usually be avoided by passing the system (i.e., x86_64-linux) explicitly to derivations requiring it. | * builtins.currentSystem is non-hermetic and impure. This can usually be avoided by passing the system (i.e., x86_64-linux) explicitly to derivations requiring it. | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* Imports from channels like <code><nixpkgs></code> can be made pure by instead importing from the <code>output</code> function in <code>flake.nix</code>, where the arguments provide the store path to the flake's inputs: | * Imports from channels like <code><nixpkgs></code> can be made pure by instead importing from the <code>output</code> function in <code>flake.nix</code>, where the arguments provide the store path to the flake's inputs: | ||
</div> | </div> | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
outputs = { self, nixpkgs, ... }: | outputs = { self, nixpkgs, ... }: | ||
Line 361: | Line 326: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 391: | Line 355: | ||
</div> | </div> | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
{ | { | ||
Line 403: | Line 366: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
If you want to pass on the flake inputs to external configuration files, you can use the <code>specialArgs</code> attribute: | If you want to pass on the flake inputs to external configuration files, you can use the <code>specialArgs</code> attribute: | ||
</div> | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
{ | { | ||
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-unstable; | inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-unstable; | ||
inputs.home-manager.url = github:nix-community/home-manager; | inputs.home-manager.url = github:nix-community/home-manager; | ||
outputs = { self, nixpkgs, ... }@inputs: { | |||
outputs = { self, nixpkgs, ... }@inputs: { | |||
nixosConfigurations.fnord = nixpkgs.lib.nixosSystem { | nixosConfigurations.fnord = nixpkgs.lib.nixosSystem { | ||
specialArgs = { inherit inputs; }; | specialArgs = { inherit inputs; }; | ||
Line 419: | Line 384: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
Then, you can access the flake inputs from the file <code>configuration.nix</code> like this: | Then, you can access the flake inputs from the file <code>configuration.nix</code> like this: | ||
</div> | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
{ config, lib, inputs, ... }: { | { config, lib, inputs, ... }: { | ||
Line 427: | Line 396: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 433: | Line 402: | ||
</div> | </div> | ||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
$ sudo nixos-rebuild switch --flake . | $ sudo nixos-rebuild switch --flake . | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 443: | Line 410: | ||
</div> | </div> | ||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
$ sudo nixos-rebuild switch --flake /etc/nixos#joes-desktop | $ sudo nixos-rebuild switch --flake /etc/nixos#joes-desktop | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
To switch a remote host you can use: | To switch a remote host you can use: | ||
</div> | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
$ nixos-rebuild --flake .#mymachine \ | $ nixos-rebuild --flake .#mymachine \ | ||
Line 457: | Line 424: | ||
switch | switch | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 467: | Line 433: | ||
</div> | </div> | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
{ inputs, ... }: | { inputs, ... }: | ||
Line 476: | Line 441: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 482: | Line 446: | ||
</div> | </div> | ||
<syntaxHighlight lang=nix> | <syntaxHighlight lang=nix> | ||
nix.registry = { | nix.registry = { | ||
Line 495: | Line 458: | ||
}; | }; | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 513: | Line 475: | ||
</div> | </div> | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
{ | { | ||
Line 520: | Line 481: | ||
pkgs.mkShell { | pkgs.mkShell { | ||
packages = [ pkgs.nixfmt ]; | packages = [ pkgs.nixfmt ]; | ||
shellHook = '' | |||
shellHook = '' | |||
# ... | # ... | ||
''; | ''; | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 538: | Line 496: | ||
</div> | </div> | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
{ | { | ||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; | inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; | ||
outputs = | |||
outputs = | |||
{ nixpkgs, ... }: | { nixpkgs, ... }: | ||
{ | { | ||
/* | /* | ||
This example assumes your system is x86_64-linux | This example assumes your system is x86_64-linux | ||
change as neccesary | change as neccesary | ||
Line 565: | Line 520: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 595: | Line 549: | ||
</div> | </div> | ||
https://docs.cachix.org/pushing#flakes | https://docs.cachix.org/pushing#flakes | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 615: | Line 567: | ||
</div> | </div> | ||
<syntaxHighlight lang=console> | <syntaxHighlight lang=console> | ||
$ nix build .#hello | $ nix build .#hello | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 629: | Line 579: | ||
</div> | </div> | ||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
nix build '.?submodules=1#hello' | nix build '.?submodules=1#hello' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 645: | Line 593: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
A NixOS config flake could be as follows: | A NixOS config flake could be as follows: | ||
</div> | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
{ | { | ||
description = "NixOS configuration with two or more channels"; | description = "NixOS configuration with two or more channels"; | ||
inputs = { | |||
inputs = { | |||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11"; | nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11"; | ||
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; | nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; | ||
}; | }; | ||
outputs = | |||
outputs = | |||
{ nixpkgs, nixpkgs-unstable, ... }: | { nixpkgs, nixpkgs-unstable, ... }: | ||
{ | { | ||
Line 681: | Line 627: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
# NixOS configuration.nix, can now use "pkgs.package" or "pkgs.unstable.package" | # NixOS configuration.nix, can now use "pkgs.package" or "pkgs.unstable.package" | ||
Line 694: | Line 638: | ||
# ... | # ... | ||
} | } | ||
</syntaxhighlight>If the variable <code>nixpkgs</code> points to the flake, you can also define <code>pkgs</code> with overlays with: | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
If the variable <code>nixpkgs</code> points to the flake, you can also define <code>pkgs</code> with overlays with: | |||
</div> | </div> | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
pkgs = import nixpkgs { system = "x86_64-linux"; overlays = [ /*the overlay in question*/ ]; }; | pkgs = import nixpkgs { system = "x86_64-linux"; overlays = [ /*the overlay in question*/ ]; }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 711: | Line 656: | ||
</div> | </div> | ||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
$ nix repl | $ nix repl | ||
nix-repl> :lf /path/to/flake | nix-repl> :lf /path/to/flake | ||
Added 18 variables. | Added 18 variables. | ||
nix-repl> nixosConfigurations.myHost.config.networking.hostName | nix-repl> nixosConfigurations.myHost.config.networking.hostName | ||
"myHost" | "myHost" | ||
</syntaxhighlight> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
However, this won't be instant upon evaluation if any file changes have been done since your last configuration rebuild. Instead, if one puts: | |||
</div> | </div> | ||
<syntaxHighlight lang=nix> | |||
nix.nixPath = let path = toString ./.; in [ "repl=${path}/repl.nix" "nixpkgs=${inputs.nixpkgs}" ]; | nix.nixPath = let path = toString ./.; in [ "repl=${path}/repl.nix" "nixpkgs=${inputs.nixpkgs}" ]; | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 741: | Line 679: | ||
</div> | </div> | ||
<syntaxHighlight lang=nix> | <syntaxHighlight lang=nix> | ||
let | let | ||
Line 754: | Line 691: | ||
// flake.nixosConfigurations | // flake.nixosConfigurations | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 761: | Line 697: | ||
</div> | </div> | ||
<syntaxHighlight lang=bash> | <syntaxHighlight lang=bash> | ||
source /etc/set-environment && nix repl $(echo $NIX_PATH | perl -pe 's|.*(/nix/store/.*-source/repl.nix).*|\1|')</syntaxHighlight> | source /etc/set-environment && nix repl $(echo $NIX_PATH | perl -pe 's|.*(/nix/store/.*-source/repl.nix).*|\1|')</syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 772: | Line 706: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
An alternative approach to the above shell alias is omitting <code>repl</code> from <code>nix.nixPath</code> and creating a shell script: | An alternative approach to the above shell alias is omitting <code>repl</code> from <code>nix.nixPath</code> and creating a shell script: | ||
</div> | |||
<syntaxHighlight lang=nix> | <syntaxHighlight lang=nix> | ||
nix.nixPath = [ "nixpkgs=${inputs.nixpkgs}" ]; | nix.nixPath = [ "nixpkgs=${inputs.nixpkgs}" ]; | ||
Line 784: | Line 720: | ||
]; | ]; | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 796: | Line 731: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
== Development tricks == | == Development tricks == | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
=== Build a package added in a PR === | === Build a package added in a PR === | ||
</div> | |||
<syntaxHighlight> | <syntaxHighlight> | ||
nix build github:nixos/nixpkgs?ref=pull/<PR_NUMBER>/head#<PACKAGE> | nix build github:nixos/nixpkgs?ref=pull/<PR_NUMBER>/head#<PACKAGE> | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
this allows building a package that has not yet been added to nixpkgs. | this allows building a package that has not yet been added to nixpkgs. | ||
</div> | </div> | ||
Line 805: | Line 747: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
note that this will download a full source tarball of nixpkgs. if you already have a local clone, using that may be faster due to delta compression: | note that this will download a full source tarball of nixpkgs. if you already have a local clone, using that may be faster due to delta compression: | ||
</div> | |||
<syntaxHighlight> | <syntaxHighlight> | ||
git fetch upstream pull/<PR_NUMBER>/head && git checkout FETCH_HEAD && nix build .#PACKAGE | git fetch upstream pull/<PR_NUMBER>/head && git checkout FETCH_HEAD && nix build .#PACKAGE | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
this allows building a package that has not yet been added to nixpkgs. | this allows building a package that has not yet been added to nixpkgs. | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
=== How to add a file locally in git but not include it in commits === | === How to add a file locally in git but not include it in commits === | ||
</div> | </div> | ||
Line 816: | Line 765: | ||
</div> | </div> | ||
<syntaxHighlight> | <syntaxHighlight> | ||
git add --intent-to-add extra/flake.nix | git add --intent-to-add extra/flake.nix | ||
git update-index --skip-worktree --assume-unchanged extra/flake.nix | git update-index --skip-worktree --assume-unchanged extra/flake.nix | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
=== Rapid iteration of a direct dependency === | |||
</div> | </div> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
One common pain point with using Nix as a development environment is the need to completely rebuild dependencies and re-enter the dev shell every time they are updated. The <code>nix develop --redirect <flake> <directory></code> command allows you to provide a mutable dependency to your shell as if it were built by Nix. | One common pain point with using Nix as a development environment is the need to completely rebuild dependencies and re-enter the dev shell every time they are updated. The <code>nix develop --redirect <flake> <directory></code> command allows you to provide a mutable dependency to your shell as if it were built by Nix. | ||
</div> | </div> | ||
Line 832: | Line 782: | ||
</div> | </div> | ||
<syntaxHighlight lang=bash> | <syntaxHighlight lang=bash> | ||
cd ~/libdep-src-checkout/ | cd ~/libdep-src-checkout/ | ||
Line 840: | Line 789: | ||
installPhase # install it like nix does | installPhase # install it like nix does | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
Now that you've built the dependency, <code>consumexe</code> can take it as an input. '''In another terminal''': | Now that you've built the dependency, <code>consumexe</code> can take it as an input. '''In another terminal''': | ||
</div> | |||
<syntaxHighlight lang=bash> | <syntaxHighlight lang=bash> | ||
cd ~/consumexe-src-checkout/ | cd ~/consumexe-src-checkout/ | ||
Line 847: | Line 800: | ||
# Output should show ~/libdep-src-checkout/ so you know it worked | # Output should show ~/libdep-src-checkout/ so you know it worked | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
If Nix warns you that your redirected flake isn't actually used as an input to the evaluated flake, try using the <code>--inputs-from .</code> flag. If all worked well you should be able to <code>buildPhase && installPhase</code> when the dependency changes and rebuild your consumer with the new version ''without'' exiting the development shell. | If Nix warns you that your redirected flake isn't actually used as an input to the evaluated flake, try using the <code>--inputs-from .</code> flag. If all worked well you should be able to <code>buildPhase && installPhase</code> when the dependency changes and rebuild your consumer with the new version ''without'' exiting the development shell. | ||
</div> | </div> | ||
Line 856: | Line 811: | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
* [https://nix.dev/concepts/flakes Flakes] - nix.dev | * [https://nix.dev/concepts/flakes Flakes] - nix.dev | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://github.com/NixOS/rfcs/pull/49 RFC 49] (2019) - Original flakes specification | * [https://github.com/NixOS/rfcs/pull/49 RFC 49] (2019) - Original flakes specification | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://jade.fyi/blog/flakes-arent-real/ Flakes aren't real and can't hurt you] (Jade Lovelace, 2024) | * [https://jade.fyi/blog/flakes-arent-real/ Flakes aren't real and can't hurt you] (Jade Lovelace, 2024) | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://github.com/ryan4yin/nixos-and-flakes-book NixOS & Flakes Book](Ryan4yin, 2023) - 🛠️ ❤️ An unofficial NixOS & Flakes book for beginners. | * [https://github.com/ryan4yin/nixos-and-flakes-book NixOS & Flakes Book](Ryan4yin, 2023) - 🛠️ ❤️ An unofficial NixOS & Flakes book for beginners. | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://xeiaso.net/blog/nix-flakes-1-2022-02-21 Nix Flakes: an Introduction] (Xe Iaso, 2022) | * [https://xeiaso.net/blog/nix-flakes-1-2022-02-21 Nix Flakes: an Introduction] (Xe Iaso, 2022) | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://serokell.io/blog/practical-nix-flakes Practical Nix Flakes] (Alexander Bantyev, 2021) - Intro article on working with Nix and Flakes | * [https://serokell.io/blog/practical-nix-flakes Practical Nix Flakes] (Alexander Bantyev, 2021) - Intro article on working with Nix and Flakes | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://www.tweag.io/blog/2020-05-25-flakes/ Nix Flakes, Part 1: An introduction and tutorial] (Eelco Dolstra, 2020) | * [https://www.tweag.io/blog/2020-05-25-flakes/ Nix Flakes, Part 1: An introduction and tutorial] (Eelco Dolstra, 2020) | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://www.tweag.io/blog/2020-06-25-eval-cache/ Nix Flakes, Part 2: Evaluation caching] (Eelco Dolstra, 2020) | * [https://www.tweag.io/blog/2020-06-25-eval-cache/ Nix Flakes, Part 2: Evaluation caching] (Eelco Dolstra, 2020) | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://www.tweag.io/blog/2020-07-31-nixos-flakes/ Nix Flakes, Part 3: Managing NixOS systems] (Eelco Dolstra, 2020) | * [https://www.tweag.io/blog/2020-07-31-nixos-flakes/ Nix Flakes, Part 3: Managing NixOS systems] (Eelco Dolstra, 2020) | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://nixos.org/manual/nix/unstable/command-ref/new-cli/nix3-flake.html Nix flake command reference manual] - Many additional details about flakes, and their parts. | * [https://nixos.org/manual/nix/unstable/command-ref/new-cli/nix3-flake.html Nix flake command reference manual] - Many additional details about flakes, and their parts. | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://www.youtube.com/watch?v=QXUlhnhuRX4&list=PLgknCdxP89RcGPTjngfNR9WmBgvD_xW0l Nix flakes 101: Introduction to nix flakes] (Jörg Thalheim, 2020) | * [https://www.youtube.com/watch?v=QXUlhnhuRX4&list=PLgknCdxP89RcGPTjngfNR9WmBgvD_xW0l Nix flakes 101: Introduction to nix flakes] (Jörg Thalheim, 2020) | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://github.com/NixOS/nix/blob/master/src/nix/flake.md spec describing flake inputs in more detail] | * [https://github.com/NixOS/nix/blob/master/src/nix/flake.md spec describing flake inputs in more detail] | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://github.com/numtide/flake-utils flake-utils: Library to avoid some boiler-code when writing flakes] | * [https://github.com/numtide/flake-utils flake-utils: Library to avoid some boiler-code when writing flakes] | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://zimbatm.com/NixFlakes/#direnv-integration zimbat's direnv article] | * [https://zimbatm.com/NixFlakes/#direnv-integration zimbat's direnv article] | ||
</div> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
* [https://github.com/nix-community/todomvc-nix building Rust and Haskell flakes] | * [https://github.com/nix-community/todomvc-nix building Rust and Haskell flakes] | ||
</div> | </div> | ||
[[Category:Software]] | [[Category:Software]] | ||
[[Category:Nix]] | [[Category:Nix]] | ||
[[Category:Flakes]] | [[Category:Flakes]] | ||