Node/npm: 如何管理全局安装的 devDependencies

7
我正在构建一个Node模块,其中包含devDependencies,应该全局安装,例如jasmine-node和jshint。我需要的是能够在我的makefile / npm脚本部分引用它们的二进制文件以运行测试、lint等。换句话说,我不希望以编程方式require()它们。

经过搜索后,我仍然对如何处理此事感到困惑:

1)我的第一种方法是假设这些模块将被全局安装,在我的模块文档中澄清这一点,并将它们的二进制文件作为全局引用 - 即期望它们可全局使用。这与以下建议冲突

确保避免引用全局安装的二进制文件。相反,将其指向本地node_modules,该目录会在隐藏的.bin目录中安装二进制文件。确保该模块(在本例中为“mocha”)在您的package.json中的devDependencies下,以便在运行npm install时将二进制文件放置在那里。

(摘自this post

总的来说,这听起来是正确的,因为上述设置相当脆弱。

2)我的下一步方法是将这些模块明确地包含在devDependencies中(尽管它们仍然全局安装在我的系统上(很可能也是在用户和贡献者的系统上))。这样可以确保在需要时有适当版本的二进制文件,并且现在我可以通过node_modules/.bin/引用它们。

然而,我现在与这条建议发生了冲突

如果你要require()它,请在本地安装。

(取自npm文档

尽管如此,我确实注意到npm install现在实际上不会为全局安装的模块获取任何内容(不显示网络活动)。


我的问题:

  • 在 devDependencies 中提到的全局安装模块的本地版本,只是在 npm install 期间复制的全局版本吗?
  • 2)这样做是正确的方法吗?还是我忽略了其他做法?
2个回答

7
这是我个人对此问题的看法,与node.js的惯例显然不同,但我认为这是一种总体上更优越的方法。具体内容在我的博客文章中有详细说明(免责声明关于自我宣传之类的话)《管理每个项目的解释器和PATH》
基本上就是:
  1. 永远不要使用npm -g。不要安装全局模块。
  2. 相反,将您的PATH调整为包含projectDir/node_modules/.bin

1
有趣。不过对我的工作流程有点干扰 :) - 我一定会在经济能力允许的时候认真考虑它。 - biril

2
重新审视我自己的问题几年后,我觉得现在可以放心地说引用的“建议”已经过时了。

如果你要使用require(),就将其安装在本地。

现在,npm run是一种很好的任务管理/自动化方式,它会自动将本地安装的模块导出到执行之前的路径中。因此,完全有道理在本地安装不需要require()的模块,如代码检查和测试运行器。(顺便说一下,这与Peter Lyons几年前提供的答案完全一致 - 当时可能与node.js的常见做法明显背道而驰,但今天已经被广泛接受:))
至于我的第二个问题

在devDependencies中提到的全局安装模块的本地版本只是全局版本的快照(副本),在npm install期间进行了拍摄吗?

我非常有信心回答是否定的。(也许当时我观察到安装本地模块时缺乏网络活动,这也是同时全局安装的本地模块的缘故?)

注意,2016年11月12日

原始问题链接到的相关npm文档已移至此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接