jetty サーバーで grunt-yslow テストを実行しようとしています。yslow タスクを実行する必要がある間にタスクがありますserver_start
。server_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で起動および停止する方法のより広いものの特定のケースだと思います。