7

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

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

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

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

(取自这篇文章

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

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

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

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

(取自npm 文档

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


我的问题:

  • 全局安装模块的本地版本(在 devDependencies 中提到)是否只是全局模块的快照(副本),在 期间拍摄npm install
  • 2) 做这件事的正确方法是什么?还是我缺少其他一些练习?
4

2 回答 2

7

这是我个人对此的看法,这与 node.js 的常见做法明显不同,但我相信这是一种整体上更好的方法。在我自己的博客文章(关于自我推销的免责声明,yada yada)管理每个项目的解释器和 PATH中有详细说明。

它基本上归结为:

  1. 永远不要使用 npm -g。永远不要安装全局模块。
  2. projectDir/node_modules/.bin相反,调整您的 PATH 以包含
于 2013-06-20T17:40:40.417 回答
2

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

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

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

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

至于我的第二个问题

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

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


注意,2016 年 11 月 12 日

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

于 2016-06-19T18:32:06.413 回答