通过npm自动运行gulp任务

通过npm自动运行gulp任务

问题描述:

我通常通过npm运行gulp,例如,在我的package.json通过npm自动运行gulp任务

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

然后我可以运行命令如

npm run minify 

它是没问题的,但每次我在我的gulpfile新的任务时,我需要将它们添加到包脚本部分下的.json,有没有更好的方法来做到这一点?

原因:我唯一的全球安装NPM我path所以所有其它模块不会污染我的path,所以我需要通过npm脚本

+0

那么你为什么要使用'NPM run'而不是正常的方式?这个信息可以帮助你知道你真的想要实现什么 – 2014-11-23 00:07:43

+0

我只在全局安装npm,所以npm在我的路径中,我不想吞噬我的路径,所以我通过npm运行gulp。 – Howard 2014-11-23 08:32:25

运行它们有我请客你:我径自并让你成为一个简单的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; 
    }); 

full source做这样的东西写的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); 

每当你用一个新的任务,它会更新你的package.json更新gulpfile。

你甚至可以把它一饮而尽任务中:

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

很好,谢谢,这很有用 – Howard 2014-11-29 04:31:57

+2

我认为罗马下面的答案更加优雅,而且你可以少用一个开发依赖。 – 2017-10-24 12:59:36

+0

我同意。例如,我使用'npm run webpack - --watch'或'npm run webpack - -d'。 – 2018-01-23 02:32:55

布赖恩·布伦南给a fantastic suggestion:添加 ./node_modules/.bin$PATH变量。 然后,只要您位于 项目的顶层目录中,就可以在本地运行 已安装的实用程序。

来源:Keeping clean

无需全局安装软件包即可轻松调用它。请记住,上面的路径应该是前加


另外,由于2.0.0版本,npm提供了额外的参数传递给我们的运行命令的能力。这些参数将被简单地追加到脚本命令中。

在你的情况,从package.json下面的脚本:

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

可援引为npm run gulp -- test,或npm run gulp -- minify

+0

对于那些在Windows下努力安装'npm @ 2.0.0'的人提示:从node.js文件夹(例如'C:\ Program Files(x86)\ nodejs')执行'npm update npm'。这可能需要管理员权限。 – 2014-12-02 03:57:43

+1

在您的清单中定义脚本的美妙之处在于您创建了一个通用api。 'npm run build'可能会引发吞咽或咕噜声或其他任何事情。随着项目的发展,您可以更改实施。界面保持不变,并将继续工作。在这种情况下,您也不需要在$ PATH中添加任何内容,如下所示: '“scripts”:{“build”:“./node_modules/.bin/gulp build”}'。 – 2015-02-18 17:14:55

+0

@Jasper是的,额外的间接水平可以提供好处。但是,通常不需要替换构建系统,任何间接方法都会产生成本。就个人而言,我更喜欢在项目中使用'gulp'接口时直接调用它,而不将它与其他任何项结合或引入一个接口来隐藏另一个接口。 'grunt'和'npm'也是如此。另外,我不喜欢我的答案中的第二个选项,它仅包含共享信息。至于第一个选项,它允许我以一种优雅和非常强大的方式避免在全球范围内安装软件包。 – 2015-02-18 17:50:26