在项目中使用Swift Package用于多个目标和平台?

hjzp0vay  于 2023-06-21  发布在  Swift
关注(0)|答案(6)|浏览(104)

我有一个有多个目标的项目,比如一个iOS应用程序,一个watchOS应用程序和一些框架。如何将相同的Swift包分配给所有目标?Xcode只允许我选择一个:

如果我尝试再次添加Swift包,以便将其分配给项目中的另一个目标,我会得到一个错误:

正确的做法是什么?下面是Swift包中的包清单的样子。在这方面有什么需要做的吗?或者在Xcode中有什么需要做的吗?

import PackageDescription

let package = Package(
    name: "Alamofire",
    platforms: [
        .macOS(.v10_12),
        .iOS(.v10),
        .tvOS(.v10),
        .watchOS(.v3)
    ],
    products: [
        .library(
            name: "Alamofire",
            targets: ["Alamofire"])
    ],
    targets: [
        .target(
            name: "Alamofire",
            path: "Source")
    ],
    swiftLanguageVersions: [.v5]
)
s6fujrry

s6fujrry1#

我遇到了同样的问题,我只找到了两个解决方案:
首先,将包添加到第一个目标:

然后,第一个选项将转到另一个目标“常规”选项卡,并在“框架”、“库”和“嵌入式内容”中按+,选择包并按“添加”:

另一个选项是构建Phases,并在Link Binary With Libraries中重复类似的方式:

目前,我只知道这个选项,我希望将来苹果可以通过多重检查来改进这一点。

bqucvtff

bqucvtff2#

除了diego-carrera给出的解决方案外,我还必须重置swift包缓存,以使该包可用于框架对话框中的所有目标。
在Xcode中:File -> Swift Packages -> Reset Package Caches

t2a7ltrp

t2a7ltrp3#

我在尝试将新的Numerics包添加到我的项目时遇到了同样的问题,该项目包含一个名为CreativeCoding的iOS目标和一个名为mandelbrot的Mac命令行目标。
我以Xcode中的正常方式将包添加到第一个目标。然后我退出Xcode,在编辑器(当然是vi)中打开项目.pbxproj文件。然后,我下到 / 开始PBXNativeTarget部分 / 注解,找到了我的CreativeCoding目标,并从packageProductDependencies容器中复制了3行新的Numerics包(Numerics、ComplexModule、RealModule),并将它们粘贴到我的mandelbrot命令行目标的packageProductDependencies容器中。

/* Begin PBXNativeTarget section */
            8B083F4B24F0B40000A225C8 /* CreativeCoding */ = {
                    isa = PBXNativeTarget;
                    buildConfigurationList = 8B083F6024F0B40200A225C8 /* Build configuration list for PBXNativeTarget "CreativeCoding" */;
                    buildPhases = (
                            8B083F4824F0B40000A225C8 /* Sources */,
                            8B083F4924F0B40000A225C8 /* Frameworks */,
                            8B083F4A24F0B40000A225C8 /* Resources */,
                    );
                    buildRules = (
                    );
                    dependencies = (
                    );
                    name = CreativeCoding;
                    packageProductDependencies = (
                            8B22BD29263E328B00867530 /* ComplexModule */,
                            8B22BD2B263E328B00867530 /* RealModule */,
                            8B22BD2D263E328B00867530 /* Numerics */,
                    );
                    productName = CreativeCoding;
                    productReference = 8B083F4C24F0B40000A225C8 /* CreativeCoding.app */;
                    productType = "com.apple.product-type.application";
            };
            8BE83F4F26213D1C00663AC9 /* mandelbrot */ = {
                    isa = PBXNativeTarget;
                    buildConfigurationList = 8BE83F5626213D1D00663AC9 /* Build configuration list for PBXNativeTarget "mandelbrot" */;
                    buildPhases = (
                            8BE83F4C26213D1C00663AC9 /* Sources */,
                            8BE83F4D26213D1C00663AC9 /* Frameworks */,
                            8BE83F4E26213D1C00663AC9 /* CopyFiles */,
                    );
                    buildRules = (
                    );
                    dependencies = (
                    );
                    name = mandelbrot;
                    packageProductDependencies = (
                            8BB120942622CCB8008EDAB0 /* ArgumentParser */,
                            8B22BD29263E328B00867530 /* ComplexModule */,
                            8B22BD2B263E328B00867530 /* RealModule */,
                            8B22BD2D263E328B00867530 /* Numerics */,
                    );
                    productName = mandlebrot;

这对我来说可能更容易一点,因为我已经在我的第二个目标上有了ArgumentParser包,我只是追加了3个新行。但是,您可以执行相同的操作,并向第二个目标添加一个临时包。
然后我进入Xcode,像正常一样构建了两个目标,它工作了。

wswtfjt7

wswtfjt74#

如果在添加依赖项之后添加新目标,则必须从项目中移除依赖项,然后再将其添加回。否则,库将不会显示在框架选择器中。
令人恼火的是,Xcode可以用Swift包管理器做的一件可靠的事情就是崩溃。因此,请确保您有项目的备份,因为它可能会进入一种状态,只要打开它就会崩溃Xcode。

jbose2ul

jbose2ul5#

最新版本是Xcode 14.2。我看不到我想添加到目标的框架,但更新到最新的Xcode 14.3.1解决了这个问题。我能够看到我想添加到第二个目标的Swift包,并成功添加它。
我使用了Diego的答案https://stackoverflow.com/a/58079416/2929892来添加缺少的框架。

zrfyljdw

zrfyljdw6#

在Xcode 12中,你只需要选择第二个目标并添加依赖项(swift包)。

相关问题