2013-08-21 39 views
7

Tôi đang sử dụng grunt để quản lý một bộ kiểm tra chạy mocha. Một trong những điều cần thiết trong bộ kiểm thử mocha là các biến môi trường nhất định được thiết lập sao cho các kiểm thử được thực hiện đúng dựa trên môi trường của nhà phát triển đang chạy thử nghiệm. Một trong các biến môi trường này sẽ có giá trị khác nhau trên mỗi máy của nhà phát triển, vì vậy chúng tôi thực thi một tập lệnh bash để trả về giá trị đó cho biến môi trường mà chúng ta đang thiết lập.Thực thi tập lệnh shell trong gruntfile và gán kết quả cho biến

Tôi đang sử dụng grunt.util.spawn để chạy tập lệnh và gán kết quả của nó cho một biến được xác định trong gruntfile của tôi, sau đó grunt-env để đặt biến môi trường với giá trị đó. Dưới đây là một ví dụ về gruntfile của tôi (trong coffeescript):

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'] 

Để thực hiện điều này, tôi gọi ...

/path/to/grunt test 

Thật không may, mặc dù chạy init, gọi lại ở đó dường như không có được thực hiện, do đó, envvar không bao giờ được thiết lập. Oddly, nếu tôi vô hiệu hóa đăng nhập trong các bài kiểm tra của tôi, gọi lại DOES được gọi, nhưng chỉ sau khi các nhiệm vụ env và simplemocha của tôi đã được khởi động. Sự hiểu biết của tôi về nhiệm vụ grunt là họ đang chặn, vì vậy tôi mong đợi nhiệm vụ init phải hoàn thành (ngay cả với chức năng async trong đó) trước khi chuyển sang nhiệm vụ tiếp theo.

Bất kỳ ý tưởng nào?

Trả lời

10

Mặc dù tôi vẫn chưa rõ lý do tại sao phương pháp trên không hoạt động và hoan nghênh mọi phản hồi, sau một chút nghiên cứu, tôi đã tìm thấy shelljs, mà tôi có thể sử dụng để giải quyết vấn đề của mình. Vì shellj có thể thực thi lệnh shell đồng bộ, tôi không phải làm việc với các cuộc gọi lại khi tôi thực sự muốn mọi thứ chặn:

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'] 

.

Tài liệu tham khảo:

+2

lý do số phiếu xuống là gì? Nếu có điều gì đó tôi có thể làm để làm cho câu hỏi và câu trả lời của tôi tốt hơn, tôi rất muốn! – Clandestine

Các vấn đề liên quan