swift - Xcode 和 git 解析 swift 包的区别

标签 swift xcode git circleci swift-package-manager

所以背景是这样的:我有一个 Xcode 项目,它依赖于 github 上私有(private)存储库中的 swift 包。当然,这需要 key 才能访问。到目前为止,我已经成功配置 CI,以便我可以 ssh 进入实例并 git 克隆 swift 包所需的存储库。不幸的是,当像 CI 一样使用 xcbuild 运行它时,它不起作用,我收到以下消息:

static:ios distiller$ xcodebuild -showBuildSettings -workspace ./Project.xcworkspace \
    -scheme App\ Prod
Resolve Package Graph
Fetching git@github.com:company-uk/ProjectDependency.git
xcodebuild: error: Could not resolve package dependencies:
  Authentication failed because the credentials were rejected

相比之下,git clone 会很高兴地获取此存储库,如下所示:

static:ios distiller$ git clone git@github.com:company-uk/ProjectDependency.git
Cloning into 'ProjectDependency'...
Warning: Permanently added the RSA host key for IP address '11.22.33.44' to the list of known hosts.
remote: Enumerating objects: 263, done.
remote: Counting objects: 100% (263/263), done.
remote: Compressing objects: 100% (171/171), done.
remote: Total 1335 (delta 165), reused 174 (delta 86), pack-reused 1072
Receiving objects: 100% (1335/1335), 1.11 MiB | 5.67 MiB/s, done.
Resolving deltas: 100% (681/681), done.

为了了解更多背景信息,它在 CircleCI 上运行,使用 GitHub 上的部署 key 进行设置,该 key 已添加到 CI 上的作业中。

任何有关 Xcode 尝试获取依赖项的方式与 vanilla git 的方式之间可能存在差异的建议都会很棒。谢谢。

最佳答案

对于无法登录 GitHub 或其他存储库主机的 CI 管道,这是我发现的解决方案,它绕过了 Xcode 围绕私有(private) Swift 包的限制/错误。

对私有(private)依赖项使用 https url,因为 ssh 配置当前被 xcodebuild 忽略,即使文档另有说明。

一旦您可以使用 https 进行本地构建,请转到您的存储库主机并创建个人访问 token (PAT)。对于 GitHub 说明,请参阅 here .

在您的 CI 系统中,将此 PAT 添加为 secret 环境变量。在下面的脚本中,它被称为 GITHUB_PAT

然后在运行 xcodebuild 之前在 CI 管道中确保运行此 bash 脚本的经过适当修改的版本:

for FILE in $(grep -Ril "https://github.com/[org_name]" .); do
    sed -i '' "s/https:\/\/github.com\/[org_name]/https:\/\/${GITHUB_PAT}@github.com\/[org_name]/g" ${FILE}
done

此脚本将查找所有 https 引用并将 PAT 注入(inject)其中,以便无需密码即可使用。

不要忘记:

  • [org_name] 替换为您的组织名称。
  • 如果您的命名方式不同,请将 ${GITHUB_PAT} 替换为您的 CI Secret 的名称。
  • 配置 grep 命令以忽略您不希望脚本修改的任何路径。

关于swift - Xcode 和 git 解析 swift 包的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59035529/

相关文章:

Swift - Int 的容量存储

ios - 测试关闭的 ios 应用程序

git - TortoiseGit 和 Pageant,每次都必须为 "add key"

node.js - 使用 Git Deploy 将 Ghost 0.4.2 部署到 Azure 站点

ios - storyboard.instantiateInitialViewController 返回错误的 uiViewController

swift - For 循环中的 DispatchGroup

ios - 仅当所有文本字段均已填写时才启用 Swift 中的按钮

ios - 我可以在 XCode 的 Storyboard 编辑器中指定目标吗?

ios - 更改代码后在模拟器上进行 XCode 调试

git - "git log --pretty=<pretty format>"是陶瓷命令还是管道命令?