在编写node.js应用程序时,几乎总是你不仅需要处理本地依赖项,还需要处理应用程序所需的全局程序包。处理这个问题的最佳和最常见的方法是什么?我已经看到可以在预安装阶段运行npm
"scripts": {
"preinstall": "npm i -g grunt-cli"
}
虽然从npm脚本本身运行npm install很奇怪,但我想这样可行。
但是,如果需要安装多个软件包,则不是很方便。是否可以告诉npm
从另一个文件中获取所有列出的包,即package.global.json
并在全球范围内安装所有包?
再次,是否有某种约定?
答案 0 :(得分:4)
我认为要求构建过程的全局模块为code smell。它们工作正常,但它们与npm
作斗争,因为它们不能作为依赖项直接添加。相反,要使用包含bin
脚本的包来执行,我建议使用scripts
中的package.json
字段来提供一组命令。
例如:
"dependencies": {
"grunt-cli": "..."
},
"scripts": {
"start": "grunt server",
"test": "grunt test"
}
当您运行npm start
时,npm
会自动将grunt-cli
模块的位置添加到PATH
中,并执行grunt
命令以启动服务器,并且正在运行npm test
将调用grunt
测试运行器。这也意味着你有一个非常好的地方让人们可以立即知道哪些命令对他们有用,并且它有助于整个社区的一致性。请注意,start
和test
是npm
中的特殊名称,因此对于其他任意命令,您需要运行npm run-script <scriptname>
通常我会遵循以下模式:如果它对于构建和运行模块至关重要,则不需要全局模块,但如果需要,可以使用它们来支持增强的工作流。
这里最重要的是我会列出绝对关键的脚本。 可选使用全局模块没有任何问题。例如,您可能有大量的grunt命令,并且您无法列出package.json
中的每个排列,这很好。对于您的计算机,您可以全局安装grunt-cli
,以便运行Gruntfile
公开的所有命令。
答案 1 :(得分:2)
强制全局安装并不是一个好主意。您可以在本地安装这些软件包。全局脚本将在node_modules/.bin
文件夹中提供,在npm
脚本中也会将此文件夹添加到路径中,因此可以npm run grunt