如何使用提供两个库的本地Swift包?

7jmck4yq  于 2023-06-21  发布在  Swift
关注(0)|答案(2)|浏览(88)

我有一个本地swift包 Foo,它提供了两个不同的库 FooFooB。现在我想在另一个本地包 *Bar * 中使用它们。我只能通过路径声明获得整个包。是否有一种方法来命名/指定应该使用哪个库?我想在我的Bar套餐中使用FooB

let package = Package(
    name: "Foo",
    products: [
        .library(name: "Foo", targets: ["Foo"]),
        .library(name: "FooB", targets: ["FooB"])
    ]

...)
let package = Package(
    name: "Bar",
   dependencies: [
        .package(path: "Foo"),
        .package(path: "FooB") // this one does not work
    ],

...)
// inside package Bar

import Foo
import FooB // this is throwing "no such module 'FooB'"
wwtsj6pe

wwtsj6pe1#

这里有一个具体的例子:

Foo

播放Foo,IGListKit Package.swift
摘录:

products: [
    .library(name: "IGListDiffKit",
             type: .static,
             targets: ["IGListDiffKit"]),
    .library(name: "IGListKit",
             type: .static,
             targets: ["IGListKit"]),

...

targets: [
    .target(
        name: "IGListDiffKit",
        path: "spm/Sources/IGListDiffKit"
    ),
    .target(
        name: "IGListKit",
        dependencies: ["IGListDiffKit"],
        path: "spm/Sources/IGListKit"
    ),

酒吧

Bar的角色中,整体而言:

import PackageDescription

let package = Package(
    name: "HistoryList",
    platforms: [.iOS(.v13)],
    products: [
        .library(
            name: "HistoryList",
            targets: ["HistoryList"]),
    ],
    dependencies: [
        .package(name: "IGList", url: "https://github.com/Instagram/IGListKit", from: "4.0.0"),
    ],
    targets: [
        .target(
            name: "HistoryList",
            dependencies: [
                .product(name: "IGListDiffKit", package: "IGList"),
                .product(name: "IGListKit", package: "IGList")
            ]
        ),
    ]
)

剪枝包

导入后,Foo的Package.swift在Package Dependencies部分只声明:

let package = Package(
    name: "IGListKit",
    products: [
        .library(name: "IGListKit", targets: ["IGListKit"])
    ],
    targets: [
        .target(
            name: "IGListKit",
            path: "Source"
        )
    ]
)

似乎Xcode / SPM正在修剪导入的包,使其只包含该包中三个库中的一个。(最初,第二个库的代码丢失,一个my my语法导致它被拉出来,但第一个库没有被看到。他们现在都在那里,但只看到一个。
我不能确定一个语法来使它把这两个。

当前错误

product 'IGListDiffKit' required by package 'ios-malauzai-history-list' target 'HistoryList' not found in package 'IGList'.

Xcode 15.0测试版(15 A5160 n)

其他想法

package(name:url:_:)(以及Package.Dependencyname属性)已被弃用,但您需要在特定的目标依赖项中使用包依赖项的名称。
这让我相信应该使用一种更新的语法。

解析

Instagram不完全支持IGListKit的Swift包管理器

  • (有比IGListKit更好的解决方案,但这是在遗留代码中。目前,在4.0.0标签和仓库的HEAD之间有191个提交;已经3年多了,因为发布了。)*

在这种情况下的问题是,最新的标记(截至2023年6月)是4.0.0标记,而Package.swift文件的版本实际上是我收到的缩写版本。
当我更新时,一切都正常,并简化了描述,以查看添加支持的提交。(本可以使用main分支,但它会不断变化。

…
    dependencies: [
        .package(url: "https://github.com/Instagram/IGListKit", revision: "c9e045c9425a160871a7915260d07a6c273b548d")
    ],
    targets: [
        .target(
            name: "HistoryList",
            dependencies: [
                .product(name: "IGListKit", package: "IGListKit"),
                .product(name: "IGListDiffKit", package: "IGListKit")
            ]
        ),
…
lb3vh1jj

lb3vh1jj2#

以下是你如何实现它:如果你想在另一个包中使用它,请指定依赖于本地Swift包中特定库的目标。
为了正确地本地打包Foo,每个库都必须在单独的目标中表示。为了实现这一点,请按以下方式将您的Package.swift修改为Foo:

let package = Package(
    name: "Foo",
    products: [
        .library(name: "Foo", targets: ["Foo"]),
        .library(name: "FooB", targets: ["FooB"])
    ],
    targets: [
        .target(name: "Foo", dependencies: []),
        .target(name: "FooB", dependencies: ["Foo"])
    ]
)

Foo和FooB是定义的两个目标,其中FooB依赖于Foo。
然后你可以通过重新排列文本在Bar包中指定对FooB的依赖。

let package = Package(
    name: "Bar",
    dependencies: [
        .package(path: "../Foo")
    ],
    targets: [
        .target(
            name: "Bar",
            dependencies: [
                .product(name: "FooB", package: "Foo")
            ]
        )
    ]
)

Bar目标依赖于FooB库,通过使用product函数指向包“Foo”及其库“FooB”来指定。
现在,您的Bar包可以通过导入FooB库来使用它。

import FooB

从Foo包正确导入FooB库可以通过对Bar包进行特定更改来完成。
根据项目的目录结构和包名称,确保相应地调整路径和包名称。:)

相关问题