运行 Swift Package Plugin 时 Xcode Cloud 无写入权限

Ric*_*zio 6 swift swift-package-manager xcode-cloud swift-package-plugin

我有这个插件

struct Main: BuildToolPlugin {
  func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] {
    let inputFolder = target.directory.appending("Image")
    let output = context.pluginWorkDirectory.appending("GeneratedImageAssets.swift")
    return [
      .buildCommand(
        displayName: "Running ImageAssets parser",
        executable: try context.tool(named: "ImageAssetsParser").path,
        arguments: [inputFolder.string, output.string],
        environment: [:],
        inputFiles: [inputFolder],
        outputFiles: [output]
      )
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

ImageAssetsParser是一个executableTarget快速代码,用于扫描文件夹并将它们写入output插件发送的文件夹中。

虽然在本地它可以正常工作,但在 Xcode Cloud 上我收到权限错误:

在此输入图像描述

奇怪的是,我还有一个prebuildCommand插件,它使用swiftgen, 作为 anartifactbundle并且它工作正常,它写在同一个文件夹中。

我错过了什么吗?

Ric*_*zio 1

几个月后,偶然我发现了问题所在!

在我的插件实现中,我通过写入文件

"""
// auto generated swift file

// ... the content
""".write(to: output, atomically: true, encoding: .utf8)
Run Code Online (Sandbox Code Playgroud)

使用atomically: true是问题所在:这意味着 swift 将整个内容写入放置在其他地方的临时文件中,而 Xcode Cloud 此时没有权限!

使用atomically: false该文件直接写入我们的输出文件,这是context.pluginWorkDirectory.appending("GeneratedImageAssets.swift")这里授予的权限!