【问题标题】:Grunt build script that reads xml file to determine which files are copied读取 xml 文件以确定复制哪些文件的 Grunt 构建脚本
【发布时间】:2018-06-06 19:27:51
【问题描述】:
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
}

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

【问题讨论】:

    标签: javascript jquery html gruntjs


    【解决方案1】:

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

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

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

    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 作为一种高级方式来控制被复制的文件内容。

    【讨论】:

    • 我假设 filepath 应该是我的文件路径,但是当我运行 grunt.registerTask('test', function(){ const xml = require('fs').readdirSync('app/dir/内容/settings.xml'); const json = require('xml2json').toJson(xml); return json.settings.hasGlossary === 'true'; });作为测试,它告诉我第一行不是目录
    • 我需要一个包吗,因为它说'找不到模块xml2json'
    • 是的,你应该用 npm 安装外部包:npm install xml2json --save
    • 是否已弃用?与其他软件包不同,这给了我各种错误
    • 你用的是什么操作系统?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多