Grunt ngconstant:从多个可交换文件生成

Grunt ngconstant: generation from multiple exchangeable files

在以 Yeoman 开始的 angular 项目中,我们有 json 文件(dev、test、dist...),其中包含每个环境工作所需的常量,以便g运行t 服务任务定义如下:

grunt.registerTask('serve', function(environment) {
  grunt.task.run([
    ...
    'ngconstant:'+environment,
    ...
  ]);
});

然后在 ngconstant 中我们有:

ngconstant: {
  options: {
    name: 'environment',
    dest: ...
  },
  dev: {
    constants: {
      'ENV': grunt.file.readJSON('environments/dev.json')
    }
  },
  test: {
    constants: {
      'ENV': grunt.file.readJSON('environments/test.json')
    }
  },
  ...
  }
}

这样就可以 运行 和 grunt serve:dev, grunt serve:test...

现在我们还需要根据第二个标准(我们称它为用户目标)修改应用程序的某些方面,使其可以像 grunt serve:dev:target1grunt serve:test:target2 那样构建。 ..

这可以用 ngconstant 完成吗?到目前为止,我唯一类似的想法是定义目标,如 dev-target1dev-target2test-target1... 其中每个设置 ENV 到一个文件和 TARGET到另一个,但这不是可扩展的(我们只处理两个目标,但我们希望很快会有更多目标)而且非常丑陋。

好的,找到方法了。 Gruntfile 中的 ngconstant:

ngconstant: {
  dev: {
    options: {
      name: 'environment',
      dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
    },
    constants: {
      'ENV': grunt.file.readJSON('environments/dev.json')
    }
  },
  test: {
    options: {
      name: 'environment',
      dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
    },
    constants: {
      'ENV': grunt.file.readJSON('environments/test.json')
    }
  },
  prod: {
    options: {
      name: 'environment',
      dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
    },
    constants: {
      'ENV': grunt.file.readJSON('environments/prod.json')
    }
  },
  local: {
    options: {
      name: 'environment',
      dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js'
    },
    constants: {
      'ENV': grunt.file.readJSON('environments/local.json')
    }
  },
  superior: {
    options: {
      name: 'target',
      dest: '<%= yeoman.app %>/js/modules/target/config/target.js'
    },
    constants: {
      'TGT': grunt.file.readJSON('targets/superior.json')
    }
  },
  profesional: {
    options: {
      name: 'target',
      dest: '<%= yeoman.app %>/js/modules/target/config/target.js'
    },
    constants: {
      'TGT': grunt.file.readJSON('targets/profesional.json')
    }
  },
}

这很混乱,因为所有东西都捆绑在同一个模块中,但是 serve 任务定义如下:

  grunt.registerTask('serve', function(environment, target) {
grunt.task.run([
  ...
  'ngconstant:'+environment,
  'ngconstant:'+target,
  ...
]);

});

并像 grunt serve:dev:superior 那样调用它会首先生成带有 "dev" ENV 常量的 environment/config/environment.js 文件,然后是带有 "superior" TGT 的 target/config/target.js 文件在各自文件中定义的常量。

我试过为两种类型设置相同的目标文件,但文件被覆盖,而不是附加常量或类似的东西。