Xcode 和 git 解析 swift 包的区别
Difference between Xcode and git for resolving swift packages
所以背景是这样的:我有一个 Xcode 项目,该项目依赖于 swift 包,该包位于 github 上的私有存储库中。当然,这需要密钥才能访问。到目前为止,我已经成功地配置了 CI,这样我就可以通过 ssh 进入实例并 git clone
swift 包所需的存储库。不幸的是,当 运行 与 xcbuild
像 CI 一样时,它不起作用,我收到此消息:
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
会很高兴地获取此 repo,如下所示:
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 上使用 Deploy 键设置,已添加到 [=28 上的作业中=].
任何关于 Xcode 尝试获取依赖项的方式与 vanilla git 获取依赖项的方式之间可能存在差异的建议都会很棒。谢谢。
这似乎是 Xcode 11 中使用 SSH 的错误。切换到 HTTPS 以解决 Swift 包修复了问题:
所以从这个:
E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "git@github.com:company-uk/ProjectDependency.git";
requirement = {
branch = "debug";
kind = branch;
};
};
至:
E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/company-uk/ProjectDependency.git";
requirement = {
branch = "debug";
kind = branch;
};
};
另外,现在 Xcode 12 已经出来了,你可以在它固定的地方使用它。
对于无法登录 GitHub 或其他存储库主机的 CI 管道,这是我发现绕过私有 Xcode 的 restrictions/bugs 的解决方案48=]包。
对私有依赖项使用 https url,因为 xcodebuild 目前忽略了 ssh 配置,即使文档中另有说明。
一旦您可以使用 https 在本地构建,请转到您的存储库主机并创建个人访问令牌 (PAT)。对于 GitHub 指令,找到 here.
使用您的 CI 系统将此 PAT 添加为秘密环境变量。在下面的脚本中,它被称为 GITHUB_PAT
.
然后在 CI 管道中 运行 xcodebuild
确保 运行 此 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 注入其中,因此无需密码即可使用。
别忘了:
- 将
[org_name]
替换为您的组织名称。
- 将
${GITHUB_PAT}
替换为您的 CI Secret 的名称(如果您对它的命名不同)。
- 配置
grep
命令以忽略您不想由脚本修改的任何路径。
为了获得使用 GitHub 操作的私有 swift 包,我必须添加以下内容:
- 我必须向我的机密添加 SSH 密钥
- 在 xcodebuild 步骤中,我必须添加标志:
-usePackageSupportBuiltinSCM
- 在执行 xcodebuild 步骤之前,我必须添加以下 运行 脚本:
- name: Add CI SSH Key
run: ssh-add - <<< "${{ secrets.YOUR_SECRET_SSH_KEY }}"
您可以在 CI 环境中使用 Xcode 12 解决此问题,方法是将您的 GitHub 帐户添加到 Xcode 中的帐户。
使用您的 GitHub 帐户名和您在 Github 上创建的个人访问令牌登录。
我们将 Jenkins 与 Fastlane 工具结合使用,当调用 xcodebuild 时,它将使用访问令牌通过 HTTPS 对存储库进行身份验证。
我遇到了同样的问题,根本原因是:默认 github ssh 密钥类型是 ed25519 ssh-keygen -t ed25519 -C "your_email@example.com"
.
但是XCode不支持ed25519。更改为 RSA 密钥有效:ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
可以在XCode下看到错误 Preference > Accounts > Github
所以背景是这样的:我有一个 Xcode 项目,该项目依赖于 swift 包,该包位于 github 上的私有存储库中。当然,这需要密钥才能访问。到目前为止,我已经成功地配置了 CI,这样我就可以通过 ssh 进入实例并 git clone
swift 包所需的存储库。不幸的是,当 运行 与 xcbuild
像 CI 一样时,它不起作用,我收到此消息:
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
会很高兴地获取此 repo,如下所示:
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 上使用 Deploy 键设置,已添加到 [=28 上的作业中=].
任何关于 Xcode 尝试获取依赖项的方式与 vanilla git 获取依赖项的方式之间可能存在差异的建议都会很棒。谢谢。
这似乎是 Xcode 11 中使用 SSH 的错误。切换到 HTTPS 以解决 Swift 包修复了问题:
所以从这个:
E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "git@github.com:company-uk/ProjectDependency.git";
requirement = {
branch = "debug";
kind = branch;
};
};
至:
E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/company-uk/ProjectDependency.git";
requirement = {
branch = "debug";
kind = branch;
};
};
另外,现在 Xcode 12 已经出来了,你可以在它固定的地方使用它。
对于无法登录 GitHub 或其他存储库主机的 CI 管道,这是我发现绕过私有 Xcode 的 restrictions/bugs 的解决方案48=]包。
对私有依赖项使用 https url,因为 xcodebuild 目前忽略了 ssh 配置,即使文档中另有说明。
一旦您可以使用 https 在本地构建,请转到您的存储库主机并创建个人访问令牌 (PAT)。对于 GitHub 指令,找到 here.
使用您的 CI 系统将此 PAT 添加为秘密环境变量。在下面的脚本中,它被称为 GITHUB_PAT
.
然后在 CI 管道中 运行 xcodebuild
确保 运行 此 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 注入其中,因此无需密码即可使用。
别忘了:
- 将
[org_name]
替换为您的组织名称。 - 将
${GITHUB_PAT}
替换为您的 CI Secret 的名称(如果您对它的命名不同)。 - 配置
grep
命令以忽略您不想由脚本修改的任何路径。
为了获得使用 GitHub 操作的私有 swift 包,我必须添加以下内容:
- 我必须向我的机密添加 SSH 密钥
- 在 xcodebuild 步骤中,我必须添加标志:
-usePackageSupportBuiltinSCM
- 在执行 xcodebuild 步骤之前,我必须添加以下 运行 脚本:
- name: Add CI SSH Key
run: ssh-add - <<< "${{ secrets.YOUR_SECRET_SSH_KEY }}"
您可以在 CI 环境中使用 Xcode 12 解决此问题,方法是将您的 GitHub 帐户添加到 Xcode 中的帐户。
使用您的 GitHub 帐户名和您在 Github 上创建的个人访问令牌登录。
我们将 Jenkins 与 Fastlane 工具结合使用,当调用 xcodebuild 时,它将使用访问令牌通过 HTTPS 对存储库进行身份验证。
我遇到了同样的问题,根本原因是:默认 github ssh 密钥类型是 ed25519 ssh-keygen -t ed25519 -C "your_email@example.com"
.
但是XCode不支持ed25519。更改为 RSA 密钥有效:ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
可以在XCode下看到错误 Preference > Accounts > Github