如何将 Swift Package Manager 与私有存储库一起使用?

l -*_*c l 17 git swift-package-manager

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

添加一个usernamepassword可以在功能上工作:

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

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

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

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

l -*_*c l 23

我最终为“unix”类型系统找到的一种解决方案是使用 SSH gitURL 并将Host配置添加到~/.ssh/config. 这种方法适用于 macOS/Linux 命令行和 Xcode。

使用 ssh 表单作为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") ),
  ],
)
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,gitlab.com.myteam对应于一个Hostin~/.ssh/config

### 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
Run Code Online (Sandbox Code Playgroud)

SSH 密钥对可以根据需要为账户生成并应用于个人的在线 git 服务。

ssh-keygen \
   -b 4096 \
   -t rsa \
   -C "my_work_username@example.com" \
   -f ~/.ssh/my_work_key_rsa
Run Code Online (Sandbox Code Playgroud)

每个团队成员都可以设置一个单独的、对应的Hostssh 配置。的Host将是相同的,但是,实际的公共/私有密钥对(a)的特定于用户,(b)中,可以分开管理从任何代码开发和(c)的可自动安装后使用。


Ted*_*Ted 17

将 spm 与私有存储库一起使用时

  • 通过vpn或访问proxies
  • 可通过 ssh
  • 使用复杂的 ~/ssh/config 和 /etc/hosts 设置,

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

你可以在里面看到

~/Library/Preferences/com.apple.dt.Xcode.plist
Run Code Online (Sandbox Code Playgroud)

它看起来像这样

在此处输入图片说明

在 ci 环境中,这并不令人愉快,您可能会收到以下错误:

xcodebuild:错误:无法解析包依赖:服务器 SSH 指纹验证失败。

xcodebuild:错误:无法解析包依赖项:身份验证失败,因为凭据被拒绝

出现未知错误。无法连接到本地主机:连接被拒绝 (-1)

您实际上可以~/.ssh通过以下方式之一告诉 Xcode 使用 ssh 密钥和已知主机的标准位置:

一种。这适用于基于容器的 ci,如圆 ci

sudo defaults write com.apple.dt.Xcode IDEPackageSupportUseBuiltinSCM YES
Run Code Online (Sandbox Code Playgroud)

湾 这适用于裸机

/usr/libexec/Plistbuddy -c "Add :IDEPackageSupportUseBuiltinSCM bool 1" ~/Library/Preferences/com.apple.dt.Xcode.plist
Run Code Online (Sandbox Code Playgroud)

C。如果上述方法对您不起作用,请尝试添加-scmProvider systemxcodebuild 命令

gym(
    ...
    use_system_scm: true
)
Run Code Online (Sandbox Code Playgroud)
scan(
    ...
    use_system_scm: true
)
Run Code Online (Sandbox Code Playgroud)
  • 用于使用具有私有仓库的 SPM 运行解析依赖项
fastlane run spm --use_system_scm true 

Run Code Online (Sandbox Code Playgroud)
  • 非快车道用户
xcodebuild -scmProvider system
Run Code Online (Sandbox Code Playgroud)

确保您的私人回购主机已添加到 ~/.ssh/known_hosts

一种。用于比特桶

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 
Run Code Online (Sandbox Code Playgroud)

湾 对于 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
Run Code Online (Sandbox Code Playgroud)

C。其他

ssh-keyscan your-host.com >> ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你一百万遍!FWIW我只需要在“裸机”(例如安装了xcode的vanilla mac)上执行以下操作(无需sudo):“defaults write com.apple.dt.Xcode IDEPackageSupportUseBuiltinSCM YES” (3认同)

Mat*_*elf 6

通过.netrc使用extractions/netrc@v1 action.

  Build:
    runs-on: macos-12
    steps:
      - uses: actions/checkout@v3
      - uses: extractions/netrc@v1
        with:
          machine: github.com
          username: user
          password: ${{ secrets.SWIFT_PACKAGE_MANAGER_PAT }}
      - uses: extractions/netrc@v1
        with:
          machine: api.github.com
          username: user
          password: ${{ secrets.SWIFT_PACKAGE_MANAGER_PAT }}
Run Code Online (Sandbox Code Playgroud)

此后,xcodebuild将在访问私有存储库时使用 PAT。

我尝试使用GITHUB_TOKEN,但似乎它仅限于当前的存储库。因此,我为有权访问私有存储库的 GitHub 帐户创建了一个 PAT,并将其添加到存储库机密中。

  • 您需要配置 `github.com` 和 `api.github.com`。用户名对于 PAT 来说并不重要,因此只需使用“user”即可。 (3认同)