【问题标题】:Swift Package Manager Dependency MirroringSwift 包管理器依赖镜像
【发布时间】:2022-08-12 23:45:04
【问题描述】:

我有一个项目,并且:

  • 与我合作的公司正在自行托管他们的 git
  • CI 只能与公司网络通信

话虽如此,如果我想安装任何依赖项,我必须让他们的开发人员镜像目标存储库,然后我才能使用它。

当我想实现具有很多依赖项的 Crashlytics 时,就会出现问题。当我导入 Firebase 时,它​​会正确地从镜像仓库中获取,但它的依赖项仍然是从原始 URL 中获取的(这很有意义)。

问题是 -我如何告诉 Swift 包管理器用镜像交换每个 URL?我已经镜像了所有依赖项。我只需要告诉 SPM 使用它。

我找到了在 Swift 5 中实现的this proposal,但是当我进入项目的根目录并运行时:

$ swift package config set-mirror --package-url <original URL> --mirror-url <mirror URL>

我收到此错误:

error: root manifest not found

任何想法如何正确地做到这一点?谢谢

编辑:

正如弗洛里安正确指出的那样,该提案来自包的存储库,而不是我的项目!所以:

  1. 我确实在我的项目的根目录中克隆了镜像仓库
  2. 我运行一组命令来为每个依赖项设置镜像 url:
    swift package config set-mirror \\
        --original-url https://github.com/google/GoogleAppMeasurement.git \\
        --mirror-url <company\'s url>/mirrors/githubcom-google-GoogleAppMeasurement
    
    1. 我回到项目根目录并运行:
    xcodebuild -resolvePackageDependencies -project MyProject.xcodeproj -scheme MyAppScheme
    

    但它仍然从原始网址获取,而不是镜像!

  • 您需要在包目录中运行此命令。如提案中所述,mirror-config 将写入包内的.swiftpm/config。这里的错误指出,SPM 找不到包的根清单(又名 Package.swift),因为您可能在包之外运行了命令。请注意,它需要位于包根目录中,而不是 Xcode 项目中。
  • 谢谢@FlorianFriedrich - 非常有意义!如果您有任何想法,请查看我更新的问题吗?谢谢
  • 我已经为此发布了一个“答案”。可能不是你所希望的,对不起!我自己对此非常感兴趣,因为我们在其中一个项目中遇到了类似的问题。 (虽然我们只需要“镜像”我们自己的依赖项,而不是开源的)。

标签: ios swift git continuous-integration swift-package-manager


【解决方案1】:

拥有一个 Xcode 项目使这项任务基本上是不可能的(在撰写本文时)。 Xcode 与 SPM 的集成在大多数情况下都可以正常工作,但还不能(还没有?)与 SPM 在纯 SPM 包中的功能相提并论。

问题是,swift package config 始终只对包本地,对依赖包的项目/包没有任何影响。并且由于 Xcode 目前没有与 swift package config 对应的对象,因此目前无法执行此操作。

但是,您可以做的是在本地克隆所有依赖项,然后将它们作为本地包从 Xcode 中引用(只需将包文件夹拖到打开的 Xcode 项目中即可)。 Xcode 将足够聪明,可以从本地本地结帐中获取依赖项(或者至少在我上次尝试这个时它足够聪明)。

让我们期待未来的 Xcode 版本满的支持SPM!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 2021-10-10
    • 2015-02-01
    • 2017-09-30
    • 2018-09-23
    • 2021-09-25
    • 1970-01-01
    • 2017-05-15
    相关资源
    最近更新 更多