假设我已经为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或者是否有更好的解决方案?
答案 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条目。
答案 7 :(得分:0)
我在这里描述了运行npm install
时遇到的问题-程序包未出现在node_modules
中。
问题在于已安装软件包name
中的package.json
值与导入软件包的名称(我项目的package.json
中的键)不同。
因此,如果您安装的项目名称为some-package
(其名称为package.json
),则
在项目的package.json
中写:"some-package": "owner/some-repo#tag"
。