首页 > 解决方案 > git+ssh 在像 git+ssh://git@github.com/xxx.git 这样的 npm repo 路径中是什么意思

问题描述

我看到了一个 npm 存储库,它在 package.json 中被称为git+ssh://git@github.com/xxx.git. 我知道这是 ssh 协议,但我不知道 git+ssh 在克隆 repo 时会做什么,我只使用git@github.com/xxx.git. 我四处搜索,但无法找到任何结果。

标签: gitgithubnpmpackage.json

解决方案


当通过 git 托管 npm 包时,npm 还需要知道使用哪种传输协议将包文件从 repo 传输到客户端。为此,存在以下选项:ssh、https、http、文件(请参阅https://docs.npmjs.com/cli/install)。

npm 的创建者决定将这些信息放在协议名称中,用+符号分隔信息,这样它就变得更加示意性了。因此,当npm install迭代您的依赖项并看到一个依赖项时,git+ssh它知道它将通过连接到存储库ssh,然后使用您的本地git二进制文件在本地签出项目文件。

我猜他们也可以将协议命名gitwithssh为 in,gitwithssh://git@github.com/xxx.gitgit+ssh看起来更简洁且逻辑上分开,因此更容易通过正则表达式进行解析。

这是 npm 源代码中实际负责将协议信息拆分为type(= git) 和实际协议 (eg ssh) 的部分:https ://github.com/npm/npm-package-arg/blob/v7 .0.0/npa.js#L221

我只使用 git@github.com/xxx.git。

您不能使用这种格式将包注册为 npm 的依赖项。尝试执行npm i git@github.com/xxx.git——它不起作用。这种格式只能通过例如使用git clone

但是,您可以在使用 ssh 协议作为前缀时使用此格式:ssh://git@github.com/xxx.git. 这实际上是 npm 在幕后使用的“git+ssh”的“规范化”形式(另请参阅https://github.com/npm/normalize-git-url如何将您的git+ssh://...转换为ssh://git@...)。


推荐阅读