如何读取目标中定义的grunt配置中的变量?

时间:2017-01-17 14:18:37

标签: javascript gruntjs

我尝试为具有根据不同域的目标的多任务registerMultiTask配置grunt。

以下是配置示例。

grunt.initConfig({
    log: {
        'domain_01': {
            hostName: 'www.domain1.com',
            options: {
                urls: [ 
                    '<%= hostName %>' + '/file1.js', 
                    '<%= hostName %>' + '/file2.js'
                ]
            }
        }
    }
});

grunt.registerMultiTask('log', function() {
    grunt.log.writeln('hostName = ' + this.data.hostName);
    grunt.log.writeln('urls = ' + this.data.options.urls);
});

所以,预期的结果应该是:

> grunt validation:domain_01
hostName = domain_01
urls = ['www.domain1.com/file1.js', 'www.domain1.com/file2.js']

我正在阅读目标hostName内定义的变量domain_01,以获取错误:

  

警告:处理模板时发生错误(hostName为   没有定义的)。使用--force继续。

     

因警告而中止。

我也试过了  ['<%= grunt.config("log.domain_02.hostName") %>' + '/file1.js', ...]

它有效,但它失败了使这个代码成为通用代码的目的,因为如果我想添加另一个目标,我将不得不在每一行更改模板字符串。 我怎样才能做到这一点?

注意:任务log只是一个示例任务,我将使用不同的插件,为此,我希望对其进行最少的更改,并且只在可能的情况下实现配置。

1 个答案:

答案 0 :(得分:2)

更新...

在提供我之前的回答时,我误解了你帖子中的几个关键要求。即这部分标题为:

  

...读取目标中定义的grunt配置中的变量?

这也是..

  

...因为如果我想添加另一个目标

,我将不得不更改每一行的模板字符串

解决方案三

这可以通过以下方式实现:

  1. 未尝试使用模板字符串作为每个目标的hostNameoptions.urls的前缀。
  2. 使用hostName函数中的相关grunt.registerMultiTask为每个网址添加前缀。
  3. 以下要点证明了这一点:

    module.exports = function(grunt) {
    
        'use strict';
    
        grunt.initConfig({
    
            log: {
                'domain_01': {
                    hostName: 'www.domain1.com',
                    options: {
                        urls: [
                            '/file1.js' //<-- Note: No reference to hostName
                        ]
                    }
                },
                'domain_02': {
                    hostName: 'www.domain2.com',
                    options: {
                        urls: [
                            '/file1.js',
                            '/file2.js'
                        ]
                    }
                },
                'domain_03': {
                    hostName: 'www.domain3.com',
                    options: {
                        urls: [
                            '/file1.js',
                            '/file2.js',
                            '/file3.js'
                        ]
                    }
                }
            }
        });
    
        grunt.registerMultiTask('log', function() {
            var hostName = this.data.hostName,
                urls = this.data.options.urls.map(function (url) {
                    return hostName + url;
                });
    
            grunt.log.writeln('hostName = ' + hostName);
            grunt.log.writeln('urls = ' + urls);
        });
    };
    

    <强>结果

    1. 通过CLI运行$ grunt log:domain_01返回:
    2. hostName = www.domain1.com
      urls = www.domain1.com/file1.js
      
      1. $ grunt log:domain_02返回:
      2. hostName = www.domain2.com
        urls = www.domain2.com/file1.js,www.domain2.com/file2.js
        
        1. $ grunt log:domain_03返回:
        2. hostName = www.domain3.com
          urls = www.domain3.com/file1.js,www.domain3.com/file2.js,www.domain3.com/file3.js
          

          以前的答案......

          您可以设置如下:

          解决方案一

          module.exports = function(grunt) {
          
              grunt.initConfig({
          
                  hostName: 'www.domain1.com', //<-- Define the default hostname
          
                  log: {
                      'domain_01': {
                          hostName: '<%= hostName %>',
                          options: {
                              urls: [
                                  '<%= hostName %>' + '/file1.js',
                                  '<%= hostName %>' + '/file2.js'
                              ]
                          }
                      }
                  }
              });
          
              grunt.registerMultiTask('log', function() {
                  grunt.log.writeln('hostName = ' + this.data.hostName);
                  grunt.log.writeln('urls = ' + this.data.options.urls);
              });
          };
          

          注意 添加hostName密钥加上默认值。

          解决方案二

          如果hostName值可能在将来发生变化,您可能还希望考虑使用grunt.option API,从而提供更通用的代码。例如:

          module.exports = function(grunt){

              grunt.initConfig({
          
                  // Notice this time we also accept an optional value and a default.
                  hostName: grunt.option('hostName') || 'www.domain1.com',
          
                  log: {
                      'domain_01': {
                          hostName: '<%= hostName %>',
                          options: {
                              urls: [
                                  '<%= hostName %>' + '/file1.js',
                                  '<%= hostName %>' + '/file2.js'
                              ]
                          }
                      }
                  }
              });
          
              grunt.registerMultiTask('log', function() {
                  grunt.log.writeln('hostName = ' + this.data.hostName);
                  grunt.log.writeln('urls = ' + this.data.options.urls);
              });
          };
          

          1 通过CLI运行解决方案2,如下所示:

          $ grunt log

          报告:

          hostName = www.domain1.com
          urls = www.domain1.com/file1.js,www.domain1.com/file2.js
          

          注意使用默认值,因为没有提供选项标记。

          2 同时通过CLI使用选项标志运行解决方案2,如下所示:

          $ grunt log --hostName=www.domain2.com

          ...报道:

          hostName = www.domain2.com
          urls = www.domain2.com/file1.js,www.domain2.com/file2.js
          

          注意报告选项标志值。