Grunt构建脚本,用于读取xml文件以确定要复制的文件

时间:2018-06-06 19:27:52

标签: javascript jquery html gruntjs

copy: {
  build: {
    cwd: 'app',
    src: ['**', '!**/vendors/**', '!**src/js/*.js',],
    dest: 'dist',
    expand: true
  }
}

我正在使用grunt构建脚本为已完成的产品构建分发文件夹。但是,它不是100%自动和动态。例如,我有一个xml内容文件的文件夹。然而,我并没有全部使用它们。现在,整个文件夹被复制到构建版本。手动我必须进入并删除构建版本中不需要的xml文件然后运行它。或者我可以进入grunt文件并告诉它忽略这些文件。

问题在于我不想每次都这样做。我有一个理论上的想法是有一个xml文件,我在其中定义元素来表示某些其他文件。

<bootstrap>true</bootstrap>
<extraContent>false</extraContent>

这可以说在构建中应该或不应该忽略与bootstrap和extraContent相关的文件。我想弄清楚你是否可以用咕噜声这样做。

以下是我如何看待逻辑播放...

var bootstrap = $(xml).find("bootstrap").text()
if(bootstrap == "false"){
   var url = src/bootstrap.css
   //Here add the correlated filepath defined above to be ignored
}

问题不仅在于写这个咕噜咕噜知道它是什么,而且还将该逻辑与我上面显示的实际“copy:{}”脚本相结合

1 个答案:

答案 0 :(得分:0)

如果您想根据内容包含/排除文件,可以使用filter功能。示例可以在官方文档中找到:https://gruntjs.com/configuring-tasks#custom-filter-function

  

filter属性可以帮助您定位更详细的文件。

在你的情况下,这可能是这样的:

copy: {
  build: {
    cwd: 'app',
    src: ['**', '!**/vendors/**', '!**src/js/*.js',],
    dest: 'dist',
    expand: true,

    // this filter function will copy xml files only when `bootstrap` is set to 'true'
    filter: filepath => {
      if (require('path').extname(filepath) !== 'xml')
        return true;
      const xml = require('fs').readFileSync(filepath, 'utf8');
      const json = require('xml2json').toJson(xml);
      return json.bootstrap === 'true';
    }

  }
}

然后,您可以使用process功能仅复制特定文件中的特定内容:https://github.com/gruntjs/grunt-contrib-copy#process

  

此选项作为控制复制文件内容的高级方法传递给grunt.file.copy。