Repository navigation
fix: sandbox settings for go development. - #370
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
変更理由
Claude Code の sandbox の中で Go を開発すると、次の問題が出た。
go buildが GOCACHE(~/.cache/go/build)に書けず失敗する。モジュールのキャッシュも読めないos.UserCacheDir()で、macOS では~/Library/Cachesの下になる。ここは sandbox から書けないgo env -wの設定(GOENV)は macOS では~/Library/Application Support/go/envにあり、sandbox から読めない~/.claude/skillsの symlink 先を Bash から読めないcurlで原文のまま確かめられないOS 依存のパス(
~/Library/...)を sandbox の許可に足さずに、他のツールと同じ形で解決する。つまり、置き場所を XDG のディレクトリに移し、~/.cache/<tool>をツール単位で開ける。変更内容
.config/zsh/.zshenv: 次の 3 つを XDG に移すGOENV=$XDG_CONFIG_HOME/go/envGOPLSCACHE=$XDG_CACHE_HOME(gopls が/goplsを足す。gopls v0.23.0 のinternal/filecacheで確認)STATICCHECK_CACHE=$XDG_CACHE_HOME/staticcheck(staticcheck v0.8.1 のlintcmd/cacheで確認。絶対パスが要る)claude/settings.jsonallowReadとallowWrite:~/.cache/go・~/.cache/gopls・~/.cache/staticcheckallowRead:~/.claude/skillsallowedDomains:git-scm.comdocs/claude-code.md途中のコミットで、Go だけを特別に塞ぐ案を入れてから取り下げた。案は、GOCACHE を sandbox 用に分ける、mise の
go.set_gobin = false、GOMODCACHE を読取だけにする、の 3 つ。同じ種類の経路(sandbox から書けるキャッシュや data ディレクトリの中身を、外のプロセスが実行する)は uv・bun・mise にも残るので、ツールを問わず #371 で扱う。影響範囲
対象: claude / zsh
~/.cache/go・~/.cache/gopls・~/.cache/staticcheck~/.claude/skillsgit-scm.com~/.config/go/envに移る。go env -wで入れた設定があれば、移すか入れ直すレビューの着目点
~/.cache/goを丸ごと書込可にしたので、sandbox の外の go が使う GOCACHE(go runの実行ファイルを含む)を sandbox の中から書き換えられる。uv・bun のキャッシュと同じ扱いにして、対処は sandbox から書けるキャッシュと data ディレクトリを、外で実行されうるものとしてどう扱うか検討する #371 に回した~/Library/Application Support/go/telemetry)を読めず、stderr にエラーを 1 行出す。telemetry のディレクトリはos.UserConfigDir()に固定されていて、darwin ではXDG_CONFIG_HOMEを見ず、移す環境変数も無い(go1.27.1 のソースで確認)。OS 依存のパスを足さないため、そのままにした確認手順
sandbox の中の
go run(小さな module)が成功することを、途中のコミットで確かめた。GOCACHE の置き場所が今の構成と違ったときの確認なので、今の構成では確かめていない。go1.27.1、Claude Code 2.1.296、macOS。手動確認
go env GOCACHE GOENVとecho $GOPLSCACHE $STATICCHECK_CACHEを実行し、XDG の下を指すことを確かめるgo build ./...とstaticcheck ./...を実行して成功することを確かめる~/.cache/staticcheckにキャッシュができることを確かめる範囲外 / 既知の問題
~/Library/Caches/staticcheck・~/Library/Caches/goplsは残る。手で消す.config/mise/config.toml・.config/zsh/.zshenvが sandbox から書け、sandbox の外で読み込まれる(作業ツリーにある、sandbox の外で実行される設定をどう塞ぐか検討する #372)