Ответ 1
Решение
Измените свои сценарии так, чтобы то, что вы передали Mocha, защищено от расширения оболочкой:
"scripts": {
"test": "mocha 'dist/**/*Test.js'",
}
Обратите внимание на одинарные кавычки вокруг параметра, заданного на mocha
.
Объяснение
Эта проблема исправляется без использования внешних инструментов. Основная причина вашей проблемы заключается в том, что npm
использует sh
как оболочку, которая будет запускать ваши команды script.
В подавляющем большинстве случаев, когда процесс * nix запускает оболочку, он запускает sh
, если нет чего-то, говорящего об этом иначе. Предпочтение оболочки, которое вы устанавливаете для входа в систему, не является способом "сказать об этом иначе". Поэтому, если у вас есть, скажем, zsh
как ваша оболочка входа, это не означает, что npm
будет использовать zsh
.
Те реализации sh
, которые не содержат никаких расширений, помимо того, что должен предоставить sh
, не понимают glob-функции **
так, как вы этого хотите. Насколько я могу судить, это интерпретируется как *
. Однако Mocha интерпретирует пути, переданные ему, используя реализацию JavaScript globs. Таким образом, вы можете обойти проблему, защищая свои глобы от интерпретации sh
. Рассмотрим следующий package.json
:
{
"name": "immutable-ts",
"scripts": {
"bad": "mocha test/**/*a.js",
"good": "mocha 'test/**/*a.js'",
"shell": "echo $0"
}
}
shell
script - это просто, чтобы мы могли проверить, в какой оболочке работает script. Если вы запустите его, вы должны увидеть sh
.
Теперь, учитывая следующее дерево:
test/
├── a.js
├── b.js
├── x
│ ├── a
│ │ ├── a.js
│ │ └── b.js
│ ├── a.js
│ └── b
│ └── a.js
└── y
├── a.js
└── q
Со всеми a.js
и b.js
файлами, содержащими it(__filename);
. Вы получаете следующие результаты:
$ npm run bad
> [email protected] bad /tmp/t2
> mocha test/**/*a.js
- /tmp/t2/test/x/a.js
- /tmp/t2/test/y/a.js
0 passing (6ms)
2 pending
$ npm run good
> [email protected] good /tmp/t2
> mocha 'test/**/*a.js'
- /tmp/t2/test/a.js
- /tmp/t2/test/x/a.js
- /tmp/t2/test/x/a/a.js
- /tmp/t2/test/x/b/a.js
- /tmp/t2/test/y/a.js
0 passing (5ms)
5 pending