SwiftPM 可执行目标 - 资产可以在 Xcode 中工作,但不能在命令行中工作

问题描述 投票:0回答:1

背景

考虑一个带有

MyLibrary
MyExecutable
目标的简单 Swift 包。 目的是让
MyExecutable
使用
MyLibrary
(有图像)。

MyLibrary
目标有2个文件,一个
Resources/Assets.xcassets
目录(其中有1个名为“Test”的图像)和一个
Images.swift
文件,如下所示:

private extension NSImage {
    static let test = Bundle.module.image(forResource: "Test")
}

public struct Images {
    public static func printTestExists() {
        print("Exists: \(NSImage.test != nil)")
    }
}

请特别注意此处使用

Bundle.module
MyExecutable
仅包含一个
main.swift
文件,该文件导入
MyLibrary
并运行:

Images.printTestExists()

问题

在 Xcode 中运行

MyExecutable
方案时,它按预期打印:

Exists: true

但是,当从命令行运行可执行文件时:

swift run -c release MyExecutable

它因错误而崩溃:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSBundle imageForResource:]: unrecognized selector sent to instance

问题

为什么资产似乎无法从命令行运行?我只执行

swift run
命令,因此可执行文件应该可以访问库包,对吧?

包.swift

资产按照您的预期作为资源进行处理

let package = Package(
    name: "MyLibrary",
    platforms: [.macOS(.v13)],
    products: [
        .library(name: "MyLibrary", targets: ["MyLibrary"]),
        .executable(name: "MyExecutable", targets: ["MyExecutable"])
    ],
    targets: [
        .target(name: "MyLibrary", resources: [.process("Resources")] ),
        .executableTarget(name: "MyExecutable", dependencies: ["MyLibrary"])
    ]
)

旁白

从命令行使用以下 SwiftUI 代码同样会不会显示图像,但在从 Xcode 运行时可以工作:

Image("Test", bundle: .module)

附件

Package Files

参考文献

我在 Swift 论坛

上发现了类似的问题
swift xcode macos image swift-package-manager
1个回答
0
投票

只回答我自己的问题,我相信问题只是swift run不支持资产。希望未来的答案能够向我们展示如何使其发挥作用。

我设法使用 

xcodebuild

命令解决了该问题

# Set this to what you want (this is inside the SPM .build directory)
derivedDataPath=".build/xcode-derived-data"
    
xcodebuild build \
    -configuration release \
    -scheme MyExecutable \
    -sdk macosx \
    -destination 'platform=macOS' \
    -derivedDataPath "$derivedDataPath"
   
$derivedDataPath/Build/Products/release/MyExecutable

查看其他目的地运行

xcodebuild -showdestinations -scheme MyExecutable

不需要

需要制作一个.xcodeproj文件,这很好,所以我们可以留在SPM领域。尽管如此,

swift run
会更好,但我希望这能暂时有所帮助。
    

© www.soinside.com 2019 - 2024. All rights reserved.