读取 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.
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.