0

我正在尝试创建一个 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: "<%= grunt.util._.extend(jade.options.data, {dev: true}) %>",

4

1 回答 1

2

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

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

更新

根据注释,jade如果选项都需要 in data,并且如果使用上述方法,则本地data将完全覆盖 global 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.

于 2013-08-14T03:02:35.943 回答