Javascript 访问initConfig()中的Grunt配置数据

Javascript 访问initConfig()中的Grunt配置数据,javascript,gruntjs,Javascript,Gruntjs,如何访问Grunt config属性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 config属性
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')
});
grunt cli:

grunt build:sitename

>> Error: Unable to read "./sites/undefined/project.json"
grunt global:site:sitename

>> Error: Unable to read "./sites/undefined/project.json"

使用文档中的一个示例,我还尝试了以下方法:

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 build:sitename

>> Error: Unable to read "./sites/undefined/project.json"
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'
      }
    }
  },
});
grunt.registerTask('build',函数(目标){
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'),
观察:{
sass:{
文件:['/scss/*.scss'],
任务:['sass:dist']
}
},
sass:{
地区:{
档案:{
“/style.css”:“/scss/style.scss”
}
}
},
});
现在我能够成功地读入
project.json
文件,而且(不知何故)它甚至能够识别何时对监视的文件进行了编辑。但由于某种原因,当它运行
sass:dist
任务时,我得到了以下错误:
警告:处理模板时出错(无法读取未定义的属性“dev”)。


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

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

grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),
  site: grunt.config.get('site'),
});
这是初始化步骤,它发生在其他步骤之前。首先计算传递给配置对象
initConfig
的参数。您在这里尝试的是在创建配置之前访问配置选项
站点
。我希望你认识到这没有道理

在注册任何任务之前,如果将
grunt.initConfig
放在最上面,可能会帮助您理解流程


解决方案:

grunt build:sitename

>> Error: Unable to read "./sites/undefined/project.json"
grunt global:site:sitename

>> Error: Unable to read "./sites/undefined/project.json"
我认为您实际需要的可能是命令行参数,您可以使用这些参数控制要构建的站点。有关更多信息,请参阅

例如:

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

initConfig中的内联grunt.file.readJSON()肯定会在registerTask之前执行。@Rajit:Oops,忘了删除该部分。谢谢如图所示运行代码时,出现以下错误:
无法读取“/sites//project.json”
。在读取文件路径时,让Grunt插入变量有什么诀窍吗?@cantera:请查看我的更新<代码>监视工作,因为您在运行
监视
之前正确设置了配置。
build
所做的就是设置配置选项并运行task
watch
。这很有效!非常感谢您详细解释并引导我了解解决方案。关于您的更新,目前
grunt.file.readJSON('./sites/'+global.site+'/project.json')
运行,
global.site
任务尚未运行,因此还不存在
global
任务。再次检查我的答案,我纠正了错误。