代码之家  ›  专栏  ›  技术社区  ›  marc-medley

如何将Swift Package Manager用于私人回购?

  •  27
  • marc-medley  · 技术社区  · 7 年前

    如何将Swift Package Manager与存储在私有存储库中的依赖项一起使用?

    添加 username password 可以在功能上工作:

    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 回复  |  直到 5 年前
        1
  •  30
  •   marc-medley    4 年前

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

    对中的依赖项url使用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") ),
      ],
    )
    

    在上述示例中, gitlab.com.myteam 对应于 主办 在里面 ~/.ssh/配置

    ### 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
    

    每个团队成员可以设置一个单独的 主办 ssh配置。这个 主办 但是,实际的公钥/私钥对(a)是特定于用户的,(b)可以与任何代码开发分开管理,(c)可以在设置后自动使用。

        2
  •  25
  •   Ted sabadow    4 年前

    将spm用于私人回购时

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

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

    你可以在

    ~/Library/Preferences/com.apple.dt.Xcode.plist
    

    看起来像这样

    enter image description here

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

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

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

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

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

    a、 这适用于基于容器的ci-like 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、 如果上述内容不适用,请尝试添加 -scmProvider system 在xcodebuild命令上

    gym(
        ...
        use_system_scm: true
    )
    
    scan(
        ...
        use_system_scm: true
    )
    
    • 用于运行具有专用Repo的SPM的resolve dependencies
    fastlane run spm --use_system_scm true 
    
    
    • 非fastlane用户
    xcodebuild -scmProvider system
    

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

    a、 对于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
    
        3
  •  2
  •   surfrider    5 年前

    我的iOS项目在Xcode中没有SSH。我的私有回购包托管在GitLab上,但可以托管在GitHub、Bitbucket和自托管GitLab上。

    过程很简单:在上面的一个主机上创建一个带有SPM包的私有回购。然后将其作为一个依赖项添加到Xcode项目中,作为一个普通包。由于repo是私有的,Xcode将要求提供凭据(对于Gitlab,这是一个访问令牌,您可以在Gitlab帐户中生成)。Xcode将记住它,并将在下次自动授权您。因此,您(和您的同事)在安装时只需输入一次凭据。并且您的1和2个条件都满足。

    您可以在Xcode中管理源代码管理帐户->首选项->帐户(按+可添加一个)。

        4
  •  2
  •   GingerBreadMane    4 年前

    我正在GitHub上使用SPM和私人回购。我在包文件中使用以下内容:

    let package = Package(
      name: "MyPackage",
      dependencies: [
        .package(url: "git@github.com:myusername/mypackage.git", .branch("develop"))     
      ]
    )
    

    然后我在~/中添加了一个主机。ssh/配置文件:

    Host github.com
      HostName github.com
      User git
      IdentityFile  ~/.ssh/id_rsa
      PreferredAuthentications publickey
    

    然后,我通过在命令行上运行以下命令,将GitHub添加到已知主机文件中:

    ssh-keyscan github.com >> ~/.ssh/known_hosts
    

    最后,我发现在命令行上使用swift进行编译时,似乎不可能将SSH密钥与密码短语一起使用,因此我创建了一个没有密码短语的新密钥。

        5
  •  -1
  •   Jeremy W. Sherman    5 年前

    您可以使用不包含任何嵌入身份验证信息的URL,然后将凭证查找作为git交互的一部分进行处理。这样做的缺点是,每个需要访问的人都必须独立地正确配置他们的系统,然后事情才能正常工作。(但将2FA和SSO混为一谈,可能无法绕过单独的配置。)

    一种方法是使用SSH依赖git,并使用SSH对配置的支持来代表您提供凭据。这是中建议的方法 another answer .

    但这不是唯一的方法:您可以使用HTTPS URL使事情正常工作。

    为此,需要使用git的内置支持获取凭据。这就是每个团队成员都会使用的HTTPS URL,该URL要求进行身份验证,而无需重复要求他们提供凭据。

    Git支持使用 credential helper . 用于repo的助手在git配置中配置为凭据的值。帮手可用的特定帮助程序以及安装和配置所选帮助程序的方式取决于您的平台。 GitHub has per-platform docs 用于设置此。Git Book还有一个 Credential Storage chapter .