如何使用存储在私有存储库中的依赖项的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
用户名,以及将纯文本凭据放入存储库。
理想情况下,解决方案是:
答案 0 :(得分:2)
对于Xcode中的iOS项目,我已经在没有SSH的情况下实现了它。我的私有仓库带有程序包,托管在GitLab上,但可以托管在GitHub,Bitbucket,自托管的Gitlab上。
过程很简单:在上述主机之一上创建一个带有SPM软件包的私有仓库。然后像往常一样将其作为依赖项添加到Xcode项目中。由于回购是私人的,因此Xcode会要求提供凭据(在Gitlab的情况下,这是您可以在Gitlab帐户中生成的访问令牌)。 Xcode会记住它,并且下次会自动授权您。因此,您(和您的同事)在设置时只需输入一次凭证。并且您的1和2条件都得到满足。
您可以通过Xcode->首选项->帐户(按+来添加一个)来管理源代码控制帐户。
答案 1 :(得分:1)
我最终为nix类型系统找到的一个解决方案是使用SSH git
网址并将Host
配置添加到~/.ssh/config
。
在Package.swift
中为依赖关系网址使用ssh表单。
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "Example",
dependencies: [
.package(url: "git@gitlab.com.myteam:abc/private-resource.git", .branch("develop") ),
],
)
在上面的示例中,gitlab.com.myteam
对应于Host
~/.ssh/config
### GITLAB WorkTeamOne
Host gitlab.com.myteam
HostName gitlab.com
User my_work_username
IdentityFile ~/.ssh/my_work_key_rsa
UseKeychain yes
AddKeysToAgent yes
PreferredAuthentications publickey
### GITLAB Hobby
Host gitlab.com.hobby
HostName gitlab.com
User my_hobby_username
IdentityFile ~/.ssh/my_hobby_key_rsa
UseKeychain yes
AddKeysToAgent yes
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
将是相同的,但是,实际的公钥/私钥对(a)是特定于用户的,(b)可以与任何代码开发分开管理,(c)可以自动使用设置完毕后。
答案 2 :(得分:1)
我正在将SPM与GitHub上的私有仓库一起使用。我在打包文件中使用以下内容:
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密钥,因此我创建了一个没有密码短语的新密码。
答案 3 :(得分:1)
将spm与私有仓库一起使用时
vpn
或proxies
访问ssh
请注意,Xcode保留自己的文件夹.ssh
和known_hosts
。
您可以在
中看到它~/Library/Preferences/com.apple.dt.Xcode.plist
它看起来像这样
在ci环境中,这并不令人满意,您可能会遇到以下错误:
xcodebuild:错误:无法解决程序包依赖性: 服务器SSH指纹无法验证。
xcodebuild:错误:无法解决程序包依赖性: 身份验证失败,因为凭据被拒绝
发生未知错误。无法连接到本地主机:连接被拒绝(-1)
您实际上可以通过以下方式之一告诉Xcode使用ssh密钥和已知主机~/.ssh
的标准位置:
a。这适用于基于容器的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
)
xcodebuild -scmProvider system
确保将您的私人回购主机添加到~/.ssh/known_hosts
a。用于位桶
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
答案 4 :(得分:0)
您将使用没有任何嵌入式身份验证信息的URL,然后将凭据查找作为git交互的一部分进行处理。这样做的缺点是,每个需要访问的人都必须正确地独立配置他们的系统,然后事情才能起作用。 (但是将2FA和SSO混在一起,可能无法解决单个配置。)
一种方法是使用SSH依赖git,并使用SSH的配置支持来代表您提供凭据。这是another answer中推荐的方法。
但这不是唯一的方法:您可以使HTTPS URL正常工作。
为此,您需要使用git的内置支持来获取凭据。这就是每个团队成员用来拥有HTTPS URL的方式,该URL要求进行身份验证,而无需反复要求他们提供凭据。
Git支持使用credential helper处理授权。用于仓库的帮助程序在您的git config中配置为credential.helper的值。具体可用的助手以及如何安装和配置所选的助手,取决于您的平台。 GitHub has per-platform docs进行设置。 《 Git书》中还有一个Credential Storage chapter。