你的代码有几个问题。第一:
common_libs_js : this.common_libs + "lib/general/static/js/"
不幸的是this.common_libs
未定义(this
没有指向,你认为它),所以common_libs_js最终被'undefinedlib/general/static/js/'
,这是行不通的。
第二个问题是在同一行上连接路径,但第一个路径(来自属性文件)似乎不以斜线结尾,并且如果它不是以前的路径将变为'/home/user/projects/commonlib/general/static/js/'
问题。
第三,你会得到你的dest路径中的一大堆文件夹。当使用扩展选项时,Grunt使用src属性中给出的路径来创建文件夹结构。如果要将/home/user/projects/common/lib/general/static/js/foo.js
复制到lib/foo.js
,则应将cwd
选项设置为paths.common_libs_js
,并将src设置为'*.js'
(或'**/*.js'
以获得任何级别的匹配)。
人们通常在Grunt的配置中嵌入配置属性,然后使用模板字符串来访问它们。写出你的任务非常常见的方法是这样的(有一些变化,根据需要进行调整):
module.exports = function(grunt) {
grunt.initConfig({
properties: grunt.file.readJSON('properties.json'),
copy: {
main: {
expand: true,
cwd: '<%= properties.common_libs %>/lib/general/static/js',
src: '**/*.js',
dest: 'lib'
}
}
});
grunt.loadNpmTasks('grunt-contrib-copy');
};
另外,如果你希望你的文件“lib/general/static/js/
”的目标路径落得太:
module.exports = function(grunt) {
grunt.initConfig({
properties: grunt.file.readJSON('properties.json'),
copy: {
main: {
expand: true,
cwd: '<%= properties.common_libs %>',
src: 'lib/general/static/js/**/*.js',
dest: '.' // because src includes 'lib'
}
}
});
grunt.loadNpmTasks('grunt-contrib-copy');
};
如果你不知道咕噜如何看待您的文件,与grunt -v
运行它,它会告诉你。
您可能还想考虑GUN子模块的非Grunt解决方案。
有关特定任务的常量:您可以使用任务(或目标的)options
哈希值是什么,以及与模板串访问它:
module.exports = function(grunt) {
grunt.initConfig({
properties: grunt.file.readJSON('properties.json'),
copy: {
options: {
foo: 'lib'
},
main: {
options: {
bar: '**/*.js'
},
expand: true,
cwd: '<%= properties.common_libs %>/<%= copy.options.foo %>/general/static/js',
src: '<%= copy.options.main.bar %>',
dest: 'lib'
}
}
});
grunt.loadNpmTasks('grunt-contrib-copy');
};
这是很少超过实际选择其他任何事情,虽然。与真实选项冲突可能发生。您也可以直接使用目标命名空间,直接在main
内设置属性。但是,同样有几个属性名称可能会发生冲突。
如果你想覆盖的属性(例如,对于一个发布版本),你可以这样做:
module.exports = function(grunt) {
grunt.registerTask('release', function() {
grunt.config.set('properties.common_libs', '/usr/lib/shared');
});
grunt.initConfig({
properties: grunt.file.readJSON('properties.json'),
copy: {
main: {
expand: true,
cwd: '<%= properties.common_libs %>/lib/general/static/js',
src: '**/*.js',
dest: 'lib'
}
}
});
grunt.loadNpmTasks('grunt-contrib-copy');
};
然后,你打电话给你的任务与。
编辑
基于更新后的问题,它似乎并不像properties.json
文件要使用你的。为什么不直接在Gruntfile中指定属性?
module.exports = function(grunt) {
grunt.initConfig({
properties: {
base_dir: '../common',
base_js_dir: '<%= properties.base_dir %>/lib/general/static/js',
base_css_dir: '<%= properties.base_dir %>/lib/general/static/css'
},
copy: {
main: {
expand: true,
cwd: '<%= properties.base_js_dir %>',
src: '**/*.js',
dest: 'lib'
}
}
});
grunt.loadNpmTasks('grunt-contrib-copy');
};
如果需要,您也可以将此文件与此一起使用。甚至可以将这些属性(使用模板字符串)放入properties.json
文件中。最后,它只是让Grunt用模板字符串看到一个对象。以某种方式提供这个由你决定。
谢谢@ simo-kinnunen。感谢您的详细解释和纠正我。我在看的是,有什么我可以从'properties.common_libs'创建另一个简单变量,以便我不需要在'cwd'中指定一个长名称。我想'cwd'采取一个简单的常量,像'properties.common_libs_js'。因为我有许多其他文件需要从相同的'properties.common_libs_js'文件夹中复制。在Ant中,我们从现有的属性创建一个新的属性并使用该快捷方式。我正在寻找一个类似的。我们可以在GruntJS中实现吗? –
更清楚地更新了问题。 –
感谢Simo Kinnunen。 –