package.json用于全局依赖

时间:2014-05-13 05:25:30

标签: node.js npm

在编写node.js应用程序时,几乎总是你不仅需要处理本地依赖项,还需要处理应用程序所需的全局程序包。处理这个问题的最佳和最常见的方法是什么?我已经看到可以在预安装阶段运行npm

"scripts": {
   "preinstall": "npm i -g grunt-cli"
}

虽然从npm脚本本身运行npm install很奇怪,但我想这样可行。

但是,如果需要安装多个软件包,则不是很方便。是否可以告诉npm从另一个文件中获取所有列出的包,即package.global.json并在全球范围内安装所有包?

再次,是否有某种约定?

2 个答案:

答案 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测试运行器。这也意味着你有一个非常好的地方让人们可以立即知道哪些命令对他们有用,并且它有助于整个社区的一致性。请注意,starttestnpm中的特殊名称,因此对于其他任意命令,您需要运行npm run-script <scriptname>

通常我会遵循以下模式:如果它对于构建和运行模块至关重要,则不需要全局模块,但如果需要,可以使用它们来支持增强的工作流。 这里最重要的是我会列出绝对关键的脚本。 可选使用全局模块没有任何问题。例如,您可能有大量的grunt命令,并且您无法列出package.json中的每个排列,这很好。对于您的计算机,您可以全局安装grunt-cli,以便运行Gruntfile公开的所有命令。

答案 1 :(得分:2)

强制全局安装并不是一个好主意。您可以在本地安装这些软件包。全局脚本将在node_modules/.bin文件夹中提供,在npm脚本中也会将此文件夹添加到路径中,因此可以npm run grunt