2015-06-19 49 views
2

我正在項目上運行一些grunt任務。其中一個設置一些grunt.options grunt.option(key, value),我需要在後續任務var option = grunt.option(key)中訪問。當我嘗試在後面的任務中訪問這些選項時,這些選項將返回undefined由前一任務設置的Grunt任務grunt.option返回undefined

如果我在後面的任務的頭部記錄變量,則在該任務運行之前顯示該變量,並且我無法訪問任務配置中以前設置的值。

在設置grunt.option和在另一個任務中使用它以通知變化的咕嚕聲之間,我需要做些什麼?我在這裏做了一些固有的錯誤嗎?還是有更好的方式與各種各樣的全局變量來做到這一點(我的研究指出我使用grunt.option)

我Gruntfile.js

grunt.log.writeln('loading tasks'); 
grunt.loadTasks('grunttasks'); 
grunt.log.writeln('tasks loaded'); 

grunt.registerTask(
    'jenkins',[ 
     'clean', //clears out any existing build folders 
     'curl', //gets build config file from remote server 
     'set-env', //sets the grunt.options based on the build config file 
     'string-replace:config', //attempts to access the new grunt.options 
     .... 
     .... 
     .... 
     .... 
    ] 
); 

在我的設置ENV任務,我根據curl任務中返回的文本文件的內容設置了一些環境變量。這工作正常,我可以在設置它們後立即記錄所有grunt.options,以便我知道它們被正確設置。

設置ENV任務

module.exports = function(grunt) { 

    grunt.registerTask('set-env', 'set-env', function() { 
     ...... 
     ...... 
     for (var i = 0; i < propFile.length; i++) { 
      if (propFile[i] !== '') { 
       ...... 
       ...... 
       keyValues[propName] = propValue; 
       grunt.option(propName, propValue); 
       console.log("FROM GRUNT.OPTION " + grunt.option(propName)); 
       ...... 
       ...... 
      } 
     } 
     ...... 
     ...... 
    }); 

}; 

當我嘗試從我訪問上述任務設置的grunt.options字符串替換(或任何其他後續)任務undefined返回。如果我在Gruntfile.js開始時設置的測試值這些grunt.options我可以沒有問題訪問它們:

module.exports = function(grunt) { 
    grunt.config('string-replace', { 
     .......... 
     .......... 
     config:{ 
      files: configFiles, 
      options: { 
       replacements: [ 
        .......... 
        .......... 
        { 
         pattern: /var _OPTION_KEY = \"(.*?)\"\;/ig, 
         replacement: 'var _OPTION_KEY = "'+grunt.option('_OPTION_KEY')+'";' //grunt.option('_OPTION_KEY') here is undefined 
        } 
        .......... 
        .......... 
       ] 
      } 
     } 
     .......... 
     .......... 
    }); 
    grunt.loadNpmTasks('grunt-string-replace'); 
} 

(我有雙人間,三人間和四人間檢查,我使用正確的選項鍵)

回答

1

問題在於,在設置set-env任務中的選項之前,您正在運行一次任務的「配置階段」期間訪問來自grunt選項集的變量。在代碼中當時評估自定義選項鍵的確應該產生undefined。 (請注意,這實際上相當於使用initConfig塊)

您所做的不是從選項對象中讀取選項值,而是使用grunt.config.set直接修改任務的配置對象,這將啓用你做你一直在嘗試的東西。

所以基本上,而不是

grunt.option(propName, propValue); 

使用類似

grunt.config.set('mytask.replacements', options.replacements); 

(當然,這需要你的代碼的一個相當大的改造,我不明白成。)


編輯:可能有使用咕嚕的模板功能的更好的解決方法,請參閱this stackoverflow answer,和咕嚕api docs on templating

模板字符串可以使用手動提供的模板功能進行處理。另外,config.get方法(由許多任務使用)自動擴展在Gruntfile中指定爲配置數據的樣式模板字符串。

問題的關鍵在於,只有當任務使用config.get讀取值時,纔會對配置塊進行分析時評估這些值。


您使用的選項的模式對象在任務間共享價值觀的作品更好,如果它是你的兩個自定義任務之間 - 你可以將其設置爲一個任務,在其他閱讀它,而不是在配置,但作爲運行任務的實際步驟。一般來說,儘管它看起來可行,但我認爲這不是grunt所想到的工作流程 - 如果您知道您正在運行哪個環境,可以通過options命令傳遞環境參數更容易直線標誌,當你運行一個咕嚕任務時,這將在你正在做的任何配置中生效。

+0

模板做到了。非常感謝! – Fraser