Grunt ngconstant:从多个可交换文件生成
Grunt ngconstant: generation from multiple exchangeable files
在以 Yeoman
开始的 angular 项目中,我们有 json 文件(dev、test、dist...),其中包含每个环境工作所需的常量,以便g运行t 服务任务定义如下:
grunt.registerTask('serve', function(environment) {
grunt.task.run([
...
'ngconstant:'+environment,
...
]);
});
然后在 ngconstant 中我们有:
ngconstant: {
options: {
name: 'environment',
dest: ...
},
dev: {
constants: {
'ENV': grunt.file.readJSON('environments/dev.json')
}
},
test: {
constants: {
'ENV': grunt.file.readJSON('environments/test.json')
}
},
...
}
}
这样就可以 运行 和 grunt serve:dev
, grunt serve:test
...
现在我们还需要根据第二个标准(我们称它为用户目标)修改应用程序的某些方面,使其可以像 grunt serve:dev:target1
、grunt serve:test:target2
那样构建。 ..
这可以用 ngconstant 完成吗?到目前为止,我唯一类似的想法是定义目标,如 dev-target1
、dev-target2
、test-target1
... 其中每个设置 ENV
到一个文件和 TARGET
到另一个,但这不是可扩展的(我们只处理两个目标,但我们希望很快会有更多目标)而且非常丑陋。
好的,找到方法了。 Gruntfile 中的 ngconstant:
ngconstant: {
dev: {
options: {
name: 'environment',
dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
},
constants: {
'ENV': grunt.file.readJSON('environments/dev.json')
}
},
test: {
options: {
name: 'environment',
dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
},
constants: {
'ENV': grunt.file.readJSON('environments/test.json')
}
},
prod: {
options: {
name: 'environment',
dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
},
constants: {
'ENV': grunt.file.readJSON('environments/prod.json')
}
},
local: {
options: {
name: 'environment',
dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
},
constants: {
'ENV': grunt.file.readJSON('environments/local.json')
}
},
superior: {
options: {
name: 'target',
dest: '<%= yeoman.app %>/js/modules/target/config/target.js'
},
constants: {
'TGT': grunt.file.readJSON('targets/superior.json')
}
},
profesional: {
options: {
name: 'target',
dest: '<%= yeoman.app %>/js/modules/target/config/target.js'
},
constants: {
'TGT': grunt.file.readJSON('targets/profesional.json')
}
},
}
这很混乱,因为所有东西都捆绑在同一个模块中,但是 serve
任务定义如下:
grunt.registerTask('serve', function(environment, target) {
grunt.task.run([
...
'ngconstant:'+environment,
'ngconstant:'+target,
...
]);
});
并像 grunt serve:dev:superior
那样调用它会首先生成带有 "dev" ENV 常量的 environment/config/environment.js
文件,然后是带有 "superior" TGT 的 target/config/target.js
文件在各自文件中定义的常量。
我试过为两种类型设置相同的目标文件,但文件被覆盖,而不是附加常量或类似的东西。
在以 Yeoman
开始的 angular 项目中,我们有 json 文件(dev、test、dist...),其中包含每个环境工作所需的常量,以便g运行t 服务任务定义如下:
grunt.registerTask('serve', function(environment) {
grunt.task.run([
...
'ngconstant:'+environment,
...
]);
});
然后在 ngconstant 中我们有:
ngconstant: {
options: {
name: 'environment',
dest: ...
},
dev: {
constants: {
'ENV': grunt.file.readJSON('environments/dev.json')
}
},
test: {
constants: {
'ENV': grunt.file.readJSON('environments/test.json')
}
},
...
}
}
这样就可以 运行 和 grunt serve:dev
, grunt serve:test
...
现在我们还需要根据第二个标准(我们称它为用户目标)修改应用程序的某些方面,使其可以像 grunt serve:dev:target1
、grunt serve:test:target2
那样构建。 ..
这可以用 ngconstant 完成吗?到目前为止,我唯一类似的想法是定义目标,如 dev-target1
、dev-target2
、test-target1
... 其中每个设置 ENV
到一个文件和 TARGET
到另一个,但这不是可扩展的(我们只处理两个目标,但我们希望很快会有更多目标)而且非常丑陋。
好的,找到方法了。 Gruntfile 中的 ngconstant:
ngconstant: {
dev: {
options: {
name: 'environment',
dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
},
constants: {
'ENV': grunt.file.readJSON('environments/dev.json')
}
},
test: {
options: {
name: 'environment',
dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
},
constants: {
'ENV': grunt.file.readJSON('environments/test.json')
}
},
prod: {
options: {
name: 'environment',
dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
},
constants: {
'ENV': grunt.file.readJSON('environments/prod.json')
}
},
local: {
options: {
name: 'environment',
dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
},
constants: {
'ENV': grunt.file.readJSON('environments/local.json')
}
},
superior: {
options: {
name: 'target',
dest: '<%= yeoman.app %>/js/modules/target/config/target.js'
},
constants: {
'TGT': grunt.file.readJSON('targets/superior.json')
}
},
profesional: {
options: {
name: 'target',
dest: '<%= yeoman.app %>/js/modules/target/config/target.js'
},
constants: {
'TGT': grunt.file.readJSON('targets/profesional.json')
}
},
}
这很混乱,因为所有东西都捆绑在同一个模块中,但是 serve
任务定义如下:
grunt.registerTask('serve', function(environment, target) {
grunt.task.run([
...
'ngconstant:'+environment,
'ngconstant:'+target,
...
]);
});
并像 grunt serve:dev:superior
那样调用它会首先生成带有 "dev" ENV 常量的 environment/config/environment.js
文件,然后是带有 "superior" TGT 的 target/config/target.js
文件在各自文件中定义的常量。
我试过为两种类型设置相同的目标文件,但文件被覆盖,而不是附加常量或类似的东西。