214

假设我已经为 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,或者是否有更好的解决方案?

4

8 回答 8

280

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

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

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

"dependencies": {
  "package": "git://github.com/username/package.git#commit"
}
于 2013-08-05T02:09:13.007 回答
222

必须通过指定描述符来安装依赖registryversion

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

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

例如,对于名为 的标签0.3.1

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

注意:上面的代码片段显示的基本 URL 与问题中发布的相同。

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

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

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

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

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

于 2013-01-06T23:54:56.633 回答
85

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

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

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

更新:

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

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

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

于 2014-12-24T01:14:37.137 回答
12

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

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

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

于 2018-07-27T14:34:33.980 回答
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 提交

于 2018-03-03T06:08:56.477 回答
4

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

包.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

于 2020-05-06T17:25:25.330 回答
3

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

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

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

于 2019-01-23T19:53:05.650 回答
1

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

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

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

于 2013-01-07T13:44:41.987 回答