如何将 Swift 包管理器与私人仓库一起使用?
How to use Swift Package Manager with private repos?
如何将 Swift 包管理器与存储在私有存储库中的依赖项一起使用?
添加 username
和 password
可以正常工作:
let package = Package(
name: "MyPackage",
dependencies: [
.package(url: "https://username:password@gitlab.com/me/MyPackage.git", .branch("develop"))
]
)
但是,username:password
方法存在一些问题,包括(但不限于)指定 Package.swift
用户名,以及将纯文本凭据放入存储库。
理想情况下,解决方案是:
- 不在存储库中存储任何纯文本或令牌凭据。
- 允许每个团队成员拥有自己的凭据。
我最终为“unix”类型系统找到的一个解决方案是使用 SSH git
URL 并将 Host
配置添加到 ~/.ssh/config
。此方法适用于 macOS/Linux 命令行和 Xcode.
在 Package.swift
.
中为依赖项 url 使用 ssh 表单
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "Example",
dependencies: [
.package(url: "git@gitlab.com.myteam:abc/private-repo.git", .branch("develop") ),
],
)
在上面的例子中,gitlab.com.myteam
对应~/.ssh/config
中的一个Host
### GITLAB WorkTeamOne
Host gitlab.com.workteam
HostName gitlab.com
User git
IdentityFile ~/.ssh/my_work_key_rsa
UseKeychain yes # for macOS keychain
AddKeysToAgent yes # for macOS keychain
PreferredAuthentications publickey
### GITLAB Hobby
Host gitlab.com.hobby
HostName gitlab.com
User git
IdentityFile ~/.ssh/my_hobby_key_rsa
UseKeychain yes # for macOS keychain
AddKeysToAgent yes # for macOS keychain
PreferredAuthentications publickey
可以根据需要为帐户生成 SSH 密钥对,并将其应用于个人的在线 git 服务。
ssh-keygen \
-b 4096 \
-t rsa \
-C "my_work_username@example.com" \
-f ~/.ssh/my_work_key_rsa
每个团队成员可以设置一个单独的、对应的 Host
ssh 配置。 Host
是相同的,但是,实际的 public/private 密钥对 (a) 是特定于用户的,(b) 可以与任何代码开发分开管理,并且 (c) 可以是设置后自动使用。
您将在没有任何嵌入式身份验证信息的情况下使用 URL,然后将凭据查找作为 git 交互的一部分进行处理。这样做的缺点是每个需要访问权限的人都必须在一切正常之前独立正确地配置他们的系统。 (但是将 2FA 和 SSO 混合在一起,可能没有办法绕过单独的配置。)
一种方法是 git 使用 SSH,并使用 SSH 对配置的支持来代表您提供凭据。这是 .
中推荐的方法
但这不是唯一的方法:您可以使用 HTTPS URL。
为此,您需要使用 git 的内置支持来获取凭据。这就是每个团队成员用来拥有一个 HTTPS URL 的方式,该 HTTPS URL 需要身份验证工作,而无需反复要求他们提供凭据。
Git 支持使用 credential helper. The helper used for a repo is configured in your git config as the value of credential.helper. The specific helpers available, and how you install and configure your chosen one, depends on your platform. GitHub has per-platform docs for setting this up. The Git Book also has a Credential Storage chapter.
处理授权
我在 Xcode 中的 iOS 项目在没有 SSH 的情况下完成了。我的私人仓库,包托管在 GitLab 上,但可以托管在 GitHub、Bitbucket、自托管 Gitlab 上。
过程很简单:在上面的其中一个主机上创建一个带有 SPM 包的私人仓库。然后将其作为常规包添加为 Xcode 项目中的依赖项。由于 repo 是私有的,Xcode 将要求提供凭据(如果是 Gitlab,它是一个访问令牌,您可以在 Gitlab 帐户中生成)。 Xcode会记住,下次自动授权给你。因此,您(和您的同事)只需在设置时输入一次凭据。并且你的条件1和条件2都满足了
您可以在 Xcode -> 首选项 -> 帐户中管理源代码控制帐户(按 + 添加一个)。
我在 GitHub 上将 SPM 与私有存储库一起使用。我在我的包文件中使用以下内容:
let package = Package(
name: "MyPackage",
dependencies: [
.package(url: "git@github.com:myusername/mypackage.git", .branch("develop"))
]
)
然后我在我的 ~/.ssh/config 文件中添加了一个主机:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
PreferredAuthentications publickey
然后我在命令行中通过 运行 添加 GitHub 到已知主机文件:
ssh-keyscan github.com >> ~/.ssh/known_hosts
最后,我发现在命令行上使用 swift 进行编译时,似乎无法使用带密码的 SSH 密钥,因此我创建了一个没有密码的新密钥。
将 spm 与私有存储库一起使用时
- 可通过
vpn
或 proxies
、 访问
- 可通过
ssh
访问
- 具有复杂的 ~/ssh/config 和 /etc/hosts 设置,
请注意 Xcode 保留其自己的 .ssh
和 known_hosts
文件夹。
你可以在
中看到它
~/Library/Preferences/com.apple.dt.Xcode.plist
看起来像这样
在 ci 环境中,这并不令人愉快,您可能会遇到以下错误:
xcodebuild: error: Could not resolve package dependencies:
The server SSH fingerprint failed to verify.
xcodebuild: error: Could not resolve package dependencies:
Authentication failed because the credentials were rejected
An unknown error occurred. failed to connect to localhost: Connection refused (-1)
您实际上可以通过以下方式之一告诉 Xcode 使用 ssh 密钥和已知主机的标准位置 ~/.ssh
:
一个。这适用于基于 ci 的容器,例如 circle ci
sudo defaults write com.apple.dt.Xcode IDEPackageSupportUseBuiltinSCM YES
b。这适用于裸机
/usr/libexec/Plistbuddy -c "Add :IDEPackageSupportUseBuiltinSCM bool 1" ~/Library/Preferences/com.apple.dt.Xcode.plist
c。如果以上方法对您不起作用,请尝试在您的 xcodebuild 命令中添加 -scmProvider system
gym(
...
use_system_scm: true
)
scan(
...
use_system_scm: true
)
- 对于 运行 解决依赖 ci 与 SPM 有私人回购
fastlane run spm --use_system_scm true
- 非快车道用户
xcodebuild -scmProvider system
确保将您的私有存储库主机添加到 ~/.ssh/known_hosts
一个。对于 bitbucket
for ip in $(dig @8.8.8.8 bitbucket.org +short); do ssh-keyscan bitbucket.org,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true
b。 github
for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan github.com,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true
c。其他
ssh-keyscan your-host.com >> ~/.ssh/known_hosts
如何将 Swift 包管理器与存储在私有存储库中的依赖项一起使用?
添加 username
和 password
可以正常工作:
let package = Package(
name: "MyPackage",
dependencies: [
.package(url: "https://username:password@gitlab.com/me/MyPackage.git", .branch("develop"))
]
)
但是,username:password
方法存在一些问题,包括(但不限于)指定 Package.swift
用户名,以及将纯文本凭据放入存储库。
理想情况下,解决方案是:
- 不在存储库中存储任何纯文本或令牌凭据。
- 允许每个团队成员拥有自己的凭据。
我最终为“unix”类型系统找到的一个解决方案是使用 SSH git
URL 并将 Host
配置添加到 ~/.ssh/config
。此方法适用于 macOS/Linux 命令行和 Xcode.
在 Package.swift
.
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "Example",
dependencies: [
.package(url: "git@gitlab.com.myteam:abc/private-repo.git", .branch("develop") ),
],
)
在上面的例子中,gitlab.com.myteam
对应~/.ssh/config
Host
### GITLAB WorkTeamOne
Host gitlab.com.workteam
HostName gitlab.com
User git
IdentityFile ~/.ssh/my_work_key_rsa
UseKeychain yes # for macOS keychain
AddKeysToAgent yes # for macOS keychain
PreferredAuthentications publickey
### GITLAB Hobby
Host gitlab.com.hobby
HostName gitlab.com
User git
IdentityFile ~/.ssh/my_hobby_key_rsa
UseKeychain yes # for macOS keychain
AddKeysToAgent yes # for macOS keychain
PreferredAuthentications publickey
可以根据需要为帐户生成 SSH 密钥对,并将其应用于个人的在线 git 服务。
ssh-keygen \
-b 4096 \
-t rsa \
-C "my_work_username@example.com" \
-f ~/.ssh/my_work_key_rsa
每个团队成员可以设置一个单独的、对应的 Host
ssh 配置。 Host
是相同的,但是,实际的 public/private 密钥对 (a) 是特定于用户的,(b) 可以与任何代码开发分开管理,并且 (c) 可以是设置后自动使用。
您将在没有任何嵌入式身份验证信息的情况下使用 URL,然后将凭据查找作为 git 交互的一部分进行处理。这样做的缺点是每个需要访问权限的人都必须在一切正常之前独立正确地配置他们的系统。 (但是将 2FA 和 SSO 混合在一起,可能没有办法绕过单独的配置。)
一种方法是 git 使用 SSH,并使用 SSH 对配置的支持来代表您提供凭据。这是
但这不是唯一的方法:您可以使用 HTTPS URL。
为此,您需要使用 git 的内置支持来获取凭据。这就是每个团队成员用来拥有一个 HTTPS URL 的方式,该 HTTPS URL 需要身份验证工作,而无需反复要求他们提供凭据。
Git 支持使用 credential helper. The helper used for a repo is configured in your git config as the value of credential.helper. The specific helpers available, and how you install and configure your chosen one, depends on your platform. GitHub has per-platform docs for setting this up. The Git Book also has a Credential Storage chapter.
处理授权我在 Xcode 中的 iOS 项目在没有 SSH 的情况下完成了。我的私人仓库,包托管在 GitLab 上,但可以托管在 GitHub、Bitbucket、自托管 Gitlab 上。
过程很简单:在上面的其中一个主机上创建一个带有 SPM 包的私人仓库。然后将其作为常规包添加为 Xcode 项目中的依赖项。由于 repo 是私有的,Xcode 将要求提供凭据(如果是 Gitlab,它是一个访问令牌,您可以在 Gitlab 帐户中生成)。 Xcode会记住,下次自动授权给你。因此,您(和您的同事)只需在设置时输入一次凭据。并且你的条件1和条件2都满足了
您可以在 Xcode -> 首选项 -> 帐户中管理源代码控制帐户(按 + 添加一个)。
我在 GitHub 上将 SPM 与私有存储库一起使用。我在我的包文件中使用以下内容:
let package = Package(
name: "MyPackage",
dependencies: [
.package(url: "git@github.com:myusername/mypackage.git", .branch("develop"))
]
)
然后我在我的 ~/.ssh/config 文件中添加了一个主机:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
PreferredAuthentications publickey
然后我在命令行中通过 运行 添加 GitHub 到已知主机文件:
ssh-keyscan github.com >> ~/.ssh/known_hosts
最后,我发现在命令行上使用 swift 进行编译时,似乎无法使用带密码的 SSH 密钥,因此我创建了一个没有密码的新密钥。
将 spm 与私有存储库一起使用时
- 可通过
vpn
或proxies
、 访问
- 可通过
ssh
访问
- 具有复杂的 ~/ssh/config 和 /etc/hosts 设置,
请注意 Xcode 保留其自己的 .ssh
和 known_hosts
文件夹。
你可以在
中看到它~/Library/Preferences/com.apple.dt.Xcode.plist
看起来像这样
在 ci 环境中,这并不令人愉快,您可能会遇到以下错误:
xcodebuild: error: Could not resolve package dependencies: The server SSH fingerprint failed to verify.
xcodebuild: error: Could not resolve package dependencies: Authentication failed because the credentials were rejected
An unknown error occurred. failed to connect to localhost: Connection refused (-1)
您实际上可以通过以下方式之一告诉 Xcode 使用 ssh 密钥和已知主机的标准位置 ~/.ssh
:
一个。这适用于基于 ci 的容器,例如 circle ci
sudo defaults write com.apple.dt.Xcode IDEPackageSupportUseBuiltinSCM YES
b。这适用于裸机
/usr/libexec/Plistbuddy -c "Add :IDEPackageSupportUseBuiltinSCM bool 1" ~/Library/Preferences/com.apple.dt.Xcode.plist
c。如果以上方法对您不起作用,请尝试在您的 xcodebuild 命令中添加 -scmProvider system
gym(
...
use_system_scm: true
)
scan(
...
use_system_scm: true
)
- 对于 运行 解决依赖 ci 与 SPM 有私人回购
fastlane run spm --use_system_scm true
- 非快车道用户
xcodebuild -scmProvider system
确保将您的私有存储库主机添加到 ~/.ssh/known_hosts
一个。对于 bitbucket
for ip in $(dig @8.8.8.8 bitbucket.org +short); do ssh-keyscan bitbucket.org,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true
b。 github
for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan github.com,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true
c。其他
ssh-keyscan your-host.com >> ~/.ssh/known_hosts