从特定版本的 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.com
或git://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://<remote-github-repo-url>
是一种非常安全的方法,以后不会再遇到这个问题。【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 上将 NPM 升级到特定版本 6.4.1?