首页 > 解决方案 > 如何选择具有自定义文件结尾的任何层的所有文件夹和子文件夹?

问题描述

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

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

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

编辑:在 StackOverflow 上发现了这个问题。根据那个答案,你必须写:

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

不幸的是,这对我来说什么都不匹配。我在 Mac 上。

标签: javascriptnode.jsregexcreate-react-apppackage.json

解决方案


您提到的问题对您的情况不是特别有用。我在那里的回答很有效,因为 Mocha 的设计目的是将您提供给它的模式传递给glob进行解释。因此,当您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'). (有关详细信息,请参阅页面man)在运行时,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也可以避免这里的问题。


推荐阅读