Using constants in gruntjs

社会主义新天地 提交于 2019-12-11 04:19:29

问题


I am trying to write my first Grunt task to copy some files from my common libs folder, which is out of my project directory.

  • Project Folder : /home/user/projects/bottle
  • Common Libs directory : /home/user/projects/common
  • Files' source are inside Common Libs directory at : lib/general/static/js/
  • Files' destination inside project folder : lib

I have a properties.json file with Common Libs directory path as shown below

{
    "common_libs" : `/home/user/projects/common`
}

Now what I already tried is :

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');
};

I am running grunt as follows grunt copy

With this no files are copied to the destination.

Help me in this.

Also I want to know

  1. How can I use Ant's property tag type constants in GruntJS? Because I am getting the base folder from properties.json and I need to copy many files from different folders under the base folder.
  2. Can we have these type of constants per task?

Thanks in advance.


回答1:


There are a few issues with your code. First:

common_libs_js : this.common_libs + "lib/general/static/js/"

Unfortunately this.common_libs is undefined (this doesn't point to where you think it does), so common_libs_js ends up being 'undefinedlib/general/static/js/', which doesn't work.

The second problem is that on that same line you are concatenating paths, but the first path (from the properties file) doesn't seem to end with a slash, and would become '/home/user/projects/commonlib/general/static/js/' if it wasn't for the previous issue.

Third, you'd get a whole bunch of folders inside your dest path. When the expand option is used, Grunt uses the paths as given in the src property to create the folder structure. If you want /home/user/projects/common/lib/general/static/js/foo.js to be copied to lib/foo.js, you should set the cwd option to paths.common_libs_js and the src to '*.js' (or '**/*.js' for a match on any level).

People usually embed configuration properties inside Grunt's config, and then use template strings to access them. A very common way to write your task would be something like this (with a few changes, adjust as needed):

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');
};

Alternatively, if you want your files to end up in 'lib/general/static/js/' in the destination path too:

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');
};

If you're not sure how Grunt sees your files, run it with grunt -v and it will tell you.

You might also want to consider git submodules for a non-Grunt solution.

For task-specific constants: you could use the task's (or target's) options hash for that, and access it with template strings:

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');
};

This is rarely done for anything other than actual options, though. Conflicts with real options can occur. You could also use the target namespace directly, setting the property directly inside main. But again, there are a few property names that may conflict.

If you want to override properties (e.g. for a release build), you can do this:

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');
};

Then you'd call your task with grunt release copy.

EDIT

Based on your updated question, it doesn't seem like the properties.json file is of much use to you. Why not just specify the properties in your 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');
};

You can also use the file together with this, if you want. Or even put these properties (with the template strings) inside the properties.json file. In the end it's just a matter of making Grunt see an object with template strings. It's up to you to provide that somehow.



来源:https://stackoverflow.com/questions/16791113/using-constants-in-gruntjs

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!