npm在特定版本中从Git安装

时间:2013-01-06 23:32:25

标签: node.js npm

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

"private": "true"

package.json文件,我也知道我可以npm install使用文件系统路径或git存储库链接(包括GitHub)。{/ p>

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

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

我现在想要的不是链接到最新版本,而是链接到特定版本。我知道的唯一可能是使用其ID链接到特定的提交。但与使用0.3.1等版本号相比,这种方式的可读性和可维护性更低。

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

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

8 个答案:

答案 0 :(得分:202)

接受的答案对我不起作用。这是我正在做的从github提取包:

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

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

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

答案 1 :(得分:157)

dependency只需要registry即可specifying a version descriptor安装create and use your own registry

如果您的项目不应公开分享,那么您当然可以registry.npmjs.org而不是URL

但是,如果它不在注册表中,则必须由Git URL<commit-ish>引用。要指定包含Git网址的版本,请在末尾添加适当的URL fragment(例如代码)link

示例,对于名为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"

根据您的操作系统,您也可能{{3}}到您从Github克隆的另一个文件夹中的依赖项。

答案 2 :(得分:65)

如果版本是指标签或版本,那么github会为这些提供下载链接。例如,如果我要安装fetch版本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:,因为它是默认值。

答案 3 :(得分:8)

我对@qubyte above的评论被砍掉了,所以这里的内容更容易阅读......

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

归档模式也适用于提交。例如,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/模式的提交:

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

表示相关的vuex commit

答案 4 :(得分:6)

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

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

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

答案 5 :(得分: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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

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

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

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