mac-cain13 / R.swift

Strong typed, autocompleted resources like images, fonts and segues in Swift projects
MIT License
9.51k stars 764 forks source link

Can't archive app (macCatalyst): Command PhaseScriptExecution failed with a nonzero exit code #801

Open antfisher opened 1 year ago

antfisher commented 1 year ago

Archiving build for macCatalyst is always failed with error:

PhaseScriptExecution R.swift\ generate\ resources\ for\ application\----/Users/-------/Library/Developer/Xcode/DerivedData/-----cgdjxjbhuvkkviehgyewavizhdoh/Build/Intermediates.noindex/ArchiveIntermediates/----/IntermediateBuildFilesPath/----.build/Release-maccatalyst/----.build/Script-C28EBBAA297DAB5B00847376.sh (in target '----' from project '----')
    cd /Users/--------/WorkProjects/----
    /bin/sh -c /Users/-------/Library/Developer/Xcode/DerivedData/-----cgdjxjbhuvkkviehgyewavizhdoh/Build/Intermediates.noindex/ArchiveIntermediates/----/IntermediateBuildFilesPath/----.build/Release-maccatalyst/----.build/Script-C28EBBAA297DAB5B00847376.sh
sandbox-exec: execvp() of '//Users/--------/Library/Developer/Xcode/DerivedData/-----cgdjxjbhuvkkviehgyewavizhdoh/Build/Intermediates.noindex/ArchiveIntermediates/----/BuildProductsPath/Release/rswift' failed: No such file or directory
Command PhaseScriptExecution failed with a nonzero exit code

R.swift installed using SPM. M1 pro mac used. The issue is reproducible only for archive builds and only for macCatalyst.

Update: After some research, I found that the reason for the issue is a wrong path to rswift executable. :)

#if canImport(XcodeProjectPlugin)
import XcodeProjectPlugin

extension RswiftGeneratePublicResources: XcodeBuildToolPlugin {
    func createBuildCommands(context: XcodePluginContext, target: XcodeTarget) throws -> [Command] {

        let resourcesDirectoryPath = context.pluginWorkDirectory
            .appending(subpath: target.displayName)
            .appending(subpath: "Resources")

        try FileManager.default.createDirectory(atPath: resourcesDirectoryPath.string, withIntermediateDirectories: true)

        let rswiftPath = resourcesDirectoryPath.appending(subpath: "R.generated.swift")

        let description: String
        if let product = target.product {
            description = "\(product.kind) \(target.displayName)"
        } else {
            description = target.displayName
        }

        return [
            .buildCommand(
                displayName: "R.swift generate resources for \(description)",
                executable: try context.tool(named: "rswift").path,
                arguments: [
                    "generate", rswiftPath.string,
                    "--target", target.displayName,
                    "--input-type", "xcodeproj",
                    "--bundle-source", "finder",
                    "--access-level", "public",
                ],
                outputFiles: [rswiftPath]
            ),
        ]
    }
}

#endif

As you can see, the path to the executable is produced with context.tool(named: "rswift").path. And it generates something like this: ...DerivedData/APP_NAME/Build/Intermediates.noindex/.../BuildProductsPath/Release/rswift And an executable can be found with this path, but only while building for ios. When archiving for MacCatalyst the right path should be: ...DerivedData/APP_NAME/Build/Intermediates.noindex/.../BuildProductsPath/Release-maccatalyst/rswift

So it seems like it is an SPM bug

tomlokhorst commented 1 year ago

From the error message, this looks similar to: https://github.com/mac-cain13/R.swift/issues/798

deloitteshalem commented 1 year ago

@antfisher were you able to get past this?

marekpridal commented 1 year ago

I think it's different to #798 and I am unable to get around this. Here is the sample project with R.swift failing on Archive for Mac Catalyst.

rswift-catalyst.zip

antfisher commented 1 year ago

From the error message, this looks similar to: #798

Seems like it is different.

@antfisher were you able to get past this?

@deloitteshalem No. But I've updated my first post. Now it should be easier to create a temporary fix.

tomlokhorst commented 1 year ago

Thank you both for doing some more research and providing an example project.

This indeed sounds like an SPM bug.

I'm not quite sure what to do about it. I could try to create some hack to manipulate the path if I can somehow detect that the project is build for MacCatalyst. But a better approach would be to report the bug at SPM, and wait for a bug fix there.

Zeta611 commented 1 year ago

I'm having the same issue too.

kyoji2 commented 1 year ago

I'm encountering the same issue. Does anyone know of any workarounds?

antfisher commented 1 year ago

I'm encountering the same issue. Does anyone know of any workarounds?

Since the problem is specifically related to SPM, the first thing that comes to mind is to try an alternative way to install R.swift, for example, using Cocoapods or manually adding the R.swift library to your project.