我有一个 npm 项目,它依赖于几个私有 Github 存储库。我正在临时服务器上部署该项目,并且为每个私有存储库设置了单独的部署密钥,因为 Github 不允许每个私有存储库使用相同的密钥。我已经像这样设置了〜/.ssh/config:
Host 1.github.com
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/key-1
StrictHostKeyChecking no
Host 2.github.com
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/key-2
StrictHostKeyChecking no
Host 3.github.com
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/key-3
StrictHostKeyChecking no
在 package.json 中,我有以下私有 Github 存储库依赖项:
"project1": "git+ssh://[email protected]/myorg/project1.git",
"project2": "git+ssh://[email protected]/myorg/project2.git",
"project3": "git+ssh://[email protected]/myorg/project3.git"
但是,这不起作用,我收到
Permission denied (publickey)
错误。使用 Github 帐户访问存储库的用户也可以使用这些项目。
如何让钥匙正常工作?
如果你想为不同的github帐户使用不同的密钥,则需要使用配置文件中定义的别名来修改git url,例如:
"project1": "git+ssh://[email protected]/myorg/project1.git",
"project2": "git+ssh://[email protected]/myorg/project2.git",
"project3": "git+ssh://[email protected]/myorg/project3.git"
如果稍后有人提出这个问题:
重要的是要注意 @Kitanotori 对 @Jakuje 的回答的评论,您必须在每个开发人员的计算机上设置自定义 ssh 配置,这是一个烦人的额外步骤。
我决定解决这个问题的方法是使用
GIT_SSH_COMMAND
环境变量。
假设一个节点项目位于存储库中:ProjectA 假设另外两个项目位于自己的存储库中:ProjectB 和 ProjectC 假设我们想要将 ProjectB 和 Project C 作为 github 托管的 npm 包导入到 ProjectA
对于本地开发,每个开发人员都应该对自己的 Github 帐户拥有 SSH 读写权限,因此运行 npm install 应该不会出现问题,ProjectB 和 ProjectC 都会成功下载。
对于部署,我们希望使用部署密钥而不是任何开发人员的个人密钥。
技巧如下:将 ProjectB 和 ProjectC 放入 ProjectA 的 package.json 的可选依赖项中
在部署脚本中,运行
npm ci --omit=optional
这将安装除个人 Github 依赖项(ProjectB 和 ProjectC)之外的所有依赖项
然后运行:
export GIT_SSH_COMMAND='ssh -i pathToYourProjectBDeployKey'
那么,
npm i ProjectB
对于 ProjectC 也是如此:
export GIT_SSH_COMMAND='ssh -i pathToYourProjectCDeployKey'
npm i ProjectC
现在您的
node_modules
文件夹将保存部署的所有依赖项!
需要注意的是,通常您的
package-lock.json
文件保存了最近安装的外部 git 依赖项的确切提交,并且无论您的 package-lock.json
文件如何,此方法都将始终安装最新的提交。您可能想根据您的需要调整此方法。