Swift 包管理器依赖镜像

问题描述 投票:0回答:3

我有一个项目并且:

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

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

当我想要实现有很多依赖项的 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 正确指出的那样,该提案适用于包的存储库,而不是我的项目!所以:

  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

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

ios swift git continuous-integration swift-package-manager
3个回答
1
投票

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

问题是,

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

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

让我们期待未来的 Xcode 版本能够提供完整 SPM 支持!


0
投票

SPM 镜像仅适用于软件包,不适用于应用程序。
我面临着在 CI 上使用内部存储库中的软件包的要求,而在我的工作站上构建时,我们需要从公共 Github 存储库进行构建。

我采用的解决方案是使用 shell 脚本“修补”

project.pbxproj
文件。
project.pbxproj
中,存储库的 URL 设置为公共,并且只是一个纯字符串。
在 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/[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 上的内部存储库构建,但它可以工作。


0
投票

试试这个:

  1. 在项目根目录中使用
    Package.swift
    构建包。
  2. 将应用程序所需的依赖项添加到步骤 1 中的
    Package.swift
  3. 将此包添加为项目中的本地依赖项。
  4. 设置镜像:
    • 在目录
      mirrors.json
      添加镜像文件(
      [appName].xcodeproj/project.workspace/xcshareddata/swiftpm/configuration
    • )
    • 在项目根目录中为此
      Package.swift
      设置所需的镜像。

第4步需要在两个地方设置镜像。现在我已经设置了两者,但我怀疑其中之一可能没有必要。

另外,请检查您的 .gitignore 文件。 xcshareddata下的数据很可能不会提交到git。

© www.soinside.com 2019 - 2024. All rights reserved.