1

我正在尝试编写我的第一个 Grunt 任务以从我的 common libs 文件夹中复制一些文件,该文件夹不在我的项目目录中。

  • 项目文件夹:/home/user/projects/bottle
  • 公共库目录:/home/user/projects/common
  • 文件的源代码位于 Common Libs 目录中:lib/general/static/js/
  • 项目文件夹内的文件目的地:lib

我有一个properties.json带有 Common Libs 目录路径的文件,如下所示

{
    "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

有了这个,没有文件被复制到目的地。

在这方面帮助我。

我也想知道

  1. 如何在 GruntJS 中使用 Ant 的属性标签类型常量?因为我从 properties.json 获取基本文件夹,我需要从基本文件夹下的不同文件夹中复制许多文件。
  2. 我们可以为每个任务设置这些类型的常量吗?

提前致谢。

4

1 回答 1

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 路径中得到一大堆文件夹。当使用扩展选项时,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它会告诉您。

您可能还想考虑将 git 子模块用于非 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');
};

然后你会用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 看到一个带有模板字符串的对象。以某种方式提供它取决于您。

于 2013-05-28T12:52:04.503 回答