如何基于项目中的实际树枝文件创建数据列表

时间:2018-08-02 20:17:58

标签: npm gruntjs

我正在使用https://www.npmjs.com/package/grunt-twig-render通过NPM创建一个应用程序。本质上是twig.js。我保持它苗条,所以现在没有任何其他php或类似的东西。只是npm / twig.js和其他npm软件包,包括Grunt。

这就是我想要做的。现在,我在目录的子文件夹中有一堆树枝文件。

我想做的是在该子目录中生成.twig文件的数据列表。这样的事情可能会很好

files: [
{
"name": "file1.twig"
"path": "/folder1"
},
{
"name": "file2.twig"
"path": "/folder1"
},
{
"name": "file3.twig"
"path": "/folder1"
}
]

但是我不是很挑剔。只是看看是否有人找到了一种通过npm或twigjs或类似方法在文件夹中创建文件列表的方法。

如果它生成一个.json文件,那将是理想的选择。这将是构建过程的一部分,因此通过Grunt进行的工作也将很好。

提前谢谢

1 个答案:

答案 0 :(得分:1)

您可以在Gruntfile.js中注册custom grunt task,利用shelljs find方法检索每个.twig文件的路径。

shelljs是一个软件包,为Node.js提供了可移植的Unix Shell命令。它的find方法类似于Bash find命令。

以下步骤描述了如何实现您的需求:

  1. cd到您的项目目录,并通过运行以下命令安装shelljs

    npm i -D shelljs
    
  2. 按以下步骤配置Gruntfile.js

    Gruntfile.js

    module.exports = function(grunt) {
    
      // requirements
      var path = require('path'),
        find = require('shelljs').find;
    
      grunt.initConfig({
        // other tasks ...
      });
    
      /**
       * Custom grunt task generates a list of .twig files in a directory
       * and saves the results as .json file.
       */
      grunt.registerTask('twigList', 'Creates list of twig files', function() {
        var obj = {};
    
        obj.files = find('path/to/directory')
            .filter(function(filePath) {
              return filePath.match(/\.twig$/);
            })
            .map(function(filePath) {
              return {
                name: path.basename(filePath),
                path: path.dirname(filePath)
              }
            });
    
        grunt.file.write('twig-list.json', JSON.stringify(obj, null, 2));
      });
    
      grunt.registerTask('default', ['twigList']);
    };
    

说明

  1. shelljs和内置path模块的节点都require放入Gruntfile.js

  2. 接下来,注册了名为twigList的自定义任务。

    • 在函数主体中,我们初始化一个空对象并将其分配给名为obj的变量。

    • 接下来,将调用shelljs find方法,并传递到包含.twig文件的子目录的路径。当前路径设置为path/to/directory,因此您需要根据需要重新定义该路径。

      注意find方法还可以接受多个目录路径的数组作为参数。例如:

      find(['path/to/directory', 'path/to/another/directory'])
      
    • find方法返回在给定目录(很多层次)中找到的所有路径的数组。通过为字符串filter()方法提供正则表达式(return),我们利用数组的match方法来.twig仅扩展名为\.twig$的文件路径。

    • 所生成的.twig文件路径数组的每一项都传递给该数组的map()方法。它return是一个具有两个属性(namepath)的对象。 name属性的值是使用节点path.basename()方法从完整文件路径获取的。同样,path属性的值是使用节点path.dirname()方法从完整文件路径获得的。

    • 最后使用grunt file.write()方法将.json文件写入磁盘。当前,第一个参数设置为twig-list.json。这将导致名为twig-list.json的文件被保存到Gruntfile.js所在的项目目录的顶层。您需要根据需要重新定义此输出路径。通过利用JSON.stringify()obj转换为JSON来提供第二个参数。生成的JSON缩进两个空格。

其他信息

如前所述, shelljs find方法列出了给定目录路径中的所有文件(许多级别为deeep)。如果提供的目录路径包含一个子文件夹,该子文件夹包含要排除.twig个文件,则可以在filter()方法中执行以下操作:

.filter(function(file) {
    return filePath.match(/\.twig$/) && !filePath.match(/^foo\/bar/);
})

这将匹配所有.twig个文件,并忽略给定目录的子目录foo/bar中的文件,例如path/to/directory