如何访问Grunt配置属性site
以读取config属性值指定的路径上的project.json
文件?
grunt.registerTask('build', function(target) {
grunt.config('site', target);
grunt.task.run('foo:dist', 'bar:dist');
});
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
site: grunt.file.readJSON('./sites/' + grunt.config('site') + '/project.json')
});
咕噜-CLI:
grunt build:sitename
>> Error: Unable to read "./sites/undefined/project.json"
使用文档中的example,我也试过了:
grunt.registerTask('global', 'site', function(prop, value) {
global[prop] = val;
});
grunt.registerTask('build', ['foo:dist', 'bar:dist']);
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
site: grunt.file.readJSON('./sites/' + global.site + '/project.json')
});
咕噜-CLI:
grunt global:site:sitename
>> Error: Unable to read "./sites/undefined/project.json"
更新:
使用@FelixKling答案作为指导,我取得了一些进展:
grunt.registerTask('build', function(target) {
grunt.config.set('target', target);
grunt.config.set('site', grunt.file.readJSON('./sites/' + grunt.config.get('target') + '/project.json'));
grunt.task.run('watch');
});
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
site: grunt.config.get('site'),
watch: {
sass: {
files: ['<%= site.dev %>/scss/*.scss'],
tasks: ['sass:dist']
}
},
sass: {
dist: {
files: {
'<%= site.dist %>/style.css': '<%= site.dev %>/scss/style.scss'
}
}
},
});
现在我能够成功读取project.json
文件,并且(不知何故)它甚至能够识别何时对观看文件进行编辑。但由于某些原因,当它运行sass:dist
任务时,我收到此错误:Warning: An error occurred while processing a template (Cannot read property 'dev' of undefined).
我不清楚watch
任务如何能够为site
获取正确的值,但更重要的是,我需要找到一种方法来获得相同的值sass
任务。
答案 0 :(得分:17)
initConfig
和grunt.file.readJSON
。您似乎需要模板字符串,并且只有在实际拥有目标名称时才能调用grunt.file.readJSON
。
例如:
grunt.registerTask('build', function(target) {
grunt.config.set('target', target);
grunt.config.set('site', grunt.file.readJSON(grunt.config.get('path'));
grunt.task.run('foo:dist', 'bar:dist');
});
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
path: './sites/<%= target %>/project.json'
});
更多信息:http://gruntjs.com/api/grunt.config
关于你的更新:你基本上犯了同样的错误,就像你在第一个例子中所做的那样。您正在尝试在设置之前访问配置site
。
您必须了解初始化步骤,即grunt.initConfig
发生之前任何与任务相关的代码运行:
Initialize config -> Run task
让我们孤立地看一下grunt.initConfig
:
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
site: grunt.config.get('site'),
});
这是初始化步骤,在其他所有步骤之前发生。首先评估传递给配置对象initConfig
的参数。您在此处尝试执行的操作是在创建配置之前访问配置选项site
。我希望你认识到这没有意义。
如果您在注册任何任务之前将grunt.initConfig
置于最顶层,也许可以帮助您理解该过程。
解决方案:
我认为您实际可能会遇到的是命令行参数,您可以使用它来控制要构建的站点。有关详细信息,请参阅grunt.option
。
例如:
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
watch: {
sass: {
files: ['<%= site.dev %>/scss/*.scss'],
tasks: ['sass:dist']
}
}
});
grunt.config.set('site', grunt.file.readJSON('./sites/' + grunt.option('site') + '/project.json'));
然后用
运行任务grunt watch --site=somesite