为了保持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任务定义中。
答案 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 {};
}
}
}
显然,您需要将其更改为您想要的情况,因为现在不知道您如何处理供应商和/或发布。