任务的grunt环境特定选项

时间:2016-08-10 14:18:28

标签: gruntjs grunt-contrib-uglify

为了保持gruntfile DRY,我想根据我正在运行grunt任务的环境更改选项。

因此,例如,如果我想使用两个grunt任务:

grunt.task.run('uglify:production');
grunt.task.run('uglify:development');

我希望他们都编译相同的文件,但是有不同的选项。

uglify: {

  production: {
    options: {
      compress: true
    }
  }

  development: {
    options: {
      compress: false,
      beautify: true
    }
  }

  // rather not redeclare these files twice
  files: {

    vendor: {
      // this name should change based on the environment
      'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js']
    },
    custom: {
      'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js']
    }

 }

如果生产甚至可以将目标名称改为custom-output.min.js,那将更加理想。

尝试了一个if-else语句,但是在没有飞行的grunt任务定义中。

2 个答案:

答案 0 :(得分:1)

由于grunt配置只是json,你可以使用grunt模板并将你的文件作为配置的属性。

uglifyFiles: {

  vendor: {
    // this name should change based on the environment
    'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js']
  },
  custom: {
    'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js']
  }
},
uglify: {

  production: {
    options: {
      compress: true
    },
    files: '<%= uglifyFiles %>'
  },

  development: {
    options: {
      compress: false,
      beautify: true
    },
    files: '<%= uglifyFiles %>'
  }
}

http://gruntjs.com/configuring-tasks#templates

抱歉,我不太明白这个问题

  

如果生产甚至可以有目的地名称   custom-output.min.js会更加理想。

你可以提供更多信息,或者上面是你想要实现的目标吗?

修改

似乎你正在尝试做的事情是将DRY的重复部分带出来,因为你实际上想要每个都有不同的代码。它可以完成,但不能在json中完成,你需要使用js并使用括号表示法来创建目标作为其键。我认为一种更为简单的方法,以及为此设置的grunt,将会做以下事情。

vendorUglifyFiles: ['src/vendor-input1.js', 'src/vendor-input2.js'],
customUglifyFiles: ['src/custominput1.js', 'src/custominput2.js'],
uglify: {

  production: {
    options: {
      compress: true
    },
    files: {
      vendor: {
        'dest/vendor.min.js': '<%= vendorUglifyFiles %>'
      },
      custom: {
        'dest/custom.min.js': '<%= customUglifyFiles %>'
      }
    }
  },

  development: {
    options: {
      compress: false,
      beautify: true
    },
    files: {
      vendor: {
        'dest/vendor.js': '<%= vendorUglifyFiles %>'
      },
      custom: {
        'dest/custom.js': '<%= customUglifyFiles %>'
      }
    }
  }
}

编辑:2016年8月11日,15:12

删除了抛出indexOf错误的级别:

vendorUglifyFiles: ['src/vendor-input1.js', 'src/vendor-input2.js'],
customUglifyFiles: ['src/custominput1.js', 'src/custominput2.js'],
uglify: {

  production: {
    options: {
      compress: true
    },
    files: {
      'dest/vendor.min.js': '<%= vendorUglifyFiles %>',
      'dest/custom.min.js': '<%= customUglifyFiles %>'
    }
  },

  development: {
    options: {
      compress: false,
      beautify: true
    },
    files: {
        'dest/vendor.js': '<%= vendorUglifyFiles %>',
        'dest/custom.js': '<%= customUglifyFiles %>'
    }
  }
}

这就是诀窍。

答案 1 :(得分:0)

Grunt是Javascript,所以你实际上可以添加IF / ELSE语句。

实施例:

files: {
    (() => { 
        if (grunt.option('vendor')) {
            return {
                'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js']
            }
        } else (grunt.option('release')) {
            return {
                'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js']
            }
        }
    }())
}

/***
 * OR SOMETHING LIKE
 **/

files: {
    (() => { 
        switch(grunt.option) {
            case 'vendor':
                return {
                    'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js']
                };
                break;
            case 'release:
                return {
                    'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js']
                };
                break;
            default:
                return {};
        }
    }
}

显然,您需要将其更改为您想要的情况,因为现在不知道您如何处理供应商和/或发布。