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

时间:2013-06-20 17:18:29

标签: javascript node.js module npm dependency-management

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

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

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

  

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

(摘自this post

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

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

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

  

如果您要求(),请在本地安装。

(摘自npm docs

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


我的问题:

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

2 个答案:

答案 0 :(得分:7)

这是我对此的个人看法,这与node.js常见做法明显不同,但我相信这是一种整体优越的方法。我在自己的博文中有详细介绍(关于自我推销的免责声明,yada yada)Managing Per-Project Interpreters and the PATH

它基本归结为:

  1. 永远不要使用npm -g。永远不要安装全局模块。
  2. 相反,请调整您的路径以包含projectDir/node_modules/.bin而不是

答案 1 :(得分:1)

在我最初写完这篇问题几年之后重新审视自己的问题,我觉得我现在可以放心地说出引用的'建议'

  

如果您要求(),请在本地安装。

不再忍受了。 ( npm文档的一部分,但是在撰写本文时,已发布的2岁链接给了我404.)

如今,npm run是进行任务管理/自动化的好方法,它会在执行前自动将本地安装的模块导出到路径中。因此,本地安装不是require()d的模块(如linters和test-runners)是完全合理的。 (顺便说一下,这完全符合Peter Lyons几年前提供的答案 - 当时可能已经'明确地与node.js常见做法不同',但它今天被广泛接受:))

至于我的第二个问题

  

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

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

请注意,2016年11月12日

原始问题所关联的相关npm文档已移至here