🚀

Xcode CloudでBuild Tool Pluginがパーミッションエラーで落ちるとき

2024/01/05に公開
5

ファイル生成を伴うBuild Tool PluginをXcode Cloud上で動かすとき、ファイルを実際に書き出す処理でパーミッション不足と言われてfailすることがある。
手元のMacBookでは動いていたので、Xcode Cloud特有の原因があるのかと思って調査した。

結論

ファイルの書き出しを、try someString.write(to: outputURL, atomically: true, encoding: .utf8) このように書いているとパーミッションエラーでfailする。

atomicallytrue のとき、テキストをまず中間ファイルに書き出して、それが終わってから目的地にそのファイルを移動する、という挙動になる。その中間ファイルがパッケージの pluginWorkDirectory の外側に置かれようとして、Xcode Cloudの制約に引っかかってるものと思われる(/tmp の下とかじゃないのかな?)。

エラーは、目的地のファイル名に対してパーミッションエラーであるかのような説明をしてくるのでややこしかった。

対応

atomicallyfalse にするとファイルへの書き出しが成功するようになる。atomicityが重要でない(多くはそうだろう)ケースではこれでXcode Cloud上でも動くようになる。

関連

https://github.com/liamnichols/xcstrings-tool/pull/36

Discussion

hiragramhiragram

StringじゃなくてDataのwriteメソッドでも通りました。

Daiki MatsudateDaiki Matsudate

automatically が true のとき、テキストをまず中間ファイルに書き出して

atomically です。

hiragramhiragram

オアー そういうことだったのか
確かにXcodeCloud環境だとデフォとは違う場所にDerivedDataが置かれてますね