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 。

基本上归结为:

  1. 切勿使用npm -g。 切勿安装全局模块。
  2. 相反,请调整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文档已移到此处 。