我正在构建一个带有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 (不显示网络活动)。
我的问题:
npm install
期间拍摄的全局模块的快照(副本)吗?答案 0 :(得分:7)
这是我对此的个人看法,这与node.js常见做法明显不同,但我相信这是一种整体优越的方法。我在自己的博文中有详细介绍(关于自我推销的免责声明,yada yada)Managing Per-Project Interpreters and the PATH。
它基本归结为:
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。