如何选择具有自定义文件结尾的任何层的所有文件夹和子文件夹?

Posted

技术标签:

【中文标题】如何选择具有自定义文件结尾的任何层的所有文件夹和子文件夹?【英文标题】:How can I select all folders and subfolders any layers deep with custom file ending? 【发布时间】:2019-08-26 01:12:58 【问题描述】:

我使用 Create-React-App 制作了一个 React 应用程序。我的 React 应用程序的 package.json 中有一个测试脚本,如下所示:

"test": "node -r @babel/register -r @babel/polyfill **/*.test.js | tap-color",

这会捕获并执行src/ 中的文件,如src/App.test.js,但不是header.test.js 中的src/layout/header/header.test.js。如果我添加更多层文件夹怎么办?是否有一个正则表达式可以捕获src/ 中的所有文件夹及其子文件夹,无论其以.test.js 结尾的文件如何嵌套?

编辑:我找到了this question on ***。根据那个答案,你必须写:

"test": "node -r @babel/register -r @babel/polyfill 'src/**/*.test.js' | tap-color",

不幸的是,这对我来说没有任何匹配。我在 Mac 上。

【问题讨论】:

【参考方案1】:

您提到的问题对您的情况特别没有用处。我的回答很有效,因为 Mocha 的设计目的是将您提供给它的模式传递给 glob library 进行解释。因此,当您执行mocha 'src/app/**/*.tests.js' 时,引号会阻止shell 解释该模式,Mocha 将src/app/**/*.tests.js 作为赋予它的第一个模式,然后将其提供给glob 以获取要实际运行的文件列表。您的情况至少在一个关键方面有所不同:glob 没有涉及,因此没有任何东西可以正确解释**

您的第一次尝试与您使用不理解** 的shell 时发生的情况一致。它的解释与* 完全相同。所以shell将**/*.test.js解释为*/*.test.js,扩展这个模式并将结果传递给node

在您的第二次尝试中,您引用了该模式,但这对您没有帮助,因为node 不进行模式解释。它尝试在路径src/**/*.test.js 加载文件,字面解释。这不是你想要的。

我不确定与 Windows 的兼容性意味着什么,但您可以将 'src/**/*.test.js' 替换为 $(find src -type f -name '*.test.js')。 (有关详细信息,请参阅 the man page。)在运行时,shell 会将其替换为 find 命令的结果。

或者为了更简单,减少平台问题的风险,您可以像这样使用babel-tap

babel-tap 'src/**/*.test.js' | tap-color

如果您使用babel-tap,实际上不需要使用find,因为在内部babel-tap 调用使用glob 库的设施来解释传递给它的文件名。


我专注于文件模式问题,但我看不到您尝试执行的操作将如何工作,即使没有模式问题。考虑这个命令,并假设文件存在:

node -r @babel/register -r @babel/polyfill src/a.test.js src/b.test.js

这并不是告诉 Node 运行 src/a.test.jssrc/b.test.js。相反,它告诉节点“运行脚本src/a.test.js 并将参数src/b.test.js 传递给它”。我没有经常使用tap,但我不记得它是这样工作的。像我上面展示的那样使用babel-tap 也可以避免这里的问题。

【讨论】:

非常感谢您的广泛回答。使用"test": "node -r @babel/register -r @babel/polyfill $(find src -type f -name '*.test.js') | tap-color", 可以找到与模式匹配的 first 文件。但正如您所假设的,仅在第一个文件中运行测试并跳过其余部分。 (我认为)不幸的是,我不能使用babel-tap,因为我正在使用RITEway,并且该库导入并使用磁带,所以我无法控制test 函数。你有什么其他想法我可以运行所有的测试吗?有没有办法循环测试命令直到找到所有文件? 不熟悉 RITEway。我想尝试的是node -r @babel/register -r @babel/polyfill ./node_modules/.bin/riteway 'src/**/*.test.js'。 (我已经在脑海中输入了这个。注意拼写错误并确保riteway 的路径正确。)更改只是将riteway 脚本作为要运行的脚本的名称传递给它 glob 模式作为参数。从 RITEway 的 README 来看,它似乎原生支持 glob 模式。 天哪,这行得通。非常感谢你,路易斯,你帮了我很多。重构后必须手动运行数十个测试套件是乏味的。不再! ??

以上是关于如何选择具有自定义文件结尾的任何层的所有文件夹和子文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

php 将自定义模板分配给具有特定类别(和子级)的帖子。

如何从 Pentaho Kettle 读取所有文件夹和子文件夹 使用 SFTP 步骤获取文件

如何使用具有自定义文件扩展名的 H2 数据库?

如何将具有自定义属性的组件移动到 QML 中的单独文件

Android 存储访问框架 - 自定义文件类型的启动选择器

如何在 Laravel 中导入具有各种模型(和子数据/模型)的单个 excel 文件/工作表?