我有一个本地swift包Foo,它提供了两个不同的库Foo和FooB。现在我想在另一个本地包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 Dependencies中Foo
的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.Dependency
的name
属性)已经弃用,但是您需要使用包依赖的名称来在特定的目标依赖中使用。
这让我相信应该使用一种更新的语法。
的决议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包进行特定的更改来完成。
根据项目的目录结构和包名,确保相应地调整了路径和包名。:)