gpt4 book ai didi

javascript - 在 initConfig() 中访问 Grunt 配置数据

转载 作者:可可西里 更新时间:2023-11-01 02:05:09 24 4
gpt4 key购买 nike

如何访问 Grunt 配置属性 site 以读取配置属性值指定路径中的 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')
});

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

grunt-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 任务时,我收到此错误:警告:处理模板时发生错误(无法读取未定义的属性“dev”)。

我不清楚 watch 任务是如何获得 site 的正确值的,但更重要的是,我需要找到一种方法来获得sass 任务的相同值。

最佳答案

initConfiggrunt.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


关于您的更新:您基本上又犯了与第一个示例中相同的错误。您正在尝试在设置之前访问配置 站点

您必须了解初始化步骤,即 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

关于javascript - 在 initConfig() 中访问 Grunt 配置数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22996343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com