我有一个项目并且:
话虽这么说,如果我想安装任何依赖项,我必须要求他们的开发人员镜像目标存储库,然后我才能使用它。
当我想要实现有很多依赖项的 Crashlytics 时,问题就出现了。当我导入 Firebase 时,它是从镜像存储库中正确获取的,但它的依赖项仍然是从原始 URL 中获取的(这很有意义)。
问题是 - 我如何告诉 Swift Package Manager 将每个 URL 与镜像交换?我已经镜像了所有依赖项。我只需要告诉SPM使用它即可。
我发现了这个提案,它是在 Swift 5 中实现的,但是当我转到项目的根目录并运行时:
$ swift package config set-mirror --package-url <original URL> --mirror-url <mirror URL>
我收到此错误:
error: root manifest not found
有什么想法可以正确地做到这一点吗?谢谢你
编辑:
正如 Florian 正确指出的那样,该提案适用于包的存储库,而不是我的项目!所以:
swift package config set-mirror \
--original-url https://github.com/google/GoogleAppMeasurement.git \
--mirror-url <company's url>/mirrors/githubcom-google-GoogleAppMeasurement
xcodebuild -resolvePackageDependencies -project MyProject.xcodeproj -scheme MyAppScheme
但它仍然是从原始网址获取,而不是镜像!
拥有 Xcode 项目使得这项任务基本上不可能完成(在撰写本文时)。 Xcode 与 SPM 的集成在大多数情况下都可以正常工作,但(还?)无法与 SPM 在纯 SPM 包中的功能相提并论。
问题是,
swift package config
始终仅在包本地,并且对依赖于该包的项目/包没有任何影响。由于 Xcode 目前没有 swift package config
的对应项,因此目前无法执行此操作。
但是,您可以做的是在本地克隆所有依赖项,然后从 Xcode 将它们引用为本地包(只需将包文件夹拖到打开的 Xcode 项目中即可)。 Xcode 将足够智能,可以从本地本地结账获取依赖项(或者至少我上次尝试这个时它足够智能)。
让我们期待未来的 Xcode 版本能够提供完整 SPM 支持!
SPM 镜像仅适用于软件包,不适用于应用程序。
我面临着在 CI 上使用内部存储库中的软件包的要求,而在我的工作站上构建时,我们需要从公共 Github 存储库进行构建。
我采用的解决方案是使用 shell 脚本“修补”
project.pbxproj
文件。project.pbxproj
中,存储库的 URL 设置为公共,并且只是一个纯字符串。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/[email protected]:Alamofire\/Alamofire.git/[email protected]: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
它不是镜像,因为我们总是从 CI 上的内部存储库构建,但它可以工作。
试试这个:
Package.swift
构建包。Package.swift
。mirrors.json
添加镜像文件(
[appName].xcodeproj/project.workspace/xcshareddata/swiftpm/configuration
Package.swift
设置所需的镜像。第4步需要在两个地方设置镜像。现在我已经设置了两者,但我怀疑其中之一可能没有必要。
另外,请检查您的 .gitignore 文件。 xcshareddata下的数据很可能不会提交到git。