读取 xml 文件以确定复制哪些文件的 Grunt 构建脚本

Grunt build script that reads xml file to determine which files are copied

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

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

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

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

这表示与 bootstrap 和 extraContent 相关的文件应该或不应该在构建中被忽略。我想知道你是否可以在 g运行t 中做到这一点。

像下面这样的东西是我如何看待逻辑的结果...

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

问题不仅在于写这个让 g运行t 知道它是什么,而且还要将该逻辑与我在上面显示的实际 "copy:{}" 脚本结合起来

如果你想 include/exclude 基于文件内容的文件,你可以使用 filter 函数。例子可以参考官方文档:https://gruntjs.com/configuring-tasks#custom-filter-function.

The filter property can help you target files with a greater level of detail.

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

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

This option is passed to grunt.file.copy as an advanced way to control the file contents that are copied.