我在test
中有一个package.json
命令设置的应用程序如下:
"测试":" mocha - 需要babel-core / register --watch-extensions js ** / * .test.js",
不幸的是,我的apps文件夹结构比那个命令允许我更深入。它看起来像这样:
app
└── someFolder
└── subFolder
└── subSubFolder
└── fileNeedsToBeTest.js
└── fileNeedsToBeTest.test.js
└── anotherFolder
└── anotherFileNeedsToBeTest.js
└── anotherFileNeedsToBeTest.test.js
问题在于test
命令,我只能测试anotherFolder
中的内容,但我还需要测试someFolder/subFolder/subSubFolder
中的文件。我不想指定确切的路径,因为我在应用程序中发生了多个此类实例。
我怎样才能修复test
命令,无论文件夹中的文件有多深,都能找到*.test.js
个文件?
答案 0 :(得分:4)
您的glob模式**/*.test.js
应该用双引号("..."
)包装,但是,因为它是在JSON中指定的,所以需要使用反斜杠进行转义,即\"...\"
。
您的test
命令应更改为以下内容:
"test": "mocha --require babel-core/register --watch-extensions js \"**/*.test.js\"",
这将在项目目录的根目录中找到所有以.test.js
结尾的文件。
提示:我假设您的app
文件夹存在于项目的根目录中,与package.json
和{{1}处于同一级别} 目录。如果是这种情况,则glob模式node_modules
可能会从**/*.test.js
目录中找到以.test.js
结尾的任何文件 - 这将导致这些测试也被运行。为了防止这种情况,您可以否定glob模式中的node_modules
目录,如下所示:
node_modules
修改强>
回应以下评论:
...
"test": "mocha --require babel-core/register --watch-extensions js \"{,!(node_modules)/**/}*.test.js\""
命令的一部分来自哪里?这是什么语法?
Mocha使用node-glob作为其中一个dependencies。该部分命令的语法由node-glob定义(...类似于Bash用于globbing /路径名扩展的语法)。
可以在node-glob文档的Glob Primer部分找到此语法的参考。
用于此方案的特定模式的说明:
让我们分解那种模式的相关部分......
{,!(node_modules)/**/}*.test.js
(A)支持部分:文档将其描述为:
在解析路径部件模式之前,将支撑部分扩展为一个集合。支撑部分以
(A) Braced section │ ┌─────────┴──────────┐ {,!(node_modules)/**/}*.test.js │└──────┬──────┘└─┬┘ │└───┬───┘ │ │ │ │ │ │ │ │ │ (F) filename extension │ │ │ │ │ │ │ (E) Single Globstar │ │ │ │ │ (D) Double Globstar │ │ │ (C) Negation section │ (B) Comma-delimited
开头,以{
结尾,其中包含任意数量的逗号分隔部分。支撑部分可能包含斜杠字符,因此}
会扩展为a{/b/c,bcd}
和a/b/c
。
(B)以逗号分隔
支撑部分以逗号分隔符开头,因为下一个否定部分(以abcd
开头的部分)必须在另一个模式之后 - 它不能在一开始。这里没有提供逗号分隔符之前的初始模式;在这种情况下,它只是暗示项目目录(或者更具体地说是存储!
的同一/当前目录)。我们实际上可以将模式更改为以下任一项,我们会得到相同的结果。
package.json
注意,在逗号分隔符之前分别将{/,!(node_modules)/**/}*.test.js
^
{./,!(node_modules)/**/}*.test.js
^^
或/
添加到模式中。这与我们可能在html,javascript等中定义资产路径的方式相同。
(C)否定部分
./
表示“与此匹配”或“忽略此”。文档将其描述为:
!
匹配任何与所提供的任何模式都不匹配的内容。
在我们的场景中,它用于忽略!(pattern|pattern|pattern)
文件夹。
(D)Double globstar
node_modules
部分匹配任意数量的字符,包括/**/
。也许更简单的是,它意味着扫描所有文件和子文件夹,无论多深层次。
(E)Single Globstar
匹配文件名的所有字符,如果/当它们以提供的文件扩展名结束时(F)。
(F)文件扩展名
匹配以/
文件扩展名结尾的所有文件。