mcpField
N
nix-setup

nix-setup

github.com/mizchi開発41659 回インストール1 週間前に更新
リポジトリ

nix-setup について

再現可能な Nix 開発環境の構築ガイドで、devbox と純粋な flake の両方を扱います。複数言語のテンプレートとサンドボックス環境向けの導入手順を備え、プロジェクトに応じた設定を支援します。

主な機能

  1. 01devbox と flake の選択指針
  2. 02複数言語向け flake テンプレート
  3. 03サンドボックス環境用 Nix インストーラー
  4. 04プロジェクト単位の依存関係と環境設定
  5. 05GitHub Actions の設定例

活用シーン

  1. 01新規プロジェクトに再現可能な環境を作成
  2. 02コンテナや Claude Code web で Nix を設定
  3. 03言語ツールチェーンと依存関係を構成
  4. 04GitHub Actions から devbox タスクを実行

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mizchi/skills --skill nix-setup

インストール後、Claude Code で/nix-setupを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
assets/
apm.nix
setup_nix.sh
assets/devbox/
devbox.json
gh_action_example.yaml
assets/haskell/
.envrc
flake.nix
assets/home-manager/
.gitignore
ccweb.nix
common.nix
flake.nix
macos.nix
assets/moonbit/
.envrc
flake.nix
assets/ocaml/
.envrc
.gitignore
flake.nix
assets/oxcaml/
.envrc
.gitignore
flake.nix
assets/python-uv/
.envrc
flake.nix
assets/rust/
.envrc
flake.nix
assets/typescript/
.envrc
flake.nix
evals/
eval.yaml
ledger.yaml
evals/tasks/
scenario-a-devbox-default.yaml
scenario-b-flake-overlay.yaml

詳細

Nix のセットアップスキル

再現可能な開発環境をセットアップするためのリファレンスです。2 つの方法は同じ Nix バックエンドを共有します。

  • devbox — Nix の薄いレイヤーです。devbox.json は簡潔な JSON です。新しいプロジェクトでのデフォルトです。
  • pure flake.nix — Nix の式の機能をすべて利用できます。言語ごとのテンプレートが assets/ にあり、cp ですぐに使い始められます。

devbox と pure flake の選択

devbox は Nix 上で動作する(内部で Nix ストアと nixpkgs を使用する)ため、どちらを選ぶかは UX の選択であり、スタックの選択ではありません。mizchi/ のデフォルトは次のとおりです。

状況使用するもの
新しいプロジェクトで、標準の nixpkgs パッケージで要件を満たせるdevbox
カスタム derivation、入力のオーバーライド、overlay、または buildNpmPackage が必要flake.nix
flake.lock を(devbox.lock ではなく)信頼できる再現性のソースにする必要があるflake.nix
devbox のインストーラーが重すぎる Claude Code web/サンドボックス環境が対象setup_nix.sh を使用する flake.nix
すでに動作する flake があり、チームが direnv を使用しているflake.nix

devbox.json のパッケージは nixpkgs の属性パスとほぼ 1 対 1 で対応するため、後から flake.nix に切り替えるのも簡単です。

pure flake.nix を選ぶ場合は、その理由として devbox is rejected を提案に記載してください(短い一文で構いません)。 例:「rust-overlay の入力オーバーライドは devbox.json では表現できないため、ここでは pure flake.nix を選択します。」これにより、レビュアーがなぜ手間のかかる flake の方法を選んだのかを改めて調べる必要がなくなり、判断表を反射的ではなく意識的に適用できます。

使用する場面

  • 「nix の開発シェルを作成する」/「flake.nix を書く」/「devbox をセットアップする」
  • 「新しいプロジェクトに再現可能な環境を追加する」
  • 「claude code web/コンテナー内で nix を動作させる」
  • flake.nix/flake.lock/.envrc/devbox.json に関する一般的な質問
  • nix develop/nix build/devbox shell のトラブルシューティング

assets/ の内容

assets/
├── setup_nix.sh              # Installer that sets up single-user Nix with sandbox disabled (for container / CCW)
├── apm.nix                   # Nix derivation for microsoft/apm (Agent Package Manager)
├── moonbit/{flake.nix,.envrc}        # moonbit-overlay + moon
├── rust/{flake.nix,.envrc}           # rust-overlay + stable pinned + cargo-nextest/watch
├── typescript/{flake.nix,.envrc}     # nodejs_24 + pnpm (top-level)
├── python-uv/{flake.nix,.envrc}      # python3 + uv
├── haskell/{flake.nix,.envrc}        # GHC + cabal + HLS + hlint + ormolu
├── ocaml/{flake.nix,.envrc,.gitignore}  # OCaml 5 + dune + merlin + ocaml-lsp + utop
├── oxcaml/{flake.nix,.envrc,.gitignore} # Jane Street OxCaml (opam source build)
└── home-manager/             # multi-host home-manager flake (macos + ccweb)
    ├── flake.nix
    ├── common.nix
    ├── macos.nix             # aarch64-darwin: full desktop
    ├── ccweb.nix             # x86_64-linux: minimal sandbox
    └── .gitignore            # Excludes private.nix / *.secret.nix

すべてのテンプレートには just、ast-grep、apm(共有の運用ツール)が含まれています。

テンプレートでは、プロジェクトのルートに flake.nix と apm.nix を並べて配置することを想定しています。言語側だけを差し替えたい場合は、apm.nix をそのまま再利用できます。

apm.nix は任意です。APM スキルを使用しないプロジェクトでは削除できます。その場合は、flake.nix から apm = import ./apm.nix ... と、packages 内の apm エントリーの両方を削除してください。just/ast-grep だけを残したい場合は、そのままにしてください。

assets/devbox/ には、devbox 用の devbox.json テンプレートと GitHub Actions のスニペットがあります。

devbox の使用

devbox は Nix 上で、Nix の式を書かずにプロジェクトごとの分離された再現可能な環境を提供します。

インストール
curl -fsSL https://get.jetify.com/devbox | bash
基本的なコマンド
devbox init                       # creates devbox.json
devbox add nodejs@20              # add packages by name@version
devbox add [email protected] [email protected]
devbox rm nodejs                  # remove
devbox shell                      # enter the env shell
devbox run -- npm test            # run a one-shot command
devbox run test                   # run a named script
devbox services start             # start process-compose services
devbox search nodejs              # search packages

パッケージ検索インデックス:https://www.nixhub.io。

devbox.json の構成
{
  "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/main/.schema/devbox.schema.json",
  "packages": [
    "nodejs@20",
    "[email protected]",
    "github:NixOS/nixpkgs#hello"
  ],
  "env": {
    "DATABASE_URL": "postgresql://localhost:5432/dev",
    "NODE_ENV": "development"
  },
  "shell": {
    "init_hook": [
      "export API_KEY=$(<.api_key)"
    ],
    "scripts": {
      "test": "npm test",
      "dev": "npm run dev",
      "lint": ["eslint .", "prettier --check ."]
    }
  }
}
サービス(process-compose.yaml)
processes:
  web:
    command: npm run dev
  db:
    command: postgres -D /tmp/pgdata
devbox services start | stop | ls
GitHub Actions

jetify-com/devbox-install-action を使用してください。完全なワークフローは assets/devbox/gh_action_example.yaml にあります。

steps:
  - uses: actions/checkout@v7
  - uses: jetify-com/[email protected]
    # with:
    #   enable-cache: true   # caches the Nix store
  - run: devbox run test
よく使うフラグ
フラグ説明
--config <path>デフォルト以外の devbox.json のパス
--quiet出力を抑制
--print-envこの devbox が設定する環境変数を出力
Devbox のリファレンス

クイックインストール

macOS/Linux(推奨)

Determinate Systems installer を使用してください。experimental-features = nix-command flakes が初期状態で有効になっており、アンインストールも簡単です。

curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
Claude Code web/その他のサンドボックス環境

systemd がない、root のみが使える、またはネストされた名前空間が禁止されている環境では、assets/setup_nix.sh を使用してください。

  • シングルユーザーモードでは build-users-group =(空)
  • chroot が不要になるよう sandbox = false を設定
  • /etc/nix/nix.conf と $HOME/.config/nix/nix.conf の両方に experimental-features = nix-command flakes を書き込み
  • /etc/profile.d/nix.sh を配置し、以降のシェルで PATH が機能するようにする
cp ~/.claude/skills/nix-setup/assets/setup_nix.sh .
bash setup_nix.sh
. "$HOME/.nix-profile/etc/profile.d/nix.sh"  # apply to the current shell too
nix --version

最小限の flake スケルトン

{
  description = "...";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let pkgs = import nixpkgs { inherit system; };
      in {
        devShells.default = pkgs.mkShell {
          packages = [ /* ... */ ];
          shellHook = ''...'';
        };
      });
}

nix develop を実行すると、devShells.default に入ります。direnv を使う場合は、.envrc に use flake と記述し、direnv allow を実行してください。

共通ツール(すべてのテンプレートに含まれます)

ツール用途常に含まれる理由
justタスクランナーjustfile はプロジェクトの標準です
ast-grep構造的な検索/リントgrep では記述できないルールを静的に適用します
apmエージェント依存関係マネージャーapm.yml を介してスキル/プロンプトを再現可能な形で配布します

言語別テンプレートの使用

テンプレートをインストールするには、プロジェクトルートに flake.nix と apm.nix を並べて配置するだけです。

# Example: MoonBit project
cp ~/.claude/skills/nix-setup/assets/apm.nix .
cp ~/.claude/skills/nix-setup/assets/moonbit/flake.nix .

nix develop           # builds on the first run
# If you're a direnv user:
echo 'use flake' > .envrc && direnv allow
MoonBit
  • moonbit-overlay.packages.${system}.moon-patched_latest を使用します
  • オーバーレイは動作確認済みのリビジョンに固定されています(50118f5c3c0298b5cb17cc6f1c346165801014c8)。最新の HEAD は、nixpkgs-unstable で broken とマークされたパッケージ(例:tcc)に依存することがあり、しばらく評価に失敗する場合があります。更新前に確認してください。
  • moon.mod.json がある場合は、moon update を自動的に実行します(初回のみ)。
  • 参考:vibe-lang の flake.nix
Rust
  • rust-overlay でツールチェーンを管理します
  • デフォルトは stable.latest.default と rust-analyzer/clippy/rustfmt です
  • 特定のバージョンに固定するには、rust-bin.stable."1.91.0".default を使います
  • rust-toolchain.toml との連携:rust-bin.fromRustupToolchainFile ./rust-toolchain.toml
  • WASM ターゲット:targets = [ "wasm32-wasip1" "wasm32-unknown-unknown" ]
TypeScript
  • nodejs_24 と pkgs.pnpm(トップレベル)を使います
  • nodePackages.* は 2025 年に nixpkgs から削除されました — nodePackages.pnpm は動作しなくなりました
  • $HOME を汚さないよう、PNPM_HOME をプロジェクト内のパス($PWD/.pnpm)に設定します
  • npm/yarn に切り替えるには、pkgs.pnpm を削除して pkgs.nodejs_24 に同梱されている npm を使うか、pkgs.yarn を追加します
Python + uv
  • pkgs.python3 と pkgs.uv を使います
  • uv 自身が Python のバージョンを管理するため、nix 側はフォールバックとしてのみ使います
  • UV_PROJECT_ENVIRONMENT=$PWD/.venv と UV_CACHE_DIR=$PWD/.uv-cache を設定すると、$HOME をクリーンに保てます
Haskell
  • pkgs.haskellPackages.{ghc,cabal-install,haskell-language-server,hlint,ormolu,ghcid} を使います
  • nixpkgs のデフォルト(haskellPackages)を使用します。GHC のバージョンを固定するには、pkgs.haskell.packages.ghc98 などに置き換えます。
  • より厳密な再現性が必要な場合は、haskell.nix(IOHK)を検討してください。ただし、学習コストと複雑さは大幅に増します。
  • stack を使うには、pkgs.stack を追加し、stack.yaml の resolver で GHC を固定するよう切り替えます。
  • macOS では stdenv.cc.cc.lib が PATH に含まれないため、一部の FFI のケースで問題が発生します → buildInputs = [ pkgs.zlib ] などを追加してください。
OCaml
  • pkgs.ocamlPackages.{ocaml,dune_3,findlib,merlin,ocaml-lsp,ocamlformat,utop} と pkgs.opam を使います
  • nixpkgs のデフォルトは OCaml 5.x 系列です。pkgs.ocaml-ng.ocamlPackages_5_2 などでバージョンを固定できます。
  • opam の管理:shellHook は OPAMROOT=$PWD/.opam を設定して状態をプロジェクト内に限定し、初回実行時に opam init と opam switch create default --empty を自動的に実行します。2 回目以降は opam env の eval のみを行います。
  • 空の switch を使うと、nix が提供する ocaml をそのまま使えるため、コンパイラーを二重に管理せずに済みます。
  • .gitignore に .opam/ が含まれているため、状態が誤ってコミットされることはありません。
  • 追加のライブラリは opam install <pkg> でプロジェクト内にインストールされます。
  • merlin は ocaml-lsp の依存関係です。両方をインストールすると、エディターとの連携が完全になります。
OxCaml(Jane Street のフォーク)
  • nixpkgs には含まれていません。公式に推奨されている「opam + ソースからのビルド」の手順に従います。nix 側で提供するのは opam とビルドツールチェーン(autoconf、automake、m4、pkg-config、gmp、libffi)のみです。
  • shellHook の初回実行時に、次の処理を行います。
    1. $OPAMROOT/.opam を作成します
    2. 空の oxcaml-dev スイッチを作成します
    3. 上流リポジトリを opam pin add -ny git+https://github.com/oxcaml/oxcaml でピン留めします
    4. opam switch set-invariant --packages oxcaml-dev で不変条件を設定します
  • コンパイラーの実際のビルドは自動実行されません(5〜20 分、約 1 GB かかります)。ユーザーが明示的に実行します。
    opam install oxcaml-dev
    opam install dune merlin ocaml-lsp-server ocamlformat utop
    
  • 対応環境:arm64 macOS/arm64 Linux/x86_64 Linux。x86_64 macOS でも動作しますが、公式にはサポートされていません。
  • ocaml テンプレートは「同じ opam インフラストラクチャを使用しつつ、別のスイッチを使う」ため、2 つのテンプレートを切り替えて使用できます。

apm.nix の仕組み

microsoft/apm は npm パッケージではなく、PyInstaller でバンドルされたネイティブバイナリとして配布されています。

  • _internal/ には Python 3.12 ランタイムと依存ライブラリが含まれています
  • apm バイナリ単体では、兄弟ディレクトリとして _internal を参照するため、取り出して単独で使用することはできません
  • Linux では、autoPatchelfHook が glibc/libstdc++/zlib へのリンクを書き換え、nix ストア内を参照するようにします
  • すべてのファイルは $out/libexec/apm/ の下に配置され、$out/bin/apm はそこを指す makeWrapper のラッパーです
  • dontStrip = true と dontPatchELF = true が必要です — PyInstaller は Mach-O/ELF の末尾に PKG アーカイブを追加します。stdenv のデフォルトの strip/patchelf は末尾を切り落とすため、これらを無効にしないと、実行時に Could not load PyInstaller's embedded PKG archive エラーが発生します。

バージョンの更新手順:

# 1. Fetch the SHA256s for the new release
for a in darwin-arm64 darwin-x86_64 linux-arm64 linux-x86_64; do
  curl -sSL "https://github.com/microsoft/apm/releases/download/vX.Y.Z/apm-${a}.tar.gz.sha256"
done

# 2. Replace version and sources.*.sha256 in assets/apm.nix

Nix で npm ツールを扱う方法(2026 年時点)

nodePackages.* の削除後に推奨される方法:

  1. pkgs.pnpm/トップレベルパッケージ — まずこれを試してください。nixpkgs に含まれていれば使用します。
  2. buildNpmPackage + importNpmLock — ロックファイルを使って公式パッケージを自分でビルドします。完全にピン留めされます。
  3. shellHook で NPM_CONFIG_PREFIX="$PWD/.npm-global" を設定 — 不純ですが、プロジェクト内に限定できます。ハッシュの特定に時間をかけすぎる場合の回避策です。
  4. npx/pnpm dlx — 使用頻度の低い CLI 向けです。

避けるべき方法:shellHook に npm install -g を直接記述する(ユーザーの $HOME が汚染されます)、nodePackages.* を参照する(削除済みです)、新規プロジェクトで dream2nix/node2nix を採用する(メンテナンスが縮小しています)。

buildNpmPackage のひな形
my-cli = pkgs.buildNpmPackage {
  pname = "my-cli";
  version = "1.2.3";
  src = pkgs.fetchFromGitHub {
    owner = "owner"; repo = "my-cli"; rev = "v1.2.3";
    hash = "sha256-...";
  };
  # To switch to a lockfile-based build:
  # npmDeps = pkgs.importNpmLock { npmRoot = ./.; };
  npmDepsHash = "sha256-...";
  dontNpmBuild = true;   # no build needed for a pure CLI
};

home-manager(任意)

zsh/git/starship/CLI パッケージなど、ユーザー環境全体を Nix で宣言的に管理する場合は、assets/home-manager/ を使用してください。chezmoi と併用する場合は、所有権を home-manager に移すため、まず dot_zshrc などに対して chezmoi forget を実行してください。

ファイル構成
  • flake.nix — 2 つの出力:macOS デスクトッププロファイル(macos)と、Claude Code web/一時的な Linux 環境向け(ccweb)
  • common.nix — ホスト間で共有(zsh、git、starship、direnv、fzf、基本的な CLI)
  • macos.nix — aarch64-darwin 固有(helix、neovim などの重量級ツール)
  • ccweb.nix — 最小構成の x86_64-linux 設定(コールドスタートを 2 分未満にすることを目指し、軽量に保っています)
使用方法
# 1. Copy
cp -r ~/.claude/skills/nix-setup/assets/home-manager ~/.config/home-manager
cd ~/.config/home-manager

# 2. Edit `username` / `email` at the top of flake.nix
$EDITOR flake.nix

# 3. Apply
home-manager switch --flake .#macos     # macOS
home-manager switch --flake .#ccweb     # Linux for Claude Code web, etc.
公開リポジトリで管理する際の注意点

このテンプレートにはシークレットが一切含まれていません(username/email は flake.nix の変数であり、ホスト名、トークン、known_hosts は含まれていません)。GitHub で公開しても安全です。

SSH 設定、社内ホスト、API トークンなどのシークレットは、次のいずれかの方法で管理してください。

  1. ./private.nix を作成し、imports 経由で読み込みます。.gitignore で除外してください(テンプレートにはすでに含まれています)。
  2. sops-nix/agenix を使って暗号化してコミットします。
Claude Code web でのコールドスタート時間の目安
手順cache.nixos.org を使用使用しない場合
setup_nix.sh20-40 s同じ
flake の評価 + 代替30-90 s2-8 min
有効化(シンボリックリンクの展開)数秒同じ
合計1-2 min4-12 min

ccweb.nix に重いパッケージを追加するほど、コールドスタートに時間がかかります。共通部分は common.nix にまとめ、ccweb.nix には追加パッケージだけを記述してください。

既存のリポジトリへの追加

新規プロジェクト(cp assets/<lang>/flake.nix .)とは異なり、既存のリポジトリには次の注意点があります。

1. cp の前に既存ファイルを保存する

テンプレートの cp は既存の .envrc / flake.nix / .gitignore を上書きします。保存してからマージしてください。

# Save the existing one
[ -f .envrc ] && cp .envrc .envrc.pre-nix

# Drop the template in
cp ~/.claude/skills/nix-setup/assets/typescript/flake.nix .
cp ~/.claude/skills/nix-setup/assets/typescript/.envrc .

# Restore existing exports, etc.
# Merge by hand with .envrc.pre-nix as reference
2. .envrc のマージ方針

既存の .envrc に export DATABASE_URL=... などがある場合は、use flake を先頭に置き、その後に既存の export を残してください(devShell の環境変数がベースとなり、リポジトリ固有の値がそれを上書きします)。

# Correct order
use flake                              # start the devShell first
dotenv_if_exists .env.local            # secrets
export DATABASE_URL="postgres://..."   # preserve existing exports

逆に、先に export を記述すると、use flake によって上書きされるおそれがあります。

3. ロックファイルの移行(npm → pnpm など)

package-lock.json と pnpm-lock.yaml を混在させると、未定義の動作が発生します。移行する場合は、Nix の作業とは別の PRで行ってください。

git switch -c chore/pnpm-migration
rm package-lock.json && rm -rf node_modules
corepack enable && corepack prepare pnpm@10 --activate
pnpm install                          # re-resolve
pnpm why <critical-dep>               # check for major drift
pnpm build && pnpm test               # verify
git add pnpm-lock.yaml package.json && git rm package-lock.json
git commit -m "chore: migrate npm -> pnpm lockfile"

リベース中に pnpm-lock.yaml が競合した場合、手作業で修正せず、pnpm install → git add で再生成してください。

4. CI での actions/setup-node の置き換え

既存の ci.yml の Node 関連ステップを、Nix 化の差分に合わせて書き換えてください。

-      - uses: actions/setup-node@v7
-        with:
-          node-version: 24
-          cache: pnpm
-      - run: pnpm install --frozen-lockfile
-      - run: pnpm test
+      - uses: DeterminateSystems/nix-installer-action@main
+      - uses: DeterminateSystems/magic-nix-cache-action@main
+      - run: nix develop --command just ci

pnpm install --frozen-lockfile && pnpm build && pnpm test を just ci 内に定義してください(justfile に移してください)。コールドビルドを避けるには、actions/cache を使って pnpm ストアを個別に保持するのがポイントです。

5. モノレポの扱い

pnpm-workspace.yaml / turborepo / Nx を使うモノレポでは、ルートに flake.nix を 1 つ配置すると、すべてのワークスペースで nix develop を共有できます。パッケージごとの開発ツールは package.json の devDependencies に置き、nix は言語ランタイムと横断的に使うツール(just / ast-grep)に限定してください。

6. 既存の .gitignore とのマージ

assets/ocaml/.gitignore または assets/oxcaml/.gitignore をコピーすると、既存の .gitignore が上書きされます。マージが必要です。

  • result / result-*(Nix のビルド成果物)は必ず追加してください
  • .direnv/(nix-direnv のキャッシュ)を追加してください

direnv との統合

各言語テンプレートには .envrc が含まれています。flake.nix と一緒にコピーすると、cd 時に devShell が自動的に適用されます。

cp ~/.claude/skills/nix-setup/assets/apm.nix .
cp ~/.claude/skills/nix-setup/assets/rust/flake.nix .
cp ~/.claude/skills/nix-setup/assets/rust/.envrc .
direnv allow                             # approve once at the start

nix-direnv が必要です — 通常の direnv は cd のたびに flake を再評価するため、10-60 s かかります。nix-direnv は結果をキャッシュし、GC ルートも作成するため、100 ms 未満に短縮できます。assets/home-manager/common.nix では、programs.direnv.nix-direnv.enable = true によってすでに有効になっています。

同梱されている .envrc のパターン:

  • moonbit:use flake のみ(最小構成)
  • rust:use flake + watch_file rust-toolchain.toml — ツールチェーンの切り替え時に自動再読み込み
  • typescript / python-uv:use flake + dotenv_if_exists .env.local — ローカルの API キーなどを読み込み
エディターとの統合

VS Code の direnv.direnv 拡張機能、または Helix / Neovim 用の direnv プラグインをインストールすると、LSP サーバーが devShell の PATH を継承します。rust-analyzer は flake.nix の rustToolchain を検出し、moon ide は overlay 版の moon を取得します。

GC ルートのクリーンアップ
nix-direnv-prune     # detect and remove unused .direnv

約 6 か月ごとに実施してください。/nix/store が肥大化し始めたときも実施してください。

GitHub Actions

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7

      - uses: DeterminateSystems/nix-installer-action@main
      - uses: DeterminateSystems/magic-nix-cache-action@main

      - name: Run tests in dev shell
        run: nix develop --command just test

magic-nix-cache-action は Nix ストアを無料の GitHub Actions キャッシュに保存します。個人プロジェクトには十分です。大規模なケースでは、Cachix / attic を検討してください。

トラブルシューティング

error: experimental Nix feature 'nix-command' is disabled
mkdir -p ~/.config/nix
echo 'experimental-features = nix-command flakes' >> ~/.config/nix/nix.conf
error: cannot build on ... due to sandbox

コンテナー環境や rootless 環境では、サンドボックスが機能しません。/etc/nix/nix.conf に sandbox = false を追加してください(setup_nix.sh がこの設定を行います)。

error: attribute 'pnpm' missing / nodePackages.pnpm が見つからない

nixpkgs >= 24.11 では、nodePackages.* は削除されています。トップレベルの pkgs.pnpm を使用してください。

macOS での /nix/store の権限エラー

Determinate インストーラーの使用をおすすめします。Apple Silicon で手動で行うには、APFS ボリュームの分割が必要です。

autoPatchelfHook の失敗(libstdc++.so.6 not found)

stdenv.cc.cc.lib を buildInputs に追加してください。apm.nix で使用している修正と同じです。

PyInstaller でバンドルされたバイナリ(apm など)の場合、埋め込みの CPython _ssl/ _hashlib モジュールも libssl.so.3/libcrypto.so.3 にリンクしています。そのため、 pkgs.openssl も buildInputs に追加してください。macOS では autoPatchelfHook が スキップされるため、この問題は Linux(CI など)でのみ発生します。

flake inputs の更新
nix flake update              # all inputs
nix flake update nixpkgs      # individual
macOS の Nix サンドボックスで direnv-2.37.x のビルドがいつまでも終わらない

Determinate Nix サンドボックスを使って macOS 上で direnv 2.37.x をローカルビルドすると、./test/direnv-test.zsh がいつまでも停止します。症状:building '/nix/store/...-direnv-2.37.x.drv'... のまま、CPU 使用率がほぼ 0 の状態で数十分経過し、子プロセスの zsh ./test/direnv-test.zsh も 0:00.01 のまま停止します。

修正方法:overlay を使って、direnv の doCheck を全体的に無効にします。programs.direnv.package だけに適用しても不十分です。nix-direnv は元の direnv を伝播依存関係として持つため、その経路でテストフェーズが実行されます。

# common.nix (home-manager) or any nixpkgs consumer
nixpkgs.overlays = [
  (_: prev: {
    direnv = prev.direnv.overrideAttrs (_: { doCheck = false; });
  })
];

cache.nixos.org から、お使いのプラットフォーム用のビルド済み direnv 2.37.x が提供されたら、オーバーライドを削除してください。

direnv 2.37.x が DIRENV_LOG_FORMAT/DIRENV_LOG_FILTER を無視する

export DIRENV_LOG_FORMAT="" を設定しても、2.37.x 以降は direnv のログを抑制できません。環境変数の処理方法が変更され、direnv は direnv.toml のみを読み取るようになりました。シェルを起動するたびに表示される direnv: loading … / using devbox / export +AR +AS +CC … などのログも、引き続き出力されます。

修正方法:代わりに ~/.config/direnv/direnv.toml を作成します。home-manager を使う場合:

programs.direnv.config.global.log_format = "";

home-manager を使わない場合:

# ~/.config/direnv/direnv.toml
[global]
log_format = ""

エラーと警告は引き続き表示されます。抑制されるのは通常のステータス行のみです。

参考資料

コメント