关于javascript:从gulp任务运行npm脚本

Run a npm script from gulp task

如何从gulp任务中运行npm脚本命令?

package.json

1
2
3
4
"scripts":
{
   "tsc":"tsc -w"
}

gulpfile.js

1
2
3
4
5
6
gulp.task('compile:app', function(){
  return gulp.src('src/**/*.ts')
    .pipe(/*npm run tsc*/)
    .pipe(gulp.dest('./dist'))
    .pipe(connect.reload());
});

我想这样做是因为运行npm run tsc不会给我任何错误,但是如果我使用gulp-typescript来编译.ts,那么我会得到很多错误。


您可以使用gulp-typescript获得等效的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var gulp = require('gulp');
var ts = require('gulp-typescript');

gulp.task('default', function () {
  var tsProject = ts.createProject('tsconfig.json');

  var result = tsProject.src().pipe(ts(tsProject));

  return result.js.pipe(gulp.dest('release'));
});

gulp.task('watch', ['default'], function() {
  gulp.watch('src/*.ts', ['default']);
});

然后在您的package.json

1
2
3
4
"scripts": {
 "gulp":"gulp",
 "gulp-watch":"gulp watch"
}

然后跑

1
npm run gulp-watch

或者使用外壳

1
2
3
4
5
6
7
8
9
var gulp = require('gulp');
var shell = require('gulp-shell');

gulp.task('default', function () {
  return gulp.src('src/**/*.ts')
    .pipe(shell('npm run tsc'))
    .pipe(gulp.dest('./dist'))
    .pipe(connect.reload());
});

gulp-shell已被列入黑名单,您可以在这里查看原因

另一种选择是设置webpack


您可以尝试使用childprecess节点程序包来实现它,或者

使用https://www.npmjs.com/package/gulp-run

1
2
3
4
5
6
7
8
var run = require('gulp-run');
gulp.task('compile:app', function(){
  return gulp.src(['src/**/*.js','src/**/*.map'])
    .pipe(run('npm run tsc'))
    .pipe(gulp.dest('./dist'))
    .pipe(connect.reload());

});


在这个简单的事情上浪费了大约1个小时,寻找?完整的答案,因此在此处添加另一个:

如果您仅在打字稿(tsc)上提问,请参阅https://stackoverflow.com/a/36633318/984471
否则,请参见下面的通用答案。

问题标题是通用的,因此下面首先给出通用的示例,然后给出答案。

通用示例:

  • 如果没有的话,请从这里安装nodejs(最好是LTS版本):https://nodejs.org/

  • 在下面安装:

    npm install --save-dev gulp
    npm install --save-dev gulp-run

  • 文件package.json具有以下内容(其他内容也可以存在):

  • {
    "name":"myproject",
    "scripts": {
    "cmd1":"echo \"yay! cmd1 command is run.\" && exit 1",
    }
    }

  • 创建具有以下内容的文件gulpfile.js
  • `

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var gulp = require('gulp');
    var run = require('gulp-run');

    gulp.task('mywatchtask1', function () {

      // watch for javascript file (*.js) changes, in current directory (./)
      gulp.watch('./*.js', function () {

        // run an npm command called `test`, when above js file changes
        return run('npm run cmd1').exec();

        // uncomment below, and comment above, if you have problems
        // return run('echo Hello World').exec();
      });
    });

    `

  • 使用gulp运行任务mywatchtask1

    gulp mywatchtask1

  • 现在,gulp正在监视当前目录中的js文件更改
    如果发生任何更改,那么将运行npm命令cmd1,每次js文件发生更改时,它将打印yay! cmd1 command is run.

    对于这个问题:另一个例子:

    a)package.json将具有

    1
    "tsc":"tsc -w",

    而不是以下内容:

    1
    "cmd1":"echo "yay! cmd1 command is run." && exit 1",

    b)和gulpfile.js将具有:

    1
    return run('npm run tsc').exec();

    而不是下面:

    1
    return run('npm run cmd1').exec();

    希望能有所帮助。