【问题标题】:Grunt conditional optionGrunt 条件选项
【发布时间】:2013-08-14 11:42:39
【问题描述】:

我正在尝试创建一个 Jade 任务,它的构建和开发任务具有非常相似的选项,除了开发布尔值和不同的目的地。我能够做到这一点的最简单方法是:

jade: {
    dev: {
        options: {
            data: {
                dev: true, // dev true
                config: ...,
                pkg: ...,
                helpers: ...
            }
        },
        files: [{
            dest: '<%= config.workingDir %>',
            ...
        }]
    },
    build: {
        options: {
            data: {  // no dev
                config: ...,
                pkg: ...,
                helpers: ...
            }
        },
        files: [{
            dest: '<%= config.buildDir %>',
            ...
        }]
    }
}

不过,这里有相当多的重复,特别是如果我想在轨道上添加更多选项。因此,我正在尝试创建一个可以从命令行和监视任务中工作的构建任务。

我得到的最接近的是这个设置,我可以从命令行运行grunt jade --dev,但不能在监视任务中设置开发布尔值。

build: {
    options: {
        data: {
            dev: '<%= grunt.option("dev") %>',
            config: ...,
            pkg: ...,
            helpers: ...
        }
    },
    files: [{
        dest: '<%= grunt.option("dev") ? config.workingDir : config.buildDir %>',
        ...
    }]
}

监视任务:

watch: {
    jade: {
        ...
        tasks: ['jade'] // the option is false
    }
}

我还尝试创建一个自定义任务来设置选项然后运行 ​​watch,在监听 watch 事件时我可以看到选项设置正确

grunt.registerTask('dev', 'Grunt dev mode', function(){
    grunt.option('dev', true);
    grunt.task.run('watch');
});

grunt.event.on('watch', function(action, filepath, target) {
    console.log(grunt.option('dev')); // true
});

即使日志将 dev 布尔值显示为 true,也传递了错误的任务选项。那么,综上所述,我是要以正确的方式设置选项,还是只是坚持执行重复相同信息的构建和开发任务?

我也尝试过使用 grunt.util._.expand 方法,但收效甚微。 data: "&lt;%= grunt.util._.extend(jade.options.data, {dev: true}) %&gt;",

【问题讨论】:

    标签: pug gruntjs


    【解决方案1】:

    您可以在将用作默认值的task 级别指定options,然后在target 级别进一步指定target(开发与构建)特定的options。这样可以避免在多个targets 之间重复相同的配置:

    jade: {
        options : {
            config: ...,
            pkg: ...,
            helpers: ...
        },
        dev: {
            options: {
                dev : true
            },
            files: [{
                dest: '<%= config.workingDir %>',
                ...
            }]
        },
        build: {
            files: [{
                dest: '<%= config.buildDir %>',
                ...
            }]
        }
    }
    

    更新

    基于jade情况下的选项都需要在data中的注释,如果使用上述方法,本地data将完全覆盖全局data,你可以这样做这是因为 Gruntfile.js 只是 JavaScript:

    var dataConfigBuild = {
        config: ...,
        pkg: ...,
        helpers: ...
    };
    
    //use your favorite way of "cloning" an object
    var dataConfigDev = {};
    for(var propName in dataConfigBuild) {
      dataConfigDev[propName] = dataConfigBuild[propName];
    }
    
    //and add the dev specific stuff
    dataConfigDev.dev = true;
    

    然后在你的任务配置中像这样使用:

    jade: {
        dev: {
            options: {
                data : dataConfigDev
            },
            files: [{
                dest: '<%= config.workingDir %>',
                ...
            }]
        },
        build: {
            options : {
                data : dataConfigBuild
            },
            files: [{
                dest: '<%= config.buildDir %>',
                ...
            }]
        }
    }
    

    注意,此代码未经测试。

    附带说明一下,在watch 相关代码中看不到预期配置的原因很可能是因为您需要设置spawn : false

    【讨论】:

    • 我相信覆盖而不是扩展选项(虽然我不是 100%)但在这种情况下,我需要额外的 options.data 属性才能通过一直到翡翠。
    • 更新是个好主意。我试图坚持,我认为,是 Grunt 的做法。我希望避免重复文件选项,但它似乎是最好的选择。谢谢。
    • 我错过了关于 spawn: false 的部分。这实际上已经解决了我的问题,我可以像第二个选项一样使用单个任务。
    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2014-08-24
    • 2015-05-19
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多