XcodeでiOSアプリをビルドした際に、次のようなエラーが表示されることがあります。
Sandbox: rsync.samba deny(1) file-write-create
このエラーは、Xcodeのビルド処理中に実行されたrsyncが、Sandboxの制限によってファイルやディレクトリを作成できなかった場合に発生します。
特に、CocoaPodsやFramework、ライブラリ、リソースなどをコピーするビルドスクリプトでrsyncが使用されている場合に発生することがあります。
- 「Sandbox: rsync.samba deny(1) file-write-create」とは
- 原因1:User Script Sandboxingが有効になっている
- 解決方法1:ENABLE_USER_SCRIPT_SANDBOXINGを無効にする
- ProjectとTargetの両方を確認する
- 原因2:CocoaPodsのFrameworkコピー処理
- 原因3:CocoaPodsが古い
- 原因4:PodsのBuild Phaseが古い状態で残っている
- 原因5:Run ScriptのInput FilesとOutput Filesが不足している
- 原因6:独自のRun Scriptでrsyncを使用している
- コピー先のパスを確認する
- 原因7:DerivedDataの状態が古い
- Clean Build Folderを実行する
- 原因8:ファイルやフォルダの権限に問題がある
- 原因9:Frameworkのコピー処理が重複している
- エラーが発生しているBuild Phaseを確認する
- よくある解決手順
- Podを再生成する場合
- Apple Silicon Macで発生した場合
- それでも解決しない場合
- まとめ
「Sandbox: rsync.samba deny(1) file-write-create」とは
Xcodeでは、ビルド中にShell Scriptや各種Build Phaseが実行されます。
その処理の中で、FrameworkやBundleなどをコピーするためにrsyncが使われることがあります。
しかし、XcodeのSandbox機能によってスクリプトが書き込みできる場所が制限されている場合、rsyncによるファイル作成が拒否されます。
例えば、Build Logに次のようなメッセージが表示されることがあります。
Sandbox: rsync.samba deny(1) file-write-create Sandbox: rsync.samba deny(1) file-write-create /path/to/file
この場合、rsyncが指定された場所へファイルを作成しようとしましたが、Sandboxによって拒否されています。
rsync.sambaという表示があっても、Sambaのネットワーク共有そのものが原因とは限りません。
多くの場合は、XcodeのビルドスクリプトSandboxとrsyncによるコピー処理の組み合わせが原因です。
原因1:User Script Sandboxingが有効になっている
代表的な原因は、XcodeのUser Script Sandboxingが有効になっていることです。
この設定が有効な場合、Run Script Build Phaseなどのスクリプトがアクセスできるファイルやディレクトリが制限されます。
そのため、CocoaPodsなどが生成したスクリプト内でrsyncを実行すると、コピー先への書き込みが拒否される場合があります。
解決方法1:ENABLE_USER_SCRIPT_SANDBOXINGを無効にする
まず、対象プロジェクトまたはTargetのBuild Settingsを確認します。
Xcodeで次の場所を開きます。
Project → Target → Build Settings
検索欄で次の項目を検索します。
User Script Sandboxing
または次のBuild Setting名を検索します。
ENABLE_USER_SCRIPT_SANDBOXING
設定を次のように変更します。
No
Build Settingとしては次の状態です。
ENABLE_USER_SCRIPT_SANDBOXING = NO
CocoaPodsなどの古いビルドスクリプトでこのエラーが発生している場合、ENABLE_USER_SCRIPT_SANDBOXINGをNOに変更することで解決する場合があります。
ProjectとTargetの両方を確認する
Build Settingsには、Project側とTarget側の両方に設定が存在する場合があります。
Target側で変更しても別の設定が優先されている場合があるため、必要に応じて両方を確認してください。
確認する設定:
Project → Build Settings → User Script Sandboxing Target → Build Settings → User Script Sandboxing
必要に応じて、DebugとReleaseの両方を確認します。
原因2:CocoaPodsのFrameworkコピー処理
CocoaPodsを使用しているプロジェクトでは、Podsが生成したBuild Phase内でrsyncが使用されることがあります。
例えば、次のようなBuild Phaseです。
[CP] Embed Pods Frameworks
または、次のような処理です。
[CP] Copy Pods Resources
これらのスクリプトがFrameworkやリソースをコピーする際にSandboxによって拒否されると、rsync.samba deny(1) file-write-createが発生することがあります。
エラーが[CP] Embed Pods Frameworksの途中で発生している場合は、CocoaPods関連のBuild PhaseとUser Script Sandboxingを最初に確認するとよいでしょう。
原因3:CocoaPodsが古い
古いCocoaPodsや、古いPods設定をそのまま使用しているプロジェクトでは、新しいXcodeのビルド環境と互換性の問題が発生することがあります。
CocoaPodsのバージョンを確認します。
pod --version
必要に応じてCocoaPodsを更新します。
その後、Podを再インストールします。
pod install
または、依存関係を更新する場合は次のコマンドを使用します。
pod update
pod updateは依存ライブラリのバージョンも変更する可能性があります。
単純にPods環境を再生成したい場合は、まずpod installを使用する方が安全です。
原因4:PodsのBuild Phaseが古い状態で残っている
XcodeやCocoaPodsを更新しても、以前生成されたBuild Phaseやスクリプトが残っている場合があります。
この場合はPodsを一度削除してから再生成すると改善することがあります。
ターミナルでプロジェクトディレクトリへ移動し、次のような手順を実行します。
pod deintegrate pod install
その後、Xcodeを開き直してビルドします。
CocoaPodsを使用している場合は、通常.xcodeprojではなく.xcworkspaceを開いてください。
原因5:Run ScriptのInput FilesとOutput Filesが不足している
User Script Sandboxingを有効にしたままビルドスクリプトを使用する場合、スクリプトがアクセスするファイルをInput FilesやOutput Filesとして正しく指定する必要があります。
Xcodeで対象のTargetを開きます。
Target → Build Phases → Run Script
そして、スクリプトが読み込むファイルをInput Files、書き込むファイルをOutput Filesとして登録します。
例えば、スクリプトが次のディレクトリへファイルを書き込む場合です。
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}
適切なOutput FileまたはOutput File Listを設定することでSandboxからアクセスできるようになる場合があります。
原因6:独自のRun Scriptでrsyncを使用している
自分で追加したRun Script内でrsyncを使用している場合も同じエラーが発生することがあります。
例えば、次のようなスクリプトです。
rsync -av "$SOURCE_PATH/" "$DESTINATION_PATH/"
DESTINATION_PATHがSandboxで許可されていない場所の場合、ファイル作成が拒否されます。
この場合は、コピー元とコピー先を確認し、Xcodeのビルドディレクトリ内など適切な場所を使用してください。
コピー先のパスを確認する
エラーメッセージには、書き込みを拒否されたファイルやディレクトリのパスが表示されることがあります。
Build Logでdeny(1) file-write-createの後ろを確認してください。
例えば次のように表示されます。
Sandbox: rsync.samba deny(1) file-write-create /Users/username/.../Framework.framework
このパスを見ることで、どのBuild Phaseが問題を起こしているのか特定しやすくなります。
原因7:DerivedDataの状態が古い
Xcodeの設定やPodsを変更したあとでも、DerivedDataに古いビルド情報が残っていることでエラーが続く場合があります。
XcodeからDerivedDataを削除します。
Xcode → Settings → Locations → Derived Data
または、FinderでDerivedDataを削除します。
~/Library/Developer/Xcode/DerivedData/
削除後、Xcodeで再度ビルドします。
Clean Build Folderを実行する
設定を変更したあと、Clean Build Folderを実行します。
Product → Clean Build Folder
その後、再度ビルドしてください。
通常のCleanだけでは古い情報が残る場合があります。
設定変更後に問題が続く場合は、DerivedDataの削除も試してください。
原因8:ファイルやフォルダの権限に問題がある
コピー先のファイルやディレクトリに書き込み権限がない場合も、rsyncがファイルを作成できないことがあります。
ターミナルで権限を確認します。
ls -la
対象ディレクトリが別のユーザー所有になっていないか確認してください。
ただし、エラーに明確にSandbox:と表示されている場合は、Unixのファイル権限よりもXcodeのSandbox設定が原因である可能性が高くなります。
原因9:Frameworkのコピー処理が重複している
Frameworkを手動でEmbedしている状態で、CocoaPodsや別のパッケージ管理ツールでも同じFrameworkをコピーしていると、Build Phaseの処理が複雑になり、エラーの原因になる場合があります。
TargetのBuild Phasesを確認します。
Target → Build Phases
特に次の項目を確認します。
Link Binary With Libraries Embed Frameworks Copy Bundle Resources [CP] Embed Pods Frameworks
同じFrameworkが複数のBuild Phaseに登録されていないか確認してください。
エラーが発生しているBuild Phaseを確認する
このエラーを解決する際には、単にrsync.samba denyという文字だけを見るのではなく、どのBuild Phaseで発生しているかを確認することが重要です。
例えば次のような表示を探します。
PhaseScriptExecution [CP] Embed Pods Frameworks PhaseScriptExecution [CP] Copy Pods Resources PhaseScriptExecution Run Script
この直後にSandbox: rsync.samba denyが表示されていれば、そのBuild Phaseが原因を特定する手掛かりになります。
よくある解決手順
CocoaPodsを使用しているプロジェクトで次のエラーが発生した場合:
Sandbox: rsync.samba deny(1) file-write-create
まず次の順番で確認します。
1. Build Settingsを開く 2. User Script Sandboxingを確認する 3. ENABLE_USER_SCRIPT_SANDBOXINGをNOにする 4. Clean Build Folderを実行する 5. 再度ビルドする 6. 解決しない場合はPodsを再生成する 7. DerivedDataを削除する
Podを再生成する場合
CocoaPods側のスクリプトに問題がある可能性がある場合は、次のように再生成します。
pod deintegrate pod install
その後、次のファイルを開きます。
プロジェクト名.xcworkspace
そして再度ビルドします。
Apple Silicon Macで発生した場合
Apple Silicon Macでも、このエラーの基本的な原因は同じです。
Intel MacかApple Silicon MacかというCPUの違いよりも、XcodeのSandbox設定やBuild Phaseのスクリプト内容を確認することが重要です。
Rosettaを使用することで必ず解決する種類のエラーではありません。
まずENABLE_USER_SCRIPT_SANDBOXINGやrsyncを実行しているBuild Phaseを確認してください。
それでも解決しない場合
ここまでの方法で解決しない場合は、Build Logを開き、rsyncを実行している直前のコマンドを確認します。
特に次の情報を確認してください。
コピー元のパス コピー先のパス 実行されているBuild Phase Input Files Output Files ENABLE_USER_SCRIPT_SANDBOXING
どのパスへの書き込みが拒否されているか確認することで、原因を絞り込めます。
まとめ
XcodeのSandbox: rsync.samba deny(1) file-write-createは、ビルド中に実行されたrsyncがSandboxによってファイルやディレクトリの作成を拒否された場合に発生するエラーです。
特にCocoaPodsの[CP] Embed Pods Frameworksや[CP] Copy Pods ResourcesなどのBuild Phaseで発生することがあります。
まずBuild SettingsのUser Script Sandboxingを確認し、必要に応じてENABLE_USER_SCRIPT_SANDBOXING = NOへ変更してください。
それでも解決しない場合は、CocoaPodsの再生成、Build PhaseのInput Files・Output Files、DerivedData、コピー先のパスなどを確認します。
このエラーでは、単純なファイル権限だけでなく、XcodeのUser Script Sandboxingによってrsyncの書き込みが制限されていないかを確認することが重要です。
