ios Swift包管理器依赖关系镜像

4smxwvx5  于 2023-02-26  发布在  iOS
关注(0)|答案(2)|浏览(170)

我有一个项目和:

  • 我工作的那家公司自己托管他们的git
  • 配置项只能与公司网络通信

也就是说,如果我想安装任何依赖项,我必须要求他们的开发人员镜像目标存储库,只有这样我才能使用它。
当我想实现有很多依赖项的Crashlytics时,问题就出现了。当我导入Firebase时,它正确地从镜像repo中获取,但它的依赖项仍然从原始URL中获取(这很有意义)。
问题是-我如何告诉Swift Package Manager用镜像交换每个URL?我已经镜像了所有的依赖项。我只需要告诉SPM使用它。
我已经找到了在Swift 5中实现的this proposal,但是当我转到项目的根目录并运行:

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

我得到这个错误:

error: root manifest not found

你知道怎么正确地做吗?谢谢
编辑:
正如Florian正确指出的那样,这个建议是在包的存储库中工作的,而不是在我的项目中!
1.我确实在我的项目根目录中克隆了镜像存储库
1.我运行一组命令为每个依赖项设置镜像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

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

jv4diomz

jv4diomz1#

有一个Xcode项目使得这项任务基本上不可能完成(在编写本书时)。Xcode与SPM的集成在大多数情况下都很好,但还不能与SPM在纯SPM包中所能做的事情相提并论。
问题是,swift package config总是只在包的本地,对依赖于包的项目/包没有任何影响,而且Xcode目前没有对应的swift package config,目前不可能做到这一点。
但是,您可以做的是在本地克隆所有依赖项,然后从Xcode中引用它们作为本地包(只需将包文件夹拖到打开的Xcode项目中即可)。Xcode将足够智能地从本地本地 checkout 中获取依赖项(至少上次我尝试时它足够智能)。
让我们期待未来的Xcode版本能提供 * 完整 * SPM支持!

puruo6ea

puruo6ea2#

SPM镜像仅适用于包,不适用于应用程序。
我面临着在CI上使用来自内部存储库的包的需求,而在我的工作站上构建时,我们需要从公共Github repo构建。
我采用的解决方案是使用shell脚本“修补”project.pbxproj文件。
project.pbxproj中,存储库的URL被设置为public,并且只是一个普通字符串。
在CI上,我们使用xcodebuild构建应用程序,在执行build/archive操作之前,我使用sed运行shell脚本,以覆盖内部的URL。

#!/usr/bin/env bash

set -e

if [[ ! "${RUNNING_ON_CI}" ]]; then
    echo "Build is not running on the CI, skipping SPM URL update."
    exit 0
fi

PROJECT_FILE_PATH="${REPO_ROOT}/${PROJECT_NAME}.xcodeproj/project.pbxproj"
sed -ie "s/git@github.com:Alamofire\/Alamofire.git/git@private.github.com:Alamofire\/Alamofire.git/g" "${PROJECT_FILE_PATH}"

SED_BACKUP_FILE="${REPO_ROOT}/${PROJECT_NAME}.xcodeproj/project.pbxproje"
if [ -f "${SED_BACKUP_FILE}" ]; then
    rm -rf "${SED_BACKUP_FILE}"
fi

这不是镜像,因为我们总是从配置项的内部存储库构建,但它可以工作。

相关问题