Как я могу выбрать все папки и подпапки любых слоев с пользовательским окончанием файла? - PullRequest
1 голос
/ 04 апреля 2019

Я создал приложение React, используя Create-React-App. У меня есть сценарий тестирования в моем приложении 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?

Редактировать: Я нашел этот вопрос в StackOverflow . Согласно этому ответу вы должны написать:

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

что, к сожалению, для меня ничего не соответствует. Я на Mac.

1 Ответ

1 голос
/ 05 апреля 2019

Вопрос, на который вы ссылаетесь, не , особенно , полезен для вашего случая. Мой ответ там работает, потому что Mocha был разработан для передачи шаблонов, которые вы ему даете, в glob библиотеку для интерпретации. Поэтому, когда вы делаете mocha 'src/app/**/*.tests.js', кавычки не позволяют оболочке интерпретировать шаблон, Mocha получает src/app/**/*.tests.js в качестве первого заданного ему шаблона, который он дает glob, чтобы получить список файлов для фактического запуска. Ваш случай отличается по крайней мере одним решающим способом: glob не задействован, поэтому нет ничего, что может правильно интерпретировать **

Ваша первая попытка согласуется с тем, что происходит, когда вы используете оболочку, которая не понимает **. Он интерпретируется точно так же, как *. Таким образом, оболочка интерпретирует **/*.test.js как */*.test.js, расширяет этот шаблон и передает результат в node.

Во второй попытке вы цитируете шаблон, но это не помогает, потому что node не выполняет интерпретацию шаблона. Он пытается загрузить файл по пути src/**/*.test.js, , интерпретируемому буквально . Это не то, что вы хотите.

Я не уверен, что означает совместимость с Windows, но вы могли бы заменить 'src/**/*.test.js' на $(find src -type f -name '*.test.js'). (Подробнее см. на странице man .) Во время выполнения оболочка заменит это результатом команды 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.js и src/b.test.js. Скорее, он сообщает узлу «запустить скрипт src/a.test.js и передать ему параметр src/b.test.js». Я не очень много использовал tap, но не помню, чтобы он работал таким образом. Использование babel-tap, как показано выше, также позволяет избежать этой проблемы.

...