0

jetty サーバーで grunt-yslow テストを実行しようとしています。yslow タスクを実行する必要がある間にタスクがありますserver_startserver_stop

child_process.spawn()内部で使用しserver_start、次に使用して全体を実行する最初のアプローチ

grunt.task.run('server_start', 'yslow_test', 'server_stop');

端末がハングする

Running "server_start" task
Starting java server....
Running "yslow_test:your_target" (yslow_test) task
Command: phantomjs /.../node_modules/grunt-yslow-test/tasks/lib/yslow.js -i grade -f junit http://localhost:8080/cms/s/0/1251659c-efb2-11e2-ad61-002128161462.html

編集すると、これは、スタンドアロンのバイナリとしてではなく、npm を介して phantomjs をインストールすることにも部分的に関係していることが判明しましたが、バイナリを正しくインストールした後も、htlm ページの読み込みに失敗しました

サーバーデータイベントをリッスンし、サーバーの最後の起動出力が発行された後にのみySlowを実行するというより洗練されたアプローチを使用すると、奇妙な動作が発生します(以下のコメントを参照)。(簡潔にするためにすべての try/catch ブロックを削除しましたが、エラーはスローされません)

var server;

grunt.registerTask('runYslow', 'Initialise a test server to run tests against', function() {
    //If I don't include yslow_test here then no normal server startup output is generated. 
    //If I do include yslow_test then the startup output is emitted and then yslow behaviour is bizarrely influenced by which events I listen to on the spawned server process!
    grunt.task.run(['server_start', 'yslow_test']);

});

grunt.registerTask('server_start', 'Start the web server', function () {

    var javaParams = ['-jar', 'target/the.jar', 'server', 'config-local.yml'],
        count = 0;

        server = grunt.util.spawn({
            cmd: 'java',
            args: javaParams
        });

        server.stdout.setEncoding('utf8');

        // If I include this listener somewhere between 13 and 17 events are fired
        // but the contents of read() are always null
        server.stdout.on('readable', function() {  
            console.log(count++, server.stdout.read());
        });

        // If I include this listener 7 events are fired ONLY IF I run yslow_test in the 
        // runYslow task. otherwise absolutely nothing is output. When the events are
        // fired the content of data is the normal startup messages of the jetty server
        server.stdout.on('data', function(chunk) {
            console.log(chunk);
            if (chunk.indexOf('Started SocketConnector@0.0.0.0:8085') > -1) {
                // never run unless yslow_test is already called within runYslow
                grunt.task.run(['yslow_test']);
            }

        });
});

私の質問は、nodejs以外のサーバーをgruntで起動および停止する方法のより広いものの特定のケースだと思います。

4

1 に答える 1

1

これが私の最終的な解決策です

module.exports = function(grunt) {
    "use strict";

    grunt.registerTask('runYslow', 'Initialise a test server to run tests against', function() {
        try {
            //queue these tasks to happen one after the other
            grunt.task.run('server_start', 'yslow_test', 'server_stop');
        } catch (err) {
            console.log('runYslow: err is', err);
        }
    });

    grunt.registerTask('server_start', 'Start the web server', function () {
        //this needs to not be hard coded - i.e. the version number needs to be got dynamically from somewhere
        var javaParams = ['-jar', 'target/my.jar', 'server', 'config-local.yml'],
            done = this.async(),
            server;
        try {
            grunt.log.write('Starting java server....');

            server = process.env.JETTY_SERVER || grunt.util.spawn({
                cmd: 'java',
                args: javaParams
            });

            server.stdout.setEncoding('utf8');

            server.stdout.on('data', function(chunk) {
                if (chunk.indexOf('the last thing your server logs to confirm startup was successful') > -1) {
                    done();
                }
            });

            process.env.JETTY_SERVER = server;

        } catch (err) {
            console.log('server_start: err is', err);
        }
    });

    grunt.registerTask('server_stop', 'Stop the web server', function () {
        try {
            grunt.log.write('Killing java server....');
            process.kill(process.env.JETTY_SERVER.pid, 'SIGINT');
            delete process.env.JETTY_SERVER;
            grunt.log.write('Killed java server.');
        } catch (err) {
            grunt.log.write('Error whilst killing java server');
        }
    });
};
于 2013-11-05T16:45:26.310 に答える