1

我在 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杀死节点进程并重新启动它?

4

2 回答 2

1

Patrick Motard 的回答让我想到了nodemon正在运行的目录以及它如何观察文件的更改。看来,自从我在所有节点应用程序的父目录中开始 grunt 以来,每个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'])
}
于 2016-05-21T14:32:35.083 回答
1

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

于 2016-05-21T00:14:11.840 回答