3

我一生都无法弄清楚如何获得这项工作。我正在使用的模块的 grunt 配置(grunt-sloc)需要Files Object Format。使用它,我希望能够立即匹配顶级目录下的所有常规文件(即非目录)。

例如,假设这是我的目录结构,其中+表示目录并-表示常规文件:

repo
  + dir
    - unwanted.js
  - server.js

如何使用 Grunt 的文件对象格式匹配server.js但不匹配diror dir/unwanted.js

这是它在紧凑格式中的外观

mine: {
  src: [
    '*'
  ]
}

或者,在 bash 中,你会像这样得到它们:

ls -p | grep -v /;

这是我尝试使用Files Object Format的方法:

  • 这不起作用:

    mine: {
      files: {
        '.': ['*']
      }
    }
    
  • 这也不是:

    mine: {
      files: {
        './': ['*']
      }
    }
    
  • 甚至没有这个:

    mine: {
      files: {
        './': ['*/server.js']
      }
    }
    
  • 也不是这个:

    mine: {
      files: {
        './': ['server.js']
      }
    }
    
  • 这有效,但它递归运行,我不想要:

    mine: {
      files: {
        './': ['**/server.js']
      }
    }
    

在做了一堆测试和代码阅读之后,我已经验证它实际上是minimatch包(Grunt 的依赖),它没有返回我正在寻找的匹配项。所以这不是我正在使用的 grunt 模块;这是我的咕噜声配置。

由于 Grunt 如此受欢迎,而且这似乎是一个非常常见的用例,我猜想有办法做到这一点。有谁知道那是什么?

更新

正如所RobC指出的,我的最后一个例子不起作用。它server.js在我的node_modules目录中找到 ',这让我认为它正在工作。

4

1 回答 1

2

首先,FWIW,您使用Files Object Format方法列出的示例也对我不起作用,包括您的最后一个:

 // Although this worked for you, this failed for me...
 mine: {
     files: {
         './': ['**/server.js']
     }
 }

我可以让它工作的唯一方法是匹配所有内容,然后使用 Grunt globbing模式否定顶级目录。

虽然以下要点演示了对我有用的方法,但它确实需要知道/配置您希望排除的顶级目录的名称:

目录结构

给定一个目录设置如下:

repo
│
├─── dir
│   │
│   └─── unwanted.js
│
├─── foo.js
│
├─── Gruntfile.js
│
├─── node_modules
│   │
│   └─── ...
│
├─── package.json
│
└─── server.js

Gruntfile.js

...并Gruntfile.js配置如下:

module.exports = function(grunt) {
    grunt.initConfig({
        sloc: {
            mine: {
                files: {
                    '.': [
                        '**', // Match everything and add to the results set.

                        // Explicitly state which directories under the top
                        // level directory to negate from the results set.
                        '!**/node_modules/**',
                        '!**/dir/**',

                        // Files can be negated from the results set too.
                        '!**/Gruntfile.js' // 
                    ]
                }
            }
        }

    });
    grunt.loadNpmTasks('grunt-sloc');
    grunt.registerTask('default', [
        'sloc:mine'
    ]);
};

Sloc 结果

通过 CLI 正确运行grunt会导致grunt-sloc仅报告两个文件的统计信息,即foo.jsserver.js.

正如预期的那样,package.json由于 JSON 是一种不受支持的语言,因此省略了统计信息。

附加说明:

我发现这篇文章!的答案在解释如何从初始返回的数组中排除以开头的模式时提供了相当丰富的信息。

于 2016-12-19T22:54:39.890 回答