从特定版本的 Git 安装 npm

Posted

技术标签:

【中文标题】从特定版本的 Git 安装 npm【英文标题】:npm install from Git in a specific version 【发布时间】:2012-12-20 17:03:03 【问题描述】:

假设我已经为 Node.js 编写了一个模块,我想保持私有。我知道我可以(应该)添加以下行:

"private": "true"

package.json文件,我也知道我可以npm install这个模块使用文件系统路径或git存储库的链接,包括GitHub。

我也知道我可以将这样的文件系统路径或 git repo 的链接放入package.json,这样dependencies 部分可能看起来像这样:

"dependencies": 
  "myprivatemodule": "git@github.com:..."

我现在想要的不是链接到最新版本,而是链接到特定版本。我知道的唯一可能性是使用其 ID 链接到特定提交。但这比使用诸如0.3.1 之类的版本号更不可读,更难维护。

所以我的问题是:是否可以指定这样的版本号并让 npm 在 git 存储库中搜索包含此版本的最新提交?

如果没有,您如何在您的项目中解决此问题?您是否使用提交 ID 或有更好的解决方案?

【问题讨论】:

【参考方案1】:

dependency 必须可从registry 获得,才能由specifying a version descriptor 安装。

如果您的项目不应公开共享,您当然可以create and use your own registry 而不是registry.npmjs.org

但是,如果它不在注册表中,则必须由 URL 或 Git URL 引用。要使用 Git URL 指定版本,请在末尾包含适当的 <commit-ish>,例如标签,作为 URL fragment。

例如,对于名为 0.3.1 的标签:

"dependencies": 
  "myprivatemodule": "git@github.com:...#0.3.1"

注意:上面的 sn-p 显示的基本 URL 与问题中发布的相同。

应填写剪切部分(...):

"myprivatemodule": "git@github.com:owner/project.git#0.3.1"

而且,当 SSH 访问不可用时,将需要不同的地址格式:

"myprivatemodule": "git://github.com/owner/project.git#0.3.1"

根据您的操作系统,您还可以 link 到另一个文件夹中的依赖项,您从 Github 克隆了该依赖项。

【讨论】:

似乎这篇文章中的一些链接已经过时了,因为它们导致了 404 页。很遗憾,因为其中一些是我一直在寻找的信息。 我用git tag -a "1.0.0" 标记了一个特定版本并推送git push --tags,然后我在git+ssh 依赖项的末尾添加了#v1.0.0。但是npm update 没有任何反应。 @loretoparisi 对不起。我并不是要建议添加v 是必要的。在# 之后,fragment 应该与标签的全名(或其他commitsh)匹配——在你的情况下,#1.0.0 截至 2016 年 7 月,托管自己的注册表变得更加复杂,因为它们正在从 couchdb 转移到微服务 您现在可以使用npm i owner/project#tag 或将"library": "github:owner/project#tag" 添加到package.json,而不是使用git@github.comgit://github.com【参考方案2】:

如果您使用多个模块执行此操作并希望对版本有更多控制权,您应该考虑拥有自己的私有 npm 注册表。

通过这种方式,您可以将模块发布到您的私有 npm 注册表,并使用与公共模块相同的方式使用 package.json 条目。

https://docs.npmjs.com/files/package.json#dependencies

【讨论】:

所有链接都是404【参考方案3】:

接受的答案对我不起作用。这是我从 github 拉包的方法:

npm install --save "git://github.com/username/package.git#commit"

或者在 package.json 中手动添加:

"dependencies": 
  "package": "git://github.com/username/package.git#commit"

【讨论】:

如果您使用的是 http/https,请确保包含“git+”前缀:"package": "git+https://github.com/username/package.git#commit" 这在“npm install”中有效,但是当我尝试运行我的应用程序时,require('mymodule') 找不到它的包。即使包位于 node_modules 目录中,具有相同的名称。 哦,有问题的模块没有包含我想要的特定提交的构建,所以如果你有同样的问题,你可能需要手动构建它。 你也可以使用#tag,它通常指向一个版本号 @surjikal 您需要先标记发布,然后才能在 git 中使用版本号。例如git tag -a v1.0.1 && git push --tag && git push @Jonathan Lonowski 在评论中也说过。【参考方案4】:

如果版本是指标签或版本,那么 github 会提供这些的下载链接。例如,如果我想安装fetch 0.3.2 版本(在npm 上不可用),那么我在dependencies 下添加package.json

"fetch": "https://github.com/github/fetch/archive/v0.3.2.tar.gz",

与提交散列方法相比,唯一的缺点是散列保证不代表更改的代码,而标签可以被替换。幸好这种情况很少发生。

更新:

这些天来,我使用的方法是 GitHub 服务依赖项的紧凑表示法:

"dependencies": 
  "package": "github:username/package#commit"

commit 可以是任何提交的东西,比如标签。对于 GitHub,您甚至可以删除初始的 github:,因为它是默认值。

【讨论】:

归档模式也适用于提交;例如,`纱线添加github.com/github/fetch/archive/…` 最干净的解决方案。 请注意,如果使用标签,则上面的commit 必须是准确的标签名称。当您使用 v3.0.0 标记您的发布时,您需要使用带有 v 前缀的确切标记。【参考方案5】:

我对@qubyte above 的示例评论被截断了,所以这里有一些更容易阅读的内容...

@surjikal 描述的方法 above 适用于分支提交,但不适用于我尝试包含的 tree 提交。


归档模式也适用于提交。比如fetch@a2fbf83

npm

npm install  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

纱线

yarn add  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

格式

 https://github.com/<owner>/<repo>/archive/<commit-id>.tar.gz


这是需要 /archive/ 模式的 tree 提交:
yarn add  https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz

相关vuex commit

【讨论】:

【参考方案6】:

此命令从特定的 git commit 安装 npm 包 username/package

npm install https://github.com/username/package#3d0a21cc

这里3d0a21cc是提交哈希的前8个字符。

【讨论】:

【参考方案7】:

我在这里描述了我在运行 npm install 时遇到的一个问题 - 包没有出现在 node_modules 中。

问题是已安装包的package.json 中的name 值与导入包的名称不同(我的项目的package.json 中的键)。

因此,如果您安装的项目名称是 some-package(名称值在其 package.json 中),那么 在您项目的package.json 中写:"some-package": "owner/some-repo#tag"

【讨论】:

我希望我早点找到你的答案? - 我刚刚解决了,同样的问题让我挣扎了一段时间;而这个name 的要求在网上并不经常被提及..(至少我不会因此而受到影响)。 “将你的包依赖项添加到你的 package.json 中,指定完整的范围包名。” - 不是很强调它:help.github.com/en/articles/… 我发现npm install --save git+https://&lt;remote-github-repo-url&gt; 是一种非常安全的方法,以后不会再遇到这个问题。【参考方案8】:

我需要运行两个版本的tfjs-core,发现都需要在安装后构建。

package.json:

"dependencies": 
  "tfjs-core-0.14.3": "git://github.com/tensorflow/tfjs-core#bb0a830b3bda1461327f083ceb3f889117209db2",
  "tfjs-core-1.1.0": "git://github.com/tensorflow/tfjs-core#220660ed8b9a252f9d0847a4f4e3c76ba5188669"

然后:

cd node_modules/tfjs-core-0.14.3 && yarn install && yarn build-npm && cd ../../
cd node_modules/tfjs-core-1.1.0  && yarn install && yarn build-npm && cd ../../

最后,使用库:

import * as tf0143 from '../node_modules/tfjs-core-0.14.3/dist/tf-core.min.js';
import * as tf110 from '../node_modules/tfjs-core-1.1.0/dist/tf-core.min.js';

效果很好,但肯定是#hoodrat

【讨论】:

谢谢,我一直在尝试以其他可以想象的方式导入它。我必须看到你的 sn-p 才能意识到我必须直接从文件中导入。

以上是关于从特定版本的 Git 安装 npm的主要内容,如果未能解决你的问题,请参考以下文章

使用 brew 在 MacOS 上安装特定的 git 版本

如何安装小于任何特定版本的npm软件包

如何在 Windows 上将 NPM 升级到特定版本 6.4.1?

npm install specific version 不安装特定版本

将 NPM 从 5.8 升级到最新版本

安装git