观察,重新编译并重新启动

我一直在寻找一种使用Grunt的手表模块来执行文件更改时执行几个步骤的方法的示例。 我还没有find这方面的一个很好的例子,所以如果有人能指出我会朝着正确的方向发展。

  1. build立TypeScript项目(我有这个工作)
  2. 监视文件更改的目录(这也适用)
  3. 开始在节点进程中运行编译的JavaScript,同时还在监视文件的变化(通过Grunt来完成这个工作的最好方法是什么?手表模块好像启动了重新编译的任务)
  4. 在文件更改时,停止其他正在运行的进程,重新编译,并在完成时重新启动。 继续关注变化(不知道这个 – 重启是棘手的部分!)

我已经尝试了一些不同的方法,比如用Grunt启动一个subprocess,但是我总是以悬挂进程,locking端口,误导STDIO或其他问题结束。 如果Grunt进程退出,我希望subprocess被杀死。

有没有一个好办法来处理这个问题? 谢谢!

开始在节点进程中运行编译的JavaScript,同时还在监视文件的变化(通过Grunt来完成这个工作的最好方法是什么?手表模块好像启动了重新编译的任务)

使用类似Nodemon的东西: https ://www.npmjs.com/package/nodemon也有它的grunt / gulp包。

在文件更改时,停止其他正在运行的进程,重新编译,并在完成时重新启动

Nodemon将停止对js的更改并重新启动应用程序。

这是我的解决scheme。 我有一个nodemon src文件夹,每当看到更改时触发一个构build周期+节点调用。 它被称为使用yarn run dev:src 。 这是一个非常简单的解决scheme:

package.json

 "scripts": { ... "build:dev": "yarn run clean && yarn run compile:dev", "clean": "rimraf dist", "compile": "babel src -d dist && yarn run copy:static", "compile:dev": "babel src -d dist -s && yarn run copy:static", "copy:static": "cp -R src/static dist/static", "dev:dist": "yarn run build:dev && node --inspect dist/server.js", "dev:src": "yarn run build:dev && nodemon --watch src --exec yarn run dev:dist", } 

注意:如果你喜欢在纱线上使用npm,你可以将两者完全交换。 我build议你考虑纱线;)

我最终不得不用自己的subprocess推出自己的产品。 Nodemon将阻止监视发生,并且不够灵活来处理重新编译步骤。

这是我的Gruntfile,使用watch,copy,clean和TypeScript模块。

 var loader = require('load-grunt-tasks'); var cp = require('child_process'); module.exports = function (grunt) { loader(grunt, {}); grunt.initConfig({ tsFiles: [ "**/*.ts", "!typings/**/*.ts", "typings/tsd.d.ts", "!build/**/*.ts", "!bower_modules/**/*.ts", "!node_modules/**/*.ts", ], buildDir: 'build/', clean: { build: '<%= buildDir %>' }, ts: { build: { src: [ "**/*.ts", "!typings/**/*.ts", "typings/tsd.d.ts", "!build/**/*.ts", "!bower_modules/**/*.ts", "!node_modules/**/*.ts", ], outDir: '<%= buildDir %>', options: { "target": 'ES5', "module": 'commonjs', "sourceMap": true, } } }, copy: { build: { expand: true, cwd: './', src: [ '*.json', 'config/**/*.json', 'test/**/*.js' ], dest: '<%= buildDir %>/', filter: 'isFile' } }, watch: { run: { files: [ '**/*.ts', '**/*.js', '**/*.json', '!.*/**/*.*', '!build/**/*.*', '!node_modules/**/*.*', '!logs/**/*.*' ], tasks: ['server-stop', 'build', 'server-restart'], options: { spawn: false } } } }); var child = null; function killChild(){ if (child){ child.kill(); child.disconnect(); child = null; } } grunt.registerTask('server-stop', 'Stop the dev server', function(){ killChild(); }); grunt.registerTask('server-restart', 'Stop the dev server', function(){ killChild(); child = cp.fork('./build/app.js'); }); grunt.registerTask('build', ['copy', 'ts']); grunt.registerTask('rebuild', ['clean', 'build']); grunt.registerTask('default', ['rebuild']); grunt.registerTask('run', ['default', 'server-restart', 'watch']); };