mirror of
https://github.com/ryan4yin/nixos-and-flakes-book.git
synced 2024-11-25 09:33:10 +01:00
feat: finish 'usage of flakes'
This commit is contained in:
parent
02cb15d169
commit
3fe5fb1fa3
@ -2,6 +2,19 @@ import { defineConfig } from 'vitepress'
|
||||
|
||||
// https://vitepress.dev/reference/site-config
|
||||
export default defineConfig({
|
||||
markdown: {
|
||||
theme: "material-theme-palenight",
|
||||
lineNumbers: true,
|
||||
|
||||
// adjust how header anchors are generated,
|
||||
// useful for integrating with tools that use different conventions
|
||||
anchor: {
|
||||
slugify(str) {
|
||||
return encodeURIComponent(str);
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
locales: {
|
||||
root: {
|
||||
label: "English",
|
||||
@ -101,6 +114,31 @@ export default defineConfig({
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
{
|
||||
text: "Other Usage of Flakes",
|
||||
items: [
|
||||
{ text: "Introduction", link: "/other-usage-of-flakes/intro.md" },
|
||||
{
|
||||
text: "Flake Inputs",
|
||||
link: "/other-usage-of-flakes/inputs.md",
|
||||
},
|
||||
{
|
||||
text: "Flake Outputs",
|
||||
link: "/other-usage-of-flakes/outputs.md",
|
||||
},
|
||||
{
|
||||
text: "The New CLI",
|
||||
link: "/other-usage-of-flakes/the-new-cli.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Advanced Topics",
|
||||
items: [
|
||||
{ text: "Introduction", link: "/zh/advanced-topics/index.md" },
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
socialLinks: [
|
||||
@ -188,7 +226,7 @@ export default defineConfig({
|
||||
{
|
||||
text: "Nixpkgs 高级用法",
|
||||
items: [
|
||||
{ text: "Introduction", link: "/zh/nixpkgs/intro.md" },
|
||||
{ text: "介绍", link: "/zh/nixpkgs/intro.md" },
|
||||
{ text: "callPackage", link: "/zh/nixpkgs/callpackage.md" },
|
||||
{ text: "Overridding", link: "/zh/nixpkgs/override.md" },
|
||||
{ text: "Overlays", link: "/zh/nixpkgs/overlays.md" },
|
||||
@ -214,11 +252,25 @@ export default defineConfig({
|
||||
},
|
||||
{
|
||||
text: "Flakes 的其他玩法",
|
||||
items: [{ text: "快速入门", link: "/zh/nixpkgs/index.md" }],
|
||||
items: [
|
||||
{ text: "介绍", link: "/zh/other-usage-of-flakes/intro.md" },
|
||||
{
|
||||
text: "Flake Inputs",
|
||||
link: "/zh/other-usage-of-flakes/inputs.md",
|
||||
},
|
||||
{
|
||||
text: "Flake Outputs",
|
||||
link: "/zh/other-usage-of-flakes/outputs.md",
|
||||
},
|
||||
{
|
||||
text: "The New CLI",
|
||||
link: "/zh/other-usage-of-flakes/the-new-cli.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "其他进阶话题",
|
||||
items: [{ text: "快速入门", link: "/zh/nixpkgs/index.md" }],
|
||||
items: [{ text: "介绍", link: "/zh/advanced-topics/index.md" }],
|
||||
},
|
||||
],
|
||||
|
||||
@ -231,4 +283,4 @@ export default defineConfig({
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
@ -22,3 +22,6 @@ And many other useful community projects to explore, here are some of them:
|
||||
- [nixos-generator](https://github.com/nix-community/nixos-generators): generate iso/qcow2/... from nixos configuration
|
||||
- [lanzaboote](https://github.com/nix-community/lanzaboote): enable secure boot for NixOS
|
||||
- [impermanence](https://github.com/nix-community/impermanence): used to make NixOS stateless, to imporve the reproduciability of NixOS system.
|
||||
|
||||
|
||||
[digga]: https://github.com/divnix/digga
|
@ -3,7 +3,6 @@ Nix is powerful and flexible, it provides a lot of ways to do things, making it
|
||||
Here are some best practices that I've learned from the community, hope it can help you.
|
||||
|
||||
|
||||
## 4.
|
||||
## References
|
||||
|
||||
- [Tips&Tricks for NixOS Desktop - NixOS Discourse][Tips&Tricks for NixOS Desktop - NixOS Discourse]
|
||||
|
@ -56,3 +56,6 @@ $ fhs
|
||||
## References
|
||||
|
||||
- [Tips&Tricks for NixOS Desktop - NixOS Discourse][Tips&Tricks for NixOS Desktop - NixOS Discourse]: Just as the title says, it is a collection of tips and tricks for NixOS desktop.
|
||||
|
||||
|
||||
[Tips&Tricks for NixOS Desktop - NixOS Discourse]: https://discourse.nixos.org/t/tips-tricks-for-nixos-desktop/28488
|
@ -1,148 +0,0 @@
|
||||
|
||||
## VII. Usage of Nix Flakes
|
||||
|
||||
Up to now, we have written a lot of configuration with Flakes to manage NixOS. Here is a brief introduction to the more detailed content of the Flakes, as well as the new command lines commonly used with flakes.
|
||||
|
||||
### 1. Flake inputs {#flake-inputs}
|
||||
|
||||
The `inputs` in `flake.nix` is a attribute set, used to specify the dependencies of the current flake, there are many types of `inputs`, for example:
|
||||
|
||||
```nix
|
||||
{
|
||||
inputs = {
|
||||
# use master branch of the GitHub repository as input, this is the most common input format
|
||||
nixpkgs.url = "github:Mic92/nixpkgs/master";
|
||||
# Git URL, can be used for any Git repository based on https/ssh protocol
|
||||
git-example.url = "git+https://git.somehost.tld/user/path?ref=branch&rev=fdc8ef970de2b4634e1b3dca296e1ed918459a9e";
|
||||
# The above example will also copy .git, use this for (shallow) local Git repos
|
||||
git-directory-example.url = "git+file:/path/to/repo?shallow=1";
|
||||
# Local directories (for absolute paths you can omit 'path:')
|
||||
directory-example.url = "path:/path/to/repo";
|
||||
|
||||
bar = {
|
||||
url = "github:foo/bar/branch";
|
||||
# if the input is not a flake, you need to set flake=false
|
||||
flake = false;
|
||||
};
|
||||
|
||||
sops-nix = {
|
||||
url = "github:Mic92/sops-nix";
|
||||
# The `follows` keyword in inputs is used for inheritance.
|
||||
# Here, `inputs.nixpkgs` of sops-nix is kept consistent with the `inputs.nixpkgs` in
|
||||
# the current flake, to avoid problems caused by different versions of nixpkgs.
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
# Pin flakes to a specific revision
|
||||
nix-doom-emacs = {
|
||||
url = "github:vlaci/nix-doom-emacs?rev=238b18d7b2c8239f676358634bfb32693d3706f3";
|
||||
flake = false;
|
||||
};
|
||||
|
||||
# To use a subdirectory of a repo, pass `dir=xxx`
|
||||
nixpkgs.url = "github:foo/bar?dir=shu";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Flake outputs
|
||||
|
||||
the `outputs` in `flake.nix` are what a flake produces as part of its build. Each flake can have many different outputs simultaneously, including but not limited to:
|
||||
|
||||
- Nix packages: named `apps.<system>.<name>`, `packages.<system>.<name>`, or `legacyPackages.<system>.<name>`
|
||||
- we can build a package by command `nix build .#<name>`
|
||||
- Nix Helper Functions: named `lib`., which means a library for other flakes.
|
||||
- Nix development environments: named `devShells`
|
||||
- `devShells` can be used by command `nix develop`, will be introduced later.
|
||||
- NixOS configuration: named `nixosConfiguration`
|
||||
- `nixosConfiguration` will be used by command `nixos-rebuild switch --flake .#<name>`
|
||||
- Nix templates: named `templates`
|
||||
- templates can be used by command `nix flake init --template <reference>`
|
||||
- Other user defined outputs, may be parsed by other nix-related tools.
|
||||
|
||||
An example copy from NixOS Wiki:
|
||||
|
||||
```nix
|
||||
{ self, ... }@inputs:
|
||||
{
|
||||
# Executed by `nix flake check`
|
||||
checks."<system>"."<name>" = derivation;
|
||||
# Executed by `nix build .#<name>`
|
||||
packages."<system>"."<name>" = derivation;
|
||||
# Executed by `nix build .`
|
||||
packages."<system>".default = derivation;
|
||||
# Executed by `nix run .#<name>`
|
||||
apps."<system>"."<name>" = {
|
||||
type = "app";
|
||||
program = "<store-path>";
|
||||
};
|
||||
# Executed by `nix run . -- <args?>`
|
||||
apps."<system>".default = { type = "app"; program = "..."; };
|
||||
|
||||
# Formatter (alejandra, nixfmt or nixpkgs-fmt)
|
||||
formatter."<system>" = derivation;
|
||||
# Used for nixpkgs packages, also accessible via `nix build .#<name>`
|
||||
legacyPackages."<system>"."<name>" = derivation;
|
||||
# Overlay, consumed by other flakes
|
||||
overlays."<name>" = final: prev: { };
|
||||
# Default overlay
|
||||
overlays.default = {};
|
||||
# Nixos module, consumed by other flakes
|
||||
nixosModules."<name>" = { config }: { options = {}; config = {}; };
|
||||
# Default module
|
||||
nixosModules.default = {};
|
||||
# Used with `nixos-rebuild --flake .#<hostname>`
|
||||
# nixosConfigurations."<hostname>".config.system.build.toplevel must be a derivation
|
||||
nixosConfigurations."<hostname>" = {};
|
||||
# Used by `nix develop .#<name>`
|
||||
devShells."<system>"."<name>" = derivation;
|
||||
# Used by `nix develop`
|
||||
devShells."<system>".default = derivation;
|
||||
# Hydra build jobs
|
||||
hydraJobs."<attr>"."<system>" = derivation;
|
||||
# Used by `nix flake init -t <flake>#<name>`
|
||||
templates."<name>" = {
|
||||
path = "<store-path>";
|
||||
description = "template description goes here?";
|
||||
};
|
||||
# Used by `nix flake init -t <flake>`
|
||||
templates.default = { path = "<store-path>"; description = ""; };
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Flake Command Line Usage
|
||||
|
||||
after enabled `nix-command` & `flake`, you can use `nix help` to get all the info of [New Nix Commands][New Nix Commands], some useful examples are listed below:
|
||||
|
||||
```bash
|
||||
# `nixpkgs#ponysay` means `ponysay` from `nixpkgs` flake.
|
||||
# [nixpkgs](https://github.com/NixOS/nixpkgs) contains `flake.nix` file, so it's a flake.
|
||||
# `nixpkgs` is a falkeregistry id for `github:NixOS/nixpkgs/nixos-unstable`.
|
||||
# you can find all the falkeregistry ids at <https://github.com/NixOS/flake-registry/blob/master/flake-registry.json>
|
||||
# so this command means install and run package `ponysay` in `nixpkgs` flake.
|
||||
echo "Hello Nix" | nix run "nixpkgs#ponysay"
|
||||
|
||||
# this command is the same as above, but use a full flake URI instead of falkeregistry id.
|
||||
echo "Hello Nix" | nix run "github:NixOS/nixpkgs/nixos-unstable#ponysay"
|
||||
|
||||
# instead of treat flake package as an application,
|
||||
# this command use `devShells.example` in flake `zero-to-nix`'s outputs, to setup the development environment,
|
||||
# and then open a bash shell in that environment.
|
||||
nix develop "github:DeterminateSystems/zero-to-nix#example"
|
||||
|
||||
# instead of using a remote flake, you can open a bash shell using the flake located in the current directory.
|
||||
mkdir my-flake && cd my-flake
|
||||
## init a flake with template
|
||||
nix flake init --template "github:DeterminateSystems/zero-to-nix#javascript-dev"
|
||||
# open a bash shell using the flake in current directory
|
||||
nix develop
|
||||
# or if your flake has multiple devShell outputs, you can specify which one to use.
|
||||
nix develop .#example
|
||||
|
||||
# build package `bat` from flake `nixpkgs`, and put a symlink `result` in the current directory.
|
||||
mkdir build-nix-package && cd build-nix-package
|
||||
nix build "nixpkgs#bat"
|
||||
# build a local flake is the same as nix develop, skip it
|
||||
```
|
||||
|
||||
[Zero to Nix - Determinate Systems][Zero to Nix - Determinate Systems] is a brand new guide to get started with Nix & Flake, recommended to read for beginners.
|
@ -1,5 +1,5 @@
|
||||
|
||||
### Advantages of Nix
|
||||
## Advantages of Nix
|
||||
|
||||
- **Declarative configuration, Environment as Code, can be managed with Git**
|
||||
- Nix Flakes lock dependences's version through a lock file named `flake.lock`, to ensure that the system is reproducible. This idea actually borrows from some package managers such as npm, cargo, etc.
|
||||
@ -12,7 +12,7 @@
|
||||
- **The community is very active, and there are quite a few third-party projects**. The official package repository, nixpkgs, has many contributors, and many people share their Nix configuration on Github/Gitlab. After browsing through it, the entire ecosystem gives me a sense of excitement in discovering a new continent.
|
||||
|
||||
|
||||
### Disadvantages of Nix
|
||||
## Disadvantages of Nix
|
||||
|
||||
- **High learning curve:**: If you want the system to be completely reproducible and avoid pitfalls caused by improper use, you need to learn about the entire design of Nix and manage the system in a declarative manner. You cannot blindly use `nix-env -i` (which is similar to `apt-get install`).
|
||||
- **Chaotic documentation**: Flakes is still an experimental feature, and there are currently few documents introducing it, Most of the Nix community's documentation only introduces the old cli such as `nix-env`/`nix-channel`. If you want to start learning Nix directly from Flakes, you need to refer to a large number of old documents and extract what you need from them. In addition, some of Nix's current core functions are not well-documented (such as `imports` and Nix Module System), to figure out what it does, it is best to look at the source code...
|
||||
@ -21,7 +21,7 @@
|
||||
`--show- Trace` may throw you a stack of errors that are of little help.
|
||||
|
||||
|
||||
### Summary
|
||||
## Summary
|
||||
|
||||
Generally speaking, I think NixOS is suitable for developers who have some experience in using Linux and programming and want to have more control over their systems.
|
||||
|
||||
|
@ -34,7 +34,7 @@ Here are the classic Nix commands and related concepts that are no longer needed
|
||||
> maybe `nix-env -qa` is still useful some times, which returns all packages installed in the System.
|
||||
|
||||
|
||||
## IX. When will flakes stablized {#when-will-flakes-stablized}
|
||||
## When will flakes stablized {#when-will-flakes-stablized}
|
||||
|
||||
I dived into some details about flakes:
|
||||
|
||||
|
42
docs/other-usage-of-flakes/inputs.md
Normal file
42
docs/other-usage-of-flakes/inputs.md
Normal file
@ -0,0 +1,42 @@
|
||||
|
||||
## Flake inputs {#flake-inputs}
|
||||
|
||||
The `inputs` in `flake.nix` is a attribute set, used to specify the dependencies of the current flake, there are many types of `inputs`, for example:
|
||||
|
||||
```nix
|
||||
{
|
||||
inputs = {
|
||||
# use master branch of the GitHub repository as input, this is the most common input format
|
||||
nixpkgs.url = "github:Mic92/nixpkgs/master";
|
||||
# Git URL, can be used for any Git repository based on https/ssh protocol
|
||||
git-example.url = "git+https://git.somehost.tld/user/path?ref=branch&rev=fdc8ef970de2b4634e1b3dca296e1ed918459a9e";
|
||||
# The above example will also copy .git, use this for (shallow) local Git repos
|
||||
git-directory-example.url = "git+file:/path/to/repo?shallow=1";
|
||||
# Local directories (for absolute paths you can omit 'path:')
|
||||
directory-example.url = "path:/path/to/repo";
|
||||
|
||||
bar = {
|
||||
url = "github:foo/bar/branch";
|
||||
# if the input is not a flake, you need to set flake=false
|
||||
flake = false;
|
||||
};
|
||||
|
||||
sops-nix = {
|
||||
url = "github:Mic92/sops-nix";
|
||||
# The `follows` keyword in inputs is used for inheritance.
|
||||
# Here, `inputs.nixpkgs` of sops-nix is kept consistent with the `inputs.nixpkgs` in
|
||||
# the current flake, to avoid problems caused by different versions of nixpkgs.
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
# Pin flakes to a specific revision
|
||||
nix-doom-emacs = {
|
||||
url = "github:vlaci/nix-doom-emacs?rev=238b18d7b2c8239f676358634bfb32693d3706f3";
|
||||
flake = false;
|
||||
};
|
||||
|
||||
# To use a subdirectory of a repo, pass `dir=xxx`
|
||||
nixpkgs.url = "github:foo/bar?dir=shu";
|
||||
}
|
||||
}
|
||||
```
|
3
docs/other-usage-of-flakes/intro.md
Normal file
3
docs/other-usage-of-flakes/intro.md
Normal file
@ -0,0 +1,3 @@
|
||||
## Usage of Flakes
|
||||
|
||||
Up to now, we have written a lot of configuration with Flakes to manage NixOS. Here is a brief introduction to the more detailed content of the Flakes, as well as the new command lines commonly used with flakes.
|
65
docs/other-usage-of-flakes/outputs.md
Normal file
65
docs/other-usage-of-flakes/outputs.md
Normal file
@ -0,0 +1,65 @@
|
||||
|
||||
## Flake outputs
|
||||
|
||||
the `outputs` in `flake.nix` are what a flake produces as part of its build. Each flake can have many different outputs simultaneously, including but not limited to:
|
||||
|
||||
- Nix packages: named `apps.<system>.<name>`, `packages.<system>.<name>`, or `legacyPackages.<system>.<name>`
|
||||
- we can build a package by command `nix build .#<name>`
|
||||
- Nix Helper Functions: named `lib`., which means a library for other flakes.
|
||||
- Nix development environments: named `devShells`
|
||||
- `devShells` can be used by command `nix develop`, will be introduced later.
|
||||
- NixOS configuration: named `nixosConfiguration`
|
||||
- `nixosConfiguration` will be used by command `nixos-rebuild switch --flake .#<name>`
|
||||
- Nix templates: named `templates`
|
||||
- templates can be used by command `nix flake init --template <reference>`
|
||||
- Other user defined outputs, may be parsed by other nix-related tools.
|
||||
|
||||
An example copy from NixOS Wiki:
|
||||
|
||||
```nix
|
||||
{ self, ... }@inputs:
|
||||
{
|
||||
# Executed by `nix flake check`
|
||||
checks."<system>"."<name>" = derivation;
|
||||
# Executed by `nix build .#<name>`
|
||||
packages."<system>"."<name>" = derivation;
|
||||
# Executed by `nix build .`
|
||||
packages."<system>".default = derivation;
|
||||
# Executed by `nix run .#<name>`
|
||||
apps."<system>"."<name>" = {
|
||||
type = "app";
|
||||
program = "<store-path>";
|
||||
};
|
||||
# Executed by `nix run . -- <args?>`
|
||||
apps."<system>".default = { type = "app"; program = "..."; };
|
||||
|
||||
# Formatter (alejandra, nixfmt or nixpkgs-fmt)
|
||||
formatter."<system>" = derivation;
|
||||
# Used for nixpkgs packages, also accessible via `nix build .#<name>`
|
||||
legacyPackages."<system>"."<name>" = derivation;
|
||||
# Overlay, consumed by other flakes
|
||||
overlays."<name>" = final: prev: { };
|
||||
# Default overlay
|
||||
overlays.default = {};
|
||||
# Nixos module, consumed by other flakes
|
||||
nixosModules."<name>" = { config }: { options = {}; config = {}; };
|
||||
# Default module
|
||||
nixosModules.default = {};
|
||||
# Used with `nixos-rebuild --flake .#<hostname>`
|
||||
# nixosConfigurations."<hostname>".config.system.build.toplevel must be a derivation
|
||||
nixosConfigurations."<hostname>" = {};
|
||||
# Used by `nix develop .#<name>`
|
||||
devShells."<system>"."<name>" = derivation;
|
||||
# Used by `nix develop`
|
||||
devShells."<system>".default = derivation;
|
||||
# Hydra build jobs
|
||||
hydraJobs."<attr>"."<system>" = derivation;
|
||||
# Used by `nix flake init -t <flake>#<name>`
|
||||
templates."<name>" = {
|
||||
path = "<store-path>";
|
||||
description = "template description goes here?";
|
||||
};
|
||||
# Used by `nix flake init -t <flake>`
|
||||
templates.default = { path = "<store-path>"; description = ""; };
|
||||
}
|
||||
```
|
41
docs/other-usage-of-flakes/the-new-cli.md
Normal file
41
docs/other-usage-of-flakes/the-new-cli.md
Normal file
@ -0,0 +1,41 @@
|
||||
|
||||
## Usage of The New CLI
|
||||
|
||||
after enabled `nix-command` & `flake`, you can use `nix help` to get all the info of [New Nix Commands][New Nix Commands], some useful examples are listed below:
|
||||
|
||||
```bash
|
||||
# `nixpkgs#ponysay` means `ponysay` from `nixpkgs` flake.
|
||||
# [nixpkgs](https://github.com/NixOS/nixpkgs) contains `flake.nix` file, so it's a flake.
|
||||
# `nixpkgs` is a falkeregistry id for `github:NixOS/nixpkgs/nixos-unstable`.
|
||||
# you can find all the falkeregistry ids at <https://github.com/NixOS/flake-registry/blob/master/flake-registry.json>
|
||||
# so this command means install and run package `ponysay` in `nixpkgs` flake.
|
||||
echo "Hello Nix" | nix run "nixpkgs#ponysay"
|
||||
|
||||
# this command is the same as above, but use a full flake URI instead of falkeregistry id.
|
||||
echo "Hello Nix" | nix run "github:NixOS/nixpkgs/nixos-unstable#ponysay"
|
||||
|
||||
# instead of treat flake package as an application,
|
||||
# this command use `devShells.example` in flake `zero-to-nix`'s outputs, to setup the development environment,
|
||||
# and then open a bash shell in that environment.
|
||||
nix develop "github:DeterminateSystems/zero-to-nix#example"
|
||||
|
||||
# instead of using a remote flake, you can open a bash shell using the flake located in the current directory.
|
||||
mkdir my-flake && cd my-flake
|
||||
## init a flake with template
|
||||
nix flake init --template "github:DeterminateSystems/zero-to-nix#javascript-dev"
|
||||
# open a bash shell using the flake in current directory
|
||||
nix develop
|
||||
# or if your flake has multiple devShell outputs, you can specify which one to use.
|
||||
nix develop .#example
|
||||
|
||||
# build package `bat` from flake `nixpkgs`, and put a symlink `result` in the current directory.
|
||||
mkdir build-nix-package && cd build-nix-package
|
||||
nix build "nixpkgs#bat"
|
||||
# build a local flake is the same as nix develop, skip it
|
||||
```
|
||||
|
||||
[Zero to Nix - Determinate Systems][Zero to Nix - Determinate Systems] is a brand new guide to get started with Nix & Flake, recommended to read for beginners.
|
||||
|
||||
|
||||
[New Nix Commands]: https://nixos.org/manual/nix/stable/command-ref/new-cli/nix.html
|
||||
[Zero to Nix - Determinate Systems]: https://github.com/DeterminateSystems/zero-to-nix
|
@ -1,5 +1,5 @@
|
||||
|
||||
## 十、进阶玩法 {#advanced-topics}
|
||||
## 进阶玩法 {#advanced-topics}
|
||||
|
||||
逐渐熟悉 Nix 这一套工具链后,可以进一步读一读 Nix 的三本手册,挖掘更多的玩法:
|
||||
|
||||
@ -24,3 +24,5 @@
|
||||
- [lanzaboote](https://github.com/nix-community/lanzaboote): 启用 secure boot
|
||||
- [impermanence](https://github.com/nix-community/impermanence): 用于配置无状态系统。可用它持久化你指定的文件或文件夹,同时再将 /home 目录挂载为 tmpfs 或者每次启动时用工具擦除一遍。这样所有不受 impermanence 管理的数据都将成为临时数据,如果它们导致了任何问题,重启下系统这些数据就全部还原到初始状态了!
|
||||
- [colmena](https://github.com/zhaofengli/colmena): NixOS 主机部署工具
|
||||
|
||||
[digga]: https://github.com/divnix/digga
|
@ -110,11 +110,6 @@ outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.activation
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.activationPackage
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.emptyActivationPath
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.enableDebugInfo
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.enableNixpkgsReleaseCheck
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.extraActivationPath
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.extraBuilderCommands
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.extraOutputsToInstall
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.extraProfileCommands
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file
|
||||
# ......omit other outputs
|
||||
|
||||
@ -123,9 +118,6 @@ nix-repl> outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.ses
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.BROWSER
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.DELTA_PAGER
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.EDITOR
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.GLFW_IM_MODULE
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.MANPAGER
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.QT_IM_MODULE
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.TERM
|
||||
# ......omit other outputs
|
||||
|
||||
@ -142,11 +134,6 @@ outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/fcitx5/profile-bak
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/config
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/i3blocks.conf
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/keybindings
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/layouts
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/scripts
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/wallpaper.png
|
||||
outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/rofi
|
||||
#......
|
||||
```
|
||||
|
||||
|
@ -54,3 +54,6 @@ $ fhs
|
||||
## 参考
|
||||
|
||||
- [Tips&Tricks for NixOS Desktop - NixOS Discourse][Tips&Tricks for NixOS Desktop - NixOS Discourse]: Just as the title says, it is a collection of tips and tricks for NixOS desktop.
|
||||
|
||||
|
||||
[Tips&Tricks for NixOS Desktop - NixOS Discourse]: https://discourse.nixos.org/t/tips-tricks-for-nixos-desktop/28488
|
@ -1,5 +1,5 @@
|
||||
|
||||
### 2. 启用 NixOS 的 Flakes 支持 {#enable-nix-flakes}
|
||||
## 启用 NixOS 的 Flakes 支持 {#enable-nix-flakes}
|
||||
|
||||
与 NixOS 默认的配置方式相比,Nix Flakes 提供了更好的可复现性,同时它清晰的包结构定义原生支持了以其他 Git 仓库为依赖,便于代码分享,因此更建议使用 Nix Flakes 来管理系统配置。
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
|
||||
额外还有个好处就是,现在你可以通过 `nix repl` 打开一个 nix 交互式环境,有兴趣的话,可以使用它复习测试一遍前面学过的所有 Nix 语法。
|
||||
|
||||
### 3. 将系统配置切换到 flake.nix {#switch-to-flake-nix}
|
||||
## 将系统配置切换到 flake.nix {#switch-to-flake-nix}
|
||||
|
||||
在启用了 Nix Flakes 特性后,`sudo nixos-rebuild switch` 命令会优先读取 `/etc/nixos/flake.nix` 文件,如果找不到再尝试使用 `/etc/nixos/configuration.nix`。
|
||||
|
||||
@ -132,7 +132,7 @@ cat flake.nix
|
||||
|
||||
现在执行 `sudo nixos-rebuild switch` 应用配置,系统应该没有任何变化,因为我们仅仅是切换到了 Nix Flakes,配置内容与之前还是一致的。
|
||||
|
||||
### 4. 通过 Flakes 来管理系统软件 {#manage-system-software-with-flakes}
|
||||
## 通过 Flakes 来管理系统软件 {#manage-system-software-with-flakes}
|
||||
|
||||
切换完毕后,我们就可以通过 Flakes 来管理系统了。管系统最常见的需求就是装软件,我们在前面已经见识过如何通过 `environment.systemPackages` 来安装 `pkgs` 中的包,这些包都来自官方的 nixpkgs 仓库。
|
||||
|
||||
@ -193,7 +193,7 @@ cat flake.nix
|
||||
|
||||
改好后再 `sudo nixos-rebuild switch` 部署,就能安装好 helix 程序了,可直接在终端使用 `helix` 命令测试验证。
|
||||
|
||||
### 5. 为 Flake 添加国内 cache 源 {#add-cache-source-for-flake}
|
||||
## 为 Flake 添加国内 cache 源 {#add-cache-source-for-flake}
|
||||
|
||||
Nix 为了加快包构建速度,提供了 <https://cache.nixos.org> 提前缓存构建结果提供给用户,但是在国内访问这个 cache 地址非常地慢,如果没有全局代理的话,基本上是无法使用的。
|
||||
另外 Flakes 的数据源基本都是某个 Github 仓库,在国内从 Github 下载 Flakes 数据源也同样非常非常慢。
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
Flakes 实验特性是 Nix 项目的一项重大进展,它引入了一种管理 Nix 表达式之间的依赖关系的策略,提高了 Nix 生态系统中的可复现性、可组合性和可用性。
|
||||
虽然 Flakes 仍然是一个试验性的功能,但已经被 Nix 社区广泛使采用。[^1]
|
||||
虽然 Flakes 仍然是一个试验性的功能,但已经被 Nix 社区广泛采用。[^1]
|
||||
|
||||
Flakes 特性是 Nix 项目中最有意义的变化之一。[^2]
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
### 7. 模块化 NixOS 配置 {#modularize-nixos-configuration}
|
||||
## 模块化 NixOS 配置 {#modularize-nixos-configuration}
|
||||
|
||||
到这里整个系统的骨架基本就配置完成了,当前我们 `/etc/nixos` 中的系统配置结构应该如下:
|
||||
|
||||
@ -87,7 +87,7 @@ $ tree
|
||||
|
||||
详细结构与内容,请移步前面提供的 github 仓库链接,这里就不多介绍了。
|
||||
|
||||
#### 7.1. `mkOverride`, `lib.mkDefault` and `lib.mkForce`
|
||||
## `mkOverride`, `lib.mkDefault` and `lib.mkForce`
|
||||
|
||||
你可能会发现有些人在 Nix 文件中使用 `lib.mkDefault` `lib.mkForce` 来定义值,顾名思义,`lib.mkDefault` 和 `lib.mkForce` 用于设置选项的默认值,或者强制设置选项的值。
|
||||
|
||||
@ -154,7 +154,7 @@ $ tree
|
||||
}
|
||||
```
|
||||
|
||||
#### 7.2 `lib.mkOrder`, `lib.mkBefore` 与 `lib.mkAfter`
|
||||
## `lib.mkOrder`, `lib.mkBefore` 与 `lib.mkAfter`
|
||||
|
||||
`lib.mkBefore` 跟 `lib.mkAfter` 用于设置**列表类型**的合并顺序,它们跟 `lib.mkDefault` 和 `lib.mkForce` 一样,也被用于模块化配置。
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
### 10. 使用 Git 管理 NixOS 配置 {#git-manage-nixos-config}
|
||||
## 使用 Git 管理 NixOS 配置 {#git-manage-nixos-config}
|
||||
|
||||
NixOS 的配置文件是纯文本,因此跟普通的 dotfiles 一样可以使用 Git 管理。
|
||||
|
||||
@ -38,7 +38,7 @@ sudo nixos-rebuild switch --flake .#nixos-test
|
||||
|
||||
Git 的更多操作这里就不介绍了,总之一般情况下的回滚都能直接通过 Git 完成,只在系统完全崩溃的情况下,才需要通过重启进入 grub,从上一个历史版本启动系统。
|
||||
|
||||
### 11. 查看与清理历史数据 {#view-and-delete-history}
|
||||
## 查看与清理历史数据 {#view-and-delete-history}
|
||||
|
||||
如前所述,NixOS 的每次部署都会生成一个新的版本,所有版本都会被添加到系统启动项中,除了重启电脑外,我们也可以通过如下命令查询当前可用的所有历史版本:
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
### 8. 更新系统 {#update-nixos-system}
|
||||
## 更新系统 {#update-nixos-system}
|
||||
|
||||
在使用了 Nix Flakes 后,要更新系统也很简单,先更新 flake.lock 文件,然后部署即可。在配置文件夹中执行如下命令:
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
## 八、Nixpkgs 的高级用法 {#nixpkgs-advanced-usage}
|
||||
## Nixpkgs 的高级用法 {#nixpkgs-advanced-usage}
|
||||
|
||||
callPackage、Overriding 与 Overlays 是在使用 Nix 时偶尔会用到的技术,它们都是用来自定义 Nix 包的构建方法的。
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
### 1. Flake 的 inputs {#flake-inputs}
|
||||
## Flake 的 inputs {#flake-inputs}
|
||||
|
||||
`flake.nix` 中的 `inputs` 是一个 attribute set,用来指定当前 Flake 的依赖,inputs 有很多种类型,举例如下:
|
||||
|
@ -1,6 +1,9 @@
|
||||
|
||||
## 七、Nix Flakes 的使用 {#nix-flakes-usage}
|
||||
## Nix Flakes 的使用 {#nix-flakes-usage}
|
||||
|
||||
到这里我们已经写了不少 Nix Flakes 配置来管理 NixOS 系统了,这里再简单介绍下 Nix Flakes 更细节的内容,以及常用的 nix flake 命令。
|
||||
|
||||
此外 [Zero to Nix - Determinate Systems][Zero to Nix - Determinate Systems] 是一份全新的 Nix & Flake 新手入门文档,写得比较浅显易懂,也可以一读。
|
||||
|
||||
|
||||
[Zero to Nix - Determinate Systems]: https://github.com/DeterminateSystems/zero-to-nix
|
@ -1,6 +1,6 @@
|
||||
|
||||
|
||||
### 2. Flake 的 outputs {#flake-outputs}
|
||||
## Flake 的 outputs {#flake-outputs}
|
||||
|
||||
`flake.nix` 中的 `outputs` 是一个 attribute set,是整个 Flake 的构建结果,每个 Flake 都可以有许多不同的 outputs。
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
### 3. Flake 命令行的使用 {#flake-commands-usage}
|
||||
## Flake 命令行的使用 {#flake-commands-usage}
|
||||
|
||||
在启用了 `nix-command` & `flakes` 功能后,我们就可以使用 Nix 提供的新一代 Nix 命令行工具 [New Nix Commands][New Nix Commands] 了,下面列举下其中常用命令的用法:
|
||||
|
||||
@ -35,3 +35,6 @@ mkdir build-nix-package && cd build-nix-package
|
||||
nix build "nixpkgs#bat"
|
||||
# 构建一个本地 flake 和 nix develop 是一样的,不再赘述
|
||||
```
|
||||
|
||||
|
||||
[New Nix Commands]: https://nixos.org/manual/nix/stable/command-ref/new-cli/nix.html
|
Loading…
Reference in New Issue
Block a user