斯威夫特包管理器。错误:找到多个名称为...的包?

Posted

技术标签:

【中文标题】斯威夫特包管理器。错误:找到多个名称为...的包?【英文标题】:Swift package manager. Error: Found multiple packages with the name...? 【发布时间】:2017-11-29 19:35:16 【问题描述】:

让我们说:

B 是一个依赖于 CommonLib 的库 App依赖B和CommonLib

这是他们的主要节日

B 的 Package.swift:

import PackageDescription
let package = Package(
    name: "B",
    products: [
        .library(
            name: "B",
            targets: ["B"]),
    ],
    dependencies: [
      .package(url: "https://.../CommonLib", from: "1.0.0"),
   ],
    targets: [
        .target(
            name: "B",
            dependencies: ["CommonLib"]),
        .testTarget(
            name: "BTests",
            dependencies: ["B"]),
    ]
)

App的Package.swift

import PackageDescription
let package = Package(
    name: "App",
    dependencies: [
      .package(url: "https://.../CommonLib", from: "1.0.0"),
      .package(url: "https://.../B", from: "1.0.0"),
   ],
    targets: [
        .target(
            name: "App",
            dependencies: ["CommonLib", "B"]),
        .testTarget(
            name: "AppTests",
            dependencies: ["App"]),
    ]
)

swift build
error: Found multiple packages with the name CommonLib...

如果 App 和 B 都依赖于 CommonLib 并且我将 B 和 CommonLib 导入 App 出现错误找到多个同名的包...

Apple Swift 版本 4.0.2 (swiftlang-900.0.69.2 clang-900.0.38) 目标:x86_64-apple-macosx10.9

有谁知道如何解决这个问题?

【问题讨论】:

【参考方案1】:

删除Package.pins 并重新运行swift build。查看它正在尝试获取哪些包。检查.build/checkouts.build/dependencies-state.json - CommonLib 的标签和版本分别写在那里。

【讨论】:

谢谢!我搞砸了,很容易对 CommonLib 进行更改,提交并忘记更新 git 标签。最终得到了两个不同的版本,因此......错误找到了多个名称为...... @vadim-eisenberg 我有类似的问题,但不明白这些数据如何帮助解决它。你能详细说明一下吗?在我的.bulid/dependencies-state.json 的情况下,同一个库有两个条目,指向同一个提交,但它们具有不同的subpath 值,其中一个称为A-numbers1,另一个称为A.git-numbers2。尽管两者都引用了相同版本的库。 @Zapko 这个数据是为了得到一些关于这个问题的提示,我没有一个确切的算法来看看。我想问题是您的 A 包在某些依赖包中的引用方式不同。例如,在一个依赖项中,它由 git url 引用,而在另一个依赖项中,则由 https url 引用。这可能会让 Swift 包管理器感到困惑。【参考方案2】:

如果您想手动将这些导入到库中,您将看到此错误。不能有多个同名的包。

对于解决方案,您必须更改清单并删除其中一个。但是我认为如果您使用 CocoaPod 可以解决这个问题,它是管理包和库的完美工具。您还可以从 CocoaPod 轻松更改清单。

【讨论】:

这不是一个清单。 B 是由其他可执行文件导入的单独库。有两个不同的清单 App 的 Package.swift 和 B 的 Package.swift。在上述情况下,它们都需要导入 CommonLib。然后App需要导入B。

以上是关于斯威夫特包管理器。错误:找到多个名称为...的包?的主要内容,如果未能解决你的问题,请参考以下文章

nodejs的包管理器npm和cnpm

5款最适合新手的包管理器

如何从 sdkmanager --list 获取完整的包名称?

像Linux一样安装软件(2):包管理器一锅炖

pnpm 的包管理器替代品都有哪些?

brew-mac的包管理器brew link命令