如何让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指定密钥路径
- 在项目根目录的
.ssh文件夹中创建config文件,添加如下配置:
Host github.com-FrameworkX HostName github.com User git IdentityFile ./frameworkAKey # 可使用项目根目录相对路径,也可写绝对路径 IdentitiesOnly yes
- 修改
Package.swift中的依赖URL,替换为Config中定义的Host:
.package(url: "git@github.com-FrameworkX:xxxx/FrameworkX.git", exact:"1.0.0")
- 确保文件权限符合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中使用,可通过以下步骤配置环境变量:
- 打开Xcode的「Scheme Editor」(点击顶部工具栏的Scheme → Edit Scheme)
- 选择「Build」阶段,切换到「Arguments」标签
- 在「Environment Variables」中添加
GIT_SSH_COMMAND,值为ssh -i ${PROJECT_DIR}/.ssh/frameworkAKey
关键注意事项
- SSH对文件权限要求严格,必须确保
.ssh目录权限为700,密钥及配置文件权限为600,否则会被SSH拒绝加载 - 若使用方案1,需确保
config文件中的路径指向正确,避免因路径错误导致密钥无法被识别
内容的提问来源于stack exchange,提问作者Vishwa
相关产品推荐
相关产品推荐

