🚀
Xcode CloudでBuild Tool Pluginがパーミッションエラーで落ちるとき
ファイル生成を伴うBuild Tool PluginをXcode Cloud上で動かすとき、ファイルを実際に書き出す処理でパーミッション不足と言われてfailすることがある。
手元のMacBookでは動いていたので、Xcode Cloud特有の原因があるのかと思って調査した。
結論
ファイルの書き出しを、try someString.write(to: outputURL, atomically: true, encoding: .utf8)
このように書いているとパーミッションエラーでfailする。
atomically
が true
のとき、テキストをまず中間ファイルに書き出して、それが終わってから目的地にそのファイルを移動する、という挙動になる。その中間ファイルがパッケージの pluginWorkDirectory
の外側に置かれようとして、Xcode Cloudの制約に引っかかってるものと思われる(/tmp
の下とかじゃないのかな?)。
エラーは、目的地のファイル名に対してパーミッションエラーであるかのような説明をしてくるのでややこしかった。
対応
atomically
を false
にするとファイルへの書き出しが成功するようになる。atomicityが重要でない(多くはそうだろう)ケースではこれでXcode Cloud上でも動くようになる。
関連
Discussion
StringじゃなくてDataのwriteメソッドでも通りました。
atomically
です。やべ!恥ずかし!直しました!ありがとう!
これが原因っぽくてXcodeのSwiftが更新されるのを待っています… https://github.com/apple/swift-package-manager/issues/6948
オアー そういうことだったのか
確かにXcodeCloud環境だとデフォとは違う場所にDerivedDataが置かれてますね