我正在尝试编写我的第一个Grunt任务,从我的公共libs文件夹中复制一些文件,这些文件位于我的项目目录之外。
/home/user/projects/bottle
/home/user/projects/common
lib/general/static/js/
lib
我有一个带有Common Libs目录路径的properties.json
文件,如下所示
{
"common_libs" : `/home/user/projects/common`
}
现在我已经尝试过了:
module.exports = function(grunt) {
var properties = grunt.file.readJSON('properties.json'),
paths = {
common_libs : properties.common_libs,
common_libs_js : this.common_libs + "lib/general/static/js/"
};
grunt.initConfig({
copy: {
main: {
files: [
{
expand: true,
flatten : true,
src: [
paths.common_libs_js + "/*"
],
dest: 'lib/',
filter: 'isFile'
}
]
}
}
});
grunt.loadNpmTasks('grunt-contrib-copy');
};
我正在按照以下方式运行咕噜声
grunt copy
这样就没有文件被复制到目的地。
帮助我。
我也想知道
提前致谢。
答案 0 :(得分:8)
您的代码存在一些问题。第一:
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路径中获得一大堆文件夹。使用expand选项时,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如何查看您的文件,请使用grunt -v
运行它,它会告诉您。
您可能还想考虑非Grunt解决方案的git子模块。
对于特定于任务的常量:您可以使用任务的(或目标)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');
};
然后,您将使用grunt release 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看到一个带有模板字符串的对象。这取决于你以某种方式提供。