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



我有一个本地swift包Foo,它提供了两个不同的库FooFooB。现在我想在另一个本地包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'"

下面是一个具体的例子:

Foo

playFoo, 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")
]
),
]
)

<<h2>修剪包/h2>导入后,Package DependenciesFoo的Package.swift节只声明:

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

似乎Xcode/SPM正在修剪导入的包,只包含这个包中的三个库中的一个。(最初,第二个库的代码丢失了,因为我的语法导致它被删除,但第一个库没有被看到。他们现在都在那里,但只看到一个。

我不能确定一个语法,使它把两个。

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

Xcode 15.0 beta版(15A5160n)

额外的想法

package(name:url:_:)(以及Package.Dependencyname属性)已经弃用,但是您需要使用包依赖的名称来在特定的目标依赖中使用。

这让我相信应该使用一种更新的语法。

的决议

Instagram不完全支持Swift Package Manager for IGListKit

(有比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")
]
),
…

你可以这样做:如果你想在另一个包中使用它,请指定依赖于本地Swift包中的特定库的目标。

〇对于Foo的适当的本地包装,每个库在单独的目标中表示是必要的。为了实现这一点,用以下方式修改Foo的Package.swift:

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包进行特定的更改来完成。

根据项目的目录结构和包名,确保相应地调整了路径和包名。:)

相关内容

  • 没有找到相关文章

最新更新