【问题标题】:Using Grunt to set environment based variables使用 Grunt 设置基于环境的变量
【发布时间】:2013-08-30 21:06:37
【问题描述】:

我正在寻找 grunt-string-replace 来完成将文件中的变量更改为特定于环境的变量。但是,当我尝试运行下面的 grunt 脚本时,会收到以下警告:“Task min:dev not found”。但在这段代码中,我已经定义了:

module.exports = function (grunt) {
    // Project configuration.
    grunt.initConfig({
        min: {
            dev: {
                "string-replace": {
                    dist: {
                        files: {
                            "/newrelic.js": "/newrelic.js"
                        },
                        options: {
                            replacements: [
                                {
                                    pattern: /$APPNAME/ig,
                                    replacement: "services"
                                },
                                {
                                    pattern: /$ENV/ig,
                                    replacement: "nonprod"
                                }
                            ]
                        }
                    }
                }
            },
            prod: {
                pkg: grunt.file.readJSON('package.json'),
                uglify: {
                    options: {
                        banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
                    },
                    build: {
                        src: 'src/<%= pkg.name %>.js',
                        dest: 'build/<%= pkg.name %>.min.js'
                    }
                }
            }
        }
    });

// Load the plugin that provides the "uglify" task.
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-string-replace');

// Default task(s).
    grunt.registerTask('default', ['min:dev']);
    grunt.registerTask('prod', ['min:prod']);

};

我错过了什么吗?

【问题讨论】:

    标签: gruntjs


    【解决方案1】:

    认为您尝试这样做,此片段会将环境变量 SOME_ENV 放入 grunt 配置中,替换只是为您提供了一种简单的方法来在文件中使用 ${SOME_ENV} 占位符进行替换

    module.exports = function(grunt) {
        // Project configuration.
        grunt.initConfig({
            pkg : grunt.file.readJSON('package.json'),
            SOME_ENV: process.env.SOME_ENV,
            copy: {
                files: [
                    {expand: true, cwd: "src/", src: ["*.*", "**/*.*"], dest: "./build",}
                ],
                options: {
                // Replace ${MEH} in files with grunt.config.get("MEH"),
                // eg ${SOME_ENV} 
                // == grunt.config.get("SOME_ENV")
                // == process.env.SOME_ENV == systems SOME_ENV environment var
                    process: function (content, srcpath) {
                        return content.replace(
                            /\$\{([a-zA-Z.]+)\}/g,
                            function replacer(match, p1, offset, string){
                                var value = grunt.config.get(p1);
                                grunt.log.write("  in file '" + srcpath + "'\n    replacing '" + match + "'\n    with '" + value + "'\n"); 
                                return value;
                            });
                        }
                },
            }
        });
    
        // Production Build Tools
        grunt.loadNpmTasks('grunt-contrib-copy');
    
        // Default Production Build task(s).
        grunt.registerTask('default', ['copy']);
    };
    

    【讨论】:

      【解决方案2】:

      你读过说明书吗? getting started guide 声明任务期望它们的配置在同名属性中指定。您没有定义“最小”任务,因此它出错了。

      配置对象的顶级键需要匹配任务名称,然后在任务配置中定义“目标”(例如,“开发”或“产品”)。

      所以,这是您重新设计的 Gruntfile。我没有对此进行测试,所以我不能保证它会起作用,但它肯定会引导你朝着正确的方向前进:

      module.exports = function (grunt) {
      
          // Project configuration.
          grunt.initConfig({
              pkg: grunt.file.readJSON('package.json'),
              "string-replace": {                 
                  dev: {
                      files: {
                          "/newrelic.js": "/newrelic.js"
                      },
                      options: {
                          replacements: [{
                              pattern: /$APPNAME/ig,
                              replacement: "services"
                          }, {
                              pattern: /$ENV/ig,
                              replacement: "nonprod"
                          }]
                      }
                  }
              },
              uglify: {
                  prod: {
                      options: {
                          banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
                      },
                      build: {
                          src: 'src/<%= pkg.name %>.js',
                          dest: 'build/<%= pkg.name %>.min.js'
                      }
                  }
              }
          });
      
          // Load the plugin that provides the "uglify" task.
          grunt.loadNpmTasks('grunt-contrib-uglify');
          grunt.loadNpmTasks('grunt-string-replace');
      
          // Default task(s).
          grunt.registerTask('default', ['string-replace:dev']);
          grunt.registerTask('prod', ['uglify:prod']);
      };
      

      【讨论】:

      • 是的,我做到了,但我也查看了这个更具体的用例:stackoverflow.com/questions/13800205/…。那是如何运作并获得 15 次投票的?
      • 该线程中的作者提到他们正在使用最小任务。您没有使用最小任务。
      猜你喜欢
      • 2018-01-04
      • 2017-12-25
      • 2016-06-26
      • 2014-07-15
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2017-05-21
      • 2013-03-04
      相关资源
      最近更新 更多