2013-08-21 9 views
7

私はgruntを使ってモカランテストのスイートを管理しています。モカテストスイートに必要なことの1つは、テストを実行している開発者の環境に基づいてテストが適切に実行されるように、特定の環境変数を設定することです。これらの環境変数の1つは開発者のマシンごとに異なる値を持つので、設定している環境変数にその値を返すbashスクリプトを実行します。gruntfileでシェルスクリプトを実行し、結果を変数に代入する

私はgrunt.util.spawnを使用してスクリプトを実行し、その結果を自分のgruntfileで定義された変数に割り当て、grunt-envでその値で環境変数を設定します。以下は、(CoffeeScriptの中に)私のgruntfileの例である:

module.exports = (grunt) -> 
    envvar = '' 

    grunt.initConfig 
    pkg: grunt.file.readJSON('package.json') 

    env: 
     dev: 
     ENV_VAR: envvar 

    simplemocha: 
     options: 
     timeout: 30000 
     reporter: 'spec' 
     compilers: 'coffee:coffee-script' 
     all: 
     src: ['Tests/**/*.coffee'] 

    grunt.registerTask 'init', -> 
    done = this.async 
    command = 
     cmd: './bin/get_envvar.sh' 
    grunt.util.spawn command, (error, result, code) -> 
     envvar = result 
     console.log 'envvar: ' + envvar 
     done 

    grunt.registerTask 'test', ['init', 'env', 'simplemocha'] 

これを実行するには、私は

/path/to/grunt test 

残念ながら、初期化実行されますが、コールバックが、その中に取得していないようです...呼び出しenvvarは決して設定されません。奇妙なことに、テストでロギングを無効にすると、コールバックが呼び出されますが、envとsimplemochaタスクが開始された後にのみ呼び出されます。わずらわしいタスクの私の理解は、彼らがブロックされているので、私は次のタスクに移動する前にinitタスクが完了する必要が期待(その中に非同期関数で)する必要があります。

アイデア?

答えて

10

上記の方法がうまくいかない理由はまだわかりませんが、ちょっとした研究の後に私はshelljsを見つけました。問題を解決するために使用できました。

module.exports = (grunt) -> 
    shell = require 'shelljs' 
    envvar = shell.exec('./bin/get_envvar.sh', {'silent':true}).output 

    grunt.initConfig 
    pkg: grunt.file.readJSON('package.json') 

    env: 
     dev: 
     ENV_VAR: envvar 

    simplemocha: 
     options: 
     timeout: 30000 
     reporter: 'spec' 
     compilers: 'coffee:coffee-script' 
     all: 
     src: ['Tests/**/*.coffee'] 

    grunt.registerTask 'test', ['env', 'simplemocha'] 

ロットクリーナー、あまりにも:shelljsが同期シェルコマンドをexecしことができますので、私は本当にブロックに物事をしたいとき、私はコールバックで動作する必要はありません!

参考文献:

+2

ダウン票の理由は何ですか?私の質問と答えを良くするためにできることがあれば、私は大好きです! – Clandestine

関連する問題