如何在私人回购中使用`swift-package-manager`?

时间:2017-12-16 04:17:12

标签: git swift-package-manager

如何使用存储在私有存储库中的依赖项的Swift包管理器?

添加usernamepassword可以在功能上发挥作用:

let package = Package(
  name: "MyPackage",
  dependencies: [
    .package(url: "https://username:password@gitlab.com/me/MyPackage.git", .branch("develop"))     
  ]
)

但是,username:password方法存在的问题包括(但不限于)指定Package.swift用户名,以及将纯文本凭据放入存储库。

理想情况下,解决方案是:

  1. 不在存储库中存储任何纯文本或令牌凭据。
  2. 允许每个团队成员拥有自己的凭据。

5 个答案:

答案 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与私有仓库一起使用时

  • 可通过vpnproxies访问
  • 可通过ssh
  • 访问
  • 具有复杂的〜/ ssh / config和/ etc / hosts设置,

请注意,Xcode保留自己的文件夹.sshknown_hosts

您可以在

中看到它
~/Library/Preferences/com.apple.dt.Xcode.plist

它看起来像这样

enter image description here

在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