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

bir*_*ril 6 javascript module dependency-management node.js npm

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

在挖掘之后,我仍然对如何处理这个问题感到困惑:

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

确保避免引用全局安装的二进制文件.而是将其指向本地node_modules,它将二进制文件安装在隐藏的.bin目录中.确保模块(在本例中为"mocha")位于devDependencies下的package.json中,以便在运行npm install时将二进制文件放在那里.

(摘自这篇文章)

这通常听起来是正确的,因为上述设置相当脆弱.

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

但是我现在与这条建议发生冲突

如果你想要()它在本地安装它.

(摘自npm docs)

无论如何,我注意到npm install现在实际上不会为全局安装的模块提取任何内容(不显示网络活动).


我的问题:

  • 全局安装模块的本地版本(在devDependencies中提到)是全局模块的快照(副本)npm install吗?
  • 2)正确的方法是这样做吗?还是有其他一些我不知道的做法?

Pet*_*ons 7

这是我对此的个人看法,这与node.js常见做法明显不同,但我认为这是一种整体优越的方法.它在我自己的博客文章中有详细说明(关于自我推销的免责声明,yada yada)管理每个项目的口译员和PATH.

它基本归结为:

  1. 永远不要使用npm -g.切勿安装全局模块.
  2. 相反,调整路径,以包含projectDir/node_modules/.bin代替


bir*_*ril 2

在最初写出几年后重新审视我自己的问题,我觉得我现在可以有把握地说引用的“建议”

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

不再站立了。(它npm 文档的一部分,但在撰写本文时,发布的 2 年前的链接给了我一个 404 错误。)

如今,npm run这是一种进行任务管理/自动化的好方法,它会在执行之前自动将本地安装的模块导出到路径中。require()d因此,在本地安装不属于 linter 和测试运行程序的模块是非常有意义的。(顺便说一句,这与 Peter Lyons 几年前提供的答案完全一致 - 当时它可能“与 Node.js 的常见做法截然不同”,但今天它已被广泛接受:))

至于我的第二个问题

全局安装的模块的本地版本(在 devDependency 中提到)只是在 npm 安装期间获取的全局模块的快照(副本)吗?

我非常有信心答案是否定的。(也许我当时在安装全局安装的本地模块期间观察到网络活动的缺乏是由于缓存造成的......?)


请注意,2016 年 11 月 12 日

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