我尝试为具有根据不同域的目标的多任务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
只是一个示例任务,我将使用不同的插件,为此,我希望对其进行最少的更改,并且只在可能的情况下实现配置。
答案 0 :(得分:2)
在提供我之前的回答时,我误解了你帖子中的几个关键要求。即这部分标题为:
...读取目标中定义的grunt配置中的变量?
这也是..
...因为如果我想添加另一个目标
,我将不得不更改每一行的模板字符串
这可以通过以下方式实现:
hostName
中options.urls
的前缀。hostName
函数中的相关grunt.registerMultiTask
为每个网址添加前缀。以下要点证明了这一点:
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);
});
};
<强>结果
$ grunt log:domain_01
返回:hostName = www.domain1.com
urls = www.domain1.com/file1.js
$ grunt log:domain_02
返回:hostName = www.domain2.com
urls = www.domain2.com/file1.js,www.domain2.com/file2.js
$ grunt log:domain_03
返回: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
注意报告选项标志值。