如何防止grunt-nodemon重新启动所有应用

时间:2016-05-20 21:36:53

标签: node.js gruntjs nodemon grunt-concurrent grunt-nodemon

我在Windows 10上运行节点。我有三个节点应用程序,我希望能够通过一个方便的grunt命令启动它们。此外,如果我修改任何应用程序,我希望节点自动重启。

我正在使用grunt-nodemongrunt-concurrent的组合。节点处理所有启动都很好。

问题是如果我修改与其中任何一个相关的代码,他们所有重新启动,这需要很长时间。我怎样才能使nodemon只重新启动我实际修改过代码的应用程序?

var loadGruntTasks = require('load-grunt-tasks')

module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),

        concurrent: {
            runAll: {
                tasks: ['nodemon:app1', 'nodemon:app2', 'nodemon:app3'],
                options: {
                    logConcurrentOutput: true
                }
            }
        },

        nodemon: {
            app1: {
                script: './app1/app.js'
            },

            app2: {
                script: './app2/app.js'
            },

            app3: {
                script: './app3/app.js'
            }
        }
    })

    loadGruntTasks(grunt)
    grunt.registerTask('default', ['concurrent:runAll'])
}

更新

如果我使用grunt-watch代替grunt-nodemon,则只会修改我修改过的代码的应用。问题是grunt-watch只知道运行node app.js,因为应用程序已在运行,因此会出错。有没有办法让grunt-watch终止节点进程并重新启动它?

2 个答案:

答案 0 :(得分:1)

我认为答案可能相当简单。 Nodemon有一个忽略选项。对于您的三个应用程序nodemon grunt配置中的每一个,您可以配置它们以忽略其他应用程序的目录。这样他们只会在他们自己的文件被更改而不是其他项目的文件时启动他们的重启。让我知道这是怎么回事。 :)关于设置config的ignore部分的细节可以在nodemons文档和grunt-nodemons文档中找到。

答案 1 :(得分:1)

Patrick Motard的回答让我想到了nodemon运行的目录以及它是如何观察文件的变化的。看来,因为我在所有节点应用程序的父目录中开始咕噜声,每个nodemon进程正在寻找所有这些目录中的更改。因此,我使用nodemon设置将options.cwd进程的工作目录设置为每个应用程序的相应目录。这似乎解决了这个问题。这是工作解决方案:

module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),

        concurrent: {
            runAll: {
                tasks: ['nodemon:app1', 'nodemon:app2', 'nodemon:app3'],
                options: {
                    logConcurrentOutput: true
                }
            }
        },

        nodemon: {
            app1: {
                script: 'app.js',
                options: {
                    cwd: './app1'
                }
            },

            app2: {
                script: 'app.js',
                options: {
                    cwd: './app2'
                }
            },

            app3: {
                script: 'app.js',
                options: {
                    cwd: './app3'
                }
            }
        }
    })

    loadGruntTasks(grunt)
    grunt.registerTask('default', ['concurrent:runAll'])
}