nix-setup について
再現可能な Nix 開発環境の構築ガイドで、devbox と純粋な flake の両方を扱います。複数言語のテンプレートとサンドボックス環境向けの導入手順を備え、プロジェクトに応じた設定を支援します。
主な機能
- 01devbox と flake の選択指針
- 02複数言語向け flake テンプレート
- 03サンドボックス環境用 Nix インストーラー
- 04プロジェクト単位の依存関係と環境設定
- 05GitHub Actions の設定例
活用シーン
- 01新規プロジェクトに再現可能な環境を作成
- 02コンテナや Claude Code web で Nix を設定
- 03言語ツールチェーンと依存関係を構成
- 04GitHub Actions から devbox タスクを実行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mizchi/ skills --skill nix-setupインストール後、Claude Code で/nix-setupを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdassets/apm.nixsetup_nix.shassets/devbox/devbox.jsongh_action_example.yamlassets/haskell/.envrcflake.nixassets/home-manager/.gitignoreccweb.nixcommon.nixflake.nixmacos.nixassets/moonbit/.envrcflake.nixassets/ocaml/.envrc.gitignoreflake.nixassets/oxcaml/.envrc.gitignoreflake.nixassets/python-uv/.envrcflake.nixassets/rust/.envrcflake.nixassets/typescript/.envrcflake.nixevals/eval.yamlledger.yamlevals/tasks/scenario-a-devbox-default.yamlscenario-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 の初回実行時に、次の処理を行います。
$OPAMROOT/.opamを作成します- 空の
oxcaml-devスイッチを作成します - 上流リポジトリを
opam pin add -ny git+https://github.com/oxcaml/oxcamlでピン留めします 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.* の削除後に推奨される方法:
pkgs.pnpm/トップレベルパッケージ — まずこれを試してください。nixpkgs に含まれていれば使用します。buildNpmPackage+importNpmLock— ロックファイルを使って公式パッケージを自分でビルドします。完全にピン留めされます。- shellHook で
NPM_CONFIG_PREFIX="$PWD/.npm-global"を設定 — 不純ですが、プロジェクト内に限定できます。ハッシュの特定に時間をかけすぎる場合の回避策です。 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 トークンなどのシークレットは、次のいずれかの方法で管理してください。
./private.nixを作成し、imports経由で読み込みます。.gitignoreで除外してください(テンプレートにはすでに含まれています)。sops-nix/agenixを使って暗号化してコミットします。
Claude Code web でのコールドスタート時間の目安
| 手順 | cache.nixos.org を使用 | 使用しない場合 |
|---|---|---|
setup_nix.sh | 20-40 s | 同じ |
| flake の評価 + 代替 | 30-90 s | 2-8 min |
| 有効化(シンボリックリンクの展開) | 数秒 | 同じ |
| 合計 | 1-2 min | 4-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 = ""
エラーと警告は引き続き表示されます。抑制されるのは通常のステータス行のみです。