You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Swift Package Manager引用包内.ssh目录认证私有Git仓库

问题描述

我维护一个包含私有SPM依赖的Swift包,依赖配置如下:

dependencies: [
    .package(url: "git@github.com:xxxx/FrameworkX.git", exact:"1.0.0")
],

尝试通过GitHub Deploy Key(SSH密钥)认证私有仓库时,按以下步骤操作:

  • 在SPM包根目录创建.ssh目录
  • 生成名为frameworkAKey的公钥和私钥对
  • 在GitHub私有仓库的「Deploy Keys」中添加该公钥

但打开Package.swift时,SPM解析依赖失败,提示「Authentication failed error」;将frameworkAKey移至macOS用户目录~/.ssh后,SPM能正常解析依赖。

请问如何让SPM使用SPM包根目录下的.ssh目录(而非用户目录下的)?还需要执行哪些额外操作?

解决方案

要让SPM加载项目根目录内的SSH密钥,核心是让Git/SSH工具找到并正确使用自定义路径的密钥,以下是两种可行方案:

方案1:通过SSH Config指定密钥路径

  1. 在项目根目录的.ssh文件夹中创建config文件,添加如下配置:
Host github.com-FrameworkX
    HostName github.com
    User git
    IdentityFile ./frameworkAKey  # 可使用项目根目录相对路径,也可写绝对路径
    IdentitiesOnly yes
  1. 修改Package.swift中的依赖URL,替换为Config中定义的Host:
.package(url: "git@github.com-FrameworkX:xxxx/FrameworkX.git", exact:"1.0.0")
  1. 确保文件权限符合SSH要求:
    • 执行chmod 700 ./path/to/project/.ssh设置目录权限
    • 执行chmod 600 ./path/to/project/.ssh/frameworkAKey设置密钥文件权限
    • 执行chmod 600 ./path/to/project/.ssh/config设置配置文件权限

方案2:通过环境变量指定SSH密钥

无需修改SSH Config或依赖URL,而是在触发SPM操作时,通过GIT_SSH_COMMAND环境变量强制Git使用指定密钥:

  • 终端执行SPM命令时:
GIT_SSH_COMMAND="ssh -i ./path/to/project/.ssh/frameworkAKey" swift package resolve
  • 如果在Xcode中使用,可通过以下步骤配置环境变量:
    1. 打开Xcode的「Scheme Editor」(点击顶部工具栏的Scheme → Edit Scheme)
    2. 选择「Build」阶段,切换到「Arguments」标签
    3. 在「Environment Variables」中添加GIT_SSH_COMMAND,值为ssh -i ${PROJECT_DIR}/.ssh/frameworkAKey

关键注意事项

  • SSH对文件权限要求严格,必须确保.ssh目录权限为700,密钥及配置文件权限为600,否则会被SSH拒绝加载
  • 若使用方案1,需确保config文件中的路径指向正确,避免因路径错误导致密钥无法被识别

内容的提问来源于stack exchange,提问作者Vishwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:32:50