Node / npm:如何pipe理全局安装的devDependencies
我正在构build一个应该全局安装的devDependencies的Node模块,比如jasmine-node和jshint。 我基本上需要的是能够在我的makefile / npm脚本部分中引用它们的二进制文件来运行testing,lint等。换句话说,我不希望以编程方式要求()它们。
经过挖掘,我仍然对如何处理这个问题感到困惑:
1)我的第一个方法是假设这些模块将全局安装,在我的模块的文档中澄清这一点,并将它们的二进制文件引用为全局variables – 即期望它们在全局范围内可用。 这与这个build议相冲突
确保避免引用全局安装的二进制文件。 而是将其指向本地node_modules,它将二进制文件安装在隐藏的.bin目录中。 确保模块(在本例中为“mocha”)位于devDependencies下的package.json中,以便在运行npm install时将二进制文件放在那里。
(取自这个职位 )
这一般听起来是正确的,因为上述设置相当脆弱。
2)我的下一个方法是明确地将这些模块包含在devDependencies中(虽然它们仍然全局安装在我的系统上(也很可能在用户&贡献者的系统上))。 这可以确保在需要的时候可以使用适当版本的二进制文件,现在我可以通过node_modules/.bin/
引用它们。
但是我现在和这个build议是冲突的
如果你打算要求()它在本地安装。
(取自npm文件 )
无论如何,我注意到npm install
现在实际上对全局安装的模块没有任何提示 (不显示networking活动)。
我的问题:
- 全局安装的模块(在devDependencies中提到)的本地版本只是在
npm install
期间拍摄的全局模块的快照(副本)? - 2)正确的方法去做这件事? 还是有一些其他的做法我错过了?
这是我个人对此的看法,这与node.js的惯例是截然不同的,但我相信这是一个总体上优秀的方法。 这是详细的在我自己的博客文章(免责声明自我推广,yada yada) pipe理每个项目的口译员和path 。
基本上归结为:
- 切勿使用npm -g。 切勿安装全局模块。
- 相反,请调整PATH以包含
projectDir/node_modules/.bin
在原本写了几年之后重新回到我自己的问题,我现在可以放心地说,引用的“build议”
如果你打算要求()它在本地安装。
再也站不住脚了 (这是 npm文档的一部分,但是在写这篇文章的时候,这个2年前的链接给了我一个404)。
现在, npm run
是执行任务pipe理/自动化的好方法,它会自动将本地安装的模块导出到执行前的path中。 因此,在本地安装require()d
模块require()d
例如棉绒和testing运行程序require()d
是非常有意义的。 (顺便说一句,这与Peter Lyons几年前提供的答案完全一致 – 当时可能已经“与node.js常规实践截然不同”,但现在已经被广泛接受:))
至于我的第二个问题
全局安装的模块(在devDependencies中提到)的本地版本只是在npm安装期间拍摄的全局模块的快照(副本)?
我相当确信答案是否定的(或许我在当时观察到的缺乏networking活动,在安装本地模块时也是全局安装的,这是因为caching?)
请注意,2016年11月12日
链接的原始问题的相关npm文档已移到此处 。