在特定版本中从Git安装npm


181

假设我已经为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还是对此有更好的解决方案?

Answers:


193

一个依赖关系必须是可以从registry要由刚安装指定一个version描述符

当然您可以创建并使用自己的注册表,而不是registry.npmjs.org不应该公开共享您的项目。

但是,如果不在注册表中,则必须使用URLGit URL进行引用。要使用Git URL指定版本<commit-ish>,请在末尾作为URL片段包含相应的标记(例如标签)。

例如,对于名为的标签0.3.1

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

注意:以上代码段显示的基本网址与问题中发布的网址相同。

删除的部分(...)应该填写:

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

而且,当无法使用SSH访问时,将需要使用其他地址格式:

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

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


1
这篇文章中的某些链接似乎已过时,因为它们链接到404页。遗憾的是,由于其中一些是我一直在寻找的信息。
MvG 2015年

5
我使用标记了特定版本git tag -a "1.0.0"并推git push --tags,然后#v1.0.0git+ssh依赖项的末尾添加。但是npm update什么也没有发生。
loretoparisi

3
@loretoparisi对不起。我并不是说建议添加v是必要的。在之后#,该片段应与标签的全名(或其他commitsh)匹配-在您的情况下为#1.0.0
乔纳森·洛诺夫斯基

截至2016年7月,托管自己的注册表已变得越来越复杂,因为它们正从couchdb转向微服务
Yan Foto

3
现在,你可以做npm i {owner}/{project}#{tag}或添加"{library}": "github:{owner}/{project}#{tag}"到的package.json而不是使用git@github.comgit://github.com
麦克W¯¯

237

接受的答案对我不起作用。这是我要从github提取软件包的操作:

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

或在package.json上手动添加它:

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

41
如果您使用的是http / https,请确保包含“ git +”前缀:"package": "git+https://github.com/username/package.git#commit"
Ates Goral 2014年

4
这在“ npm install”中一直有效,但是当我尝试运行我的应用程序时,require('mymodule')找不到它的包。即使程序包位于具有相同名称的node_modules目录中。
Derrick

哦,有问题的模块未包含我想要的特定提交的构建,因此,如果您遇到相同的问题,则可能必须手动构建它。
Derrick

1
你也可以使用#tag通常指着一个版本号
的deltree

1
@surjikal,您需要先标记发行版,然后才能在git中使用版本号。例如git tag -a v1.0.1 && git push --tag && git push@Jonathan Lonowski在评论中也说过。
dotnetCarpenter's

80

如果按版本表示标签或发行版,则github提供这些文件的下载链接。例如,如果我要安装提取版本0.3.2(npm上不提供),则将其添加到package.json下面dependencies

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

与提交哈希方法相比,唯一的缺点是保证了哈希不能代表已更改的代码,而可以替换标签。幸运的是,这种情况很少发生。

更新:

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

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

提交可以是任何提交,例如标记。对于GitHub,您甚至可以删除初始名称,github:因为它是默认名称。


存档模式也适用于提交。例如,`纱加 github.com/github/fetch/archive/... `
BVJ

最干净的解决方案。
Charley Bodkin

8

我的例子@qubyte评论上面得到切碎的,所以这里的东西是更易于阅读...

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


存档模式也适用于提交。例如,获取 @ 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/

yarn add  https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz

用于相关的vuex提交



3

我在这里描述了运行时遇到的问题npm install-程序包未出现在中node_modules

问题是已安装软件包的namepackage.json不同于导入软件包的名称(package.json我项目的键)。

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


希望我能早些找到您的答案😓-我刚刚解决了同样的问题,使我挣扎了一段时间。并且这个name要求在网络上很少被提及(。至少我不会因此而引起)。
卡马菲瑟

“将您的程序包依赖项添加到package.json中,指定完整的作用域程序包名称。” -并未真正强调它:help.github.com/en/articles/…–
Kamafeather

我发现这npm install --save git+https://<remote-github-repo-url>是一种将来不再遇到此问题的非常安全的方法。
卡马菲瑟(Kamafeather),

2

我需要运行两个版本的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


1
谢谢,我一直在尝试以其他可以想象的方式导入它。我必须看到您的代码片段才能意识到我必须直接从文件中导入。
维克多·伊文斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.