home.nixをFlakes移行する【home-manager】
home.nixをFlakesに移行する
vim-jpのslackで有識者の書き込みを見たりしながら、home.nixをFlakes移行しました。
コミュニティに圧倒的感謝。
「Flakesとは!何が嬉しいのか!」みたいな話はしないです。なぜなら私自身まだよく分かってないため。
とりあえず移行に成功したので手順を残しておきます。
とりあえずflake.nixを使えるようにする
home.nixがあるディレクトリで以下を実行
home-manager init .
するとこんなのが出てくる。
{
description = "Home Manager configuration of hoge-user";
inputs = {
# Specify the source of Home Manager and Nixpkgs.
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { nixpkgs, home-manager, ... }:
let
system = "aarch64-darwin";
pkgs = nixpkgs.legacyPackages.${system};
in {
homeConfigurations."hoge-user" = home-manager.lib.homeManagerConfiguration {
inherit pkgs;
# Specify your home configuration modules here, for example,
# the path to your home.nix.
modules = [ ./home.nix ];
# Optionally use extraSpecialArgs
# to pass through arguments to home.nix
};
};
}
hoge-user
というのはユーザ名が入るはずで、このflakeを用いる時に指定しないといけない。
これは多分プロファイル的な概念で、複数の構成を用意しておける?[1]
そしたら以下でswitchできます
home-manager switch --flake .#hoge-user
一般的な構成ならそのまま成功するはず、お疲れ様でした!
(gitのsubmoduleがあるとうまくいかないです。私は諦めてレポジトリ統合しました。)
私はこれでneovimのバージョンが0.10.04
→0.11.0
になりました。神
パッケージレポジトリが中央集権的なchannelから、分散管理的なFlakesに移行することで新しいパッケージが使いやすくなるという理解[2]
良い感じにしてみる
はじめに
これから書く2点のいずれかでも実施するとflakeがpureじゃなくなるので、実行コマンドに--impure
が必要になります。
home-manager switch --flake .#hoge-user --impure
1. マルチアーキテクチャに使えるようにする
initで生成されるflake.nixは実行環境のアーキテクチャで固定されてます
どこでも使えるようにしたいなら↓
outputs = { nixpkgs, home-manager, ... }:
let
- system = "aarch64-darwin";
+ system = builtins.currentSystem;
pkgs = nixpkgs.legacyPackages.${system};
in {
2. 環境情報をhome.nixに注入する
home.nixはpureなまま、flakeで$USER
や$HOME
を読めるようになるので素敵(なはず)
outputs = { nixpkgs, home-manager, ... }:
let
system = builtins.currentSystem;
pkgs = nixpkgs.legacyPackages.${system};
+ envUsername = builtins.getEnv "USER";
+ envHomeDir = builtins.getEnv "HOME";
in {
homeConfigurations."hoge-user" = home-manager.lib.homeManagerConfiguration {
inherit pkgs;
@@ -25,6 +27,10 @@
# Optionally use extraSpecialArgs
# to pass through arguments to home.nix
+ extraSpecialArgs = {
+ username = envUsername;
+ homeDirectory = envHomeDir;
+ };
};
};
}
home.nix
はinput使うだけ
{ config, pkgs, username, homeDirectory, ... }:
let
// 略
in
{
home.username = username;
home.homeDirectory = homeDirectory;
CI (依存関係の自動アップデート)
flakeにはlockファイルがあるので、CIで更新したいところですが残念ながらdependabotは非対応。
しかし安心してください、先人による更新用のworkflowが以下にあります。神
Discussion