通过npm自动运行gulp任务

36

我通常通过npm来运行gulp,例如在我的package.json文件中

"scripts": {
    "test": "gulp test",
    "minify": "gulp minify"
}

那么我可以运行诸如以下命令:

npm run minify

好的,但每次我在gulpfile中添加新任务时,都需要将它们添加到package.json的scripts部分中,有没有更好的方法?

原因:我只在我的path上全局安装npm,以便所有其他模块不会污染我的path,所以我需要通过npm脚本来运行它们。


为什么你正在使用 npm run 而不是正常的方式?这些信息可以帮助了解你真正想要实现什么。 - Preview
我只在全局安装npm,因此npm在我的路径中,我不想让gulp污染我的路径,所以我通过npm运行gulp。 - Howard
为什么不直接运行Gulp呢? - Alex78191
2个回答

32
我有一个好消息告诉你:我已经为你制作了一个简单的npm模块来处理这个问题。 gulp-npm-script-sync 以下是其要点:
  var file = fs.readFileSync(config.path || 'package.json', 'utf-8');
  var pkg = JSON.parse(file);
  var tasks = gulp.tasks;

  pkg.scripts = pkg.scripts || {};

  Object.keys(tasks).forEach(function (t) {
    pkg.scripts[t] = 'gulp '+tasks[t].name;
  });

完整的源代码在这里,会做一些事情,例如使用相同的缩进和格式将package.json写回。

所以,可以执行以下命令:npm install --save-dev gulp-npm-script-sync

将以下内容放入您的gulpfile中:

var gulp = require('gulp');
var sync = require('gulp-npm-script-sync');

// your gulpfile contents

sync(gulp);

每次你用新的任务更新gulpfile时,它都会更新package.json。

甚至可以将其放在gulp任务中:

gulp.task('sync', function () {
  sync(gulp);
}

2
我认为Roman下面的答案更优雅,而且你可以省略一个开发依赖项。 - Jim Aho
我同意。例如,我经常使用 npm run webpack -- --watchnpm run webpack -- -d - Austin Pray

32
Brian Brennan提出了一个很棒的建议:将./node_modules/.bin添加到您的$PATH变量中。 然后,只要您在项目的顶级目录中,就可以运行本地安装的实用程序。

来源: 保持干净

无需全局安装软件包即可轻松调用它。 只需记住上述路径应该是前置的。


另外,自2.0.0版本以来,npm提供了向运行命令传递额外参数的功能。这些参数将简单地附加到您的脚本命令中。

在您的情况下,以下来自您的package.json的脚本:

"scripts": {
  "gulp": "gulp"
},

可以通过 npm run gulp -- testnpm run gulp -- minify 等方式调用。

对于那些在Windows下安装npm@2.0.0时遇到困难的人,这里有一个提示:从node.js文件夹(例如C:\Program Files (x86)\nodejs)执行npm update npm。这可能需要管理员权限。 - Roman Boiko
1
在清单文件中定义脚本的美妙之处在于您可以创建一个通用的API。npm run build可以触发gulp或grunt任务或其他任何内容。随着项目的发展,您可以更改实现方式。接口保持不变并将继续工作。在这种情况下,您也不需要向$PATH添加任何内容,因为您可以简单地执行以下操作:"scripts": { "build": "./node_modules/.bin/gulp build" } - Jasper Moelker
@Jasper 是的,额外的间接层可以提供好处。然而,通常没有必要替换构建系统,并且任何间接性都有成本。个人而言,当在项目中使用时,我更喜欢直接调用 gulp 接口,而不将其与其他任何东西组合或引入一个接口来隐藏另一个接口。对于 gruntnpm 也是如此。此外,我不喜欢我的答案中的第二个选项,它只是为了共享信息而包含在内。至于第一个选项,它使我能够以一种优雅而非常强大的方式避免全局安装软件包。 - Roman Boiko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接