私のpackage.json
には、**/*Test.js
を使用してファイルを照合するscriptsブロックがあります。 npm
を介して実行する場合、それらは複数のレベルのサブディレクトリと一致しません。コマンドラインで直接実行すると、期待どおりに機能します。
誰かが何が起こっているのかを説明し、回避策または解決策を提供できますか?
package.json
{
"name": "immutable-ts",
"scripts": {
"test": "echo mocha dist/**/*Test.js",
}
}
% npm run test
> [email protected] test:unit .../immutable-ts
> echo mocha dist/**/*Test.js
mocha dist/queue/QueueTest.js dist/stack/StackTest.js
% echo mocha dist/**/*Test.js
mocha dist/queue/QueueTest.js dist/stack/StackTest.js dist/tree/binary/BinaryTreeTest.js
% ls dist/**/*
dist/collections.js dist/queue/QueueTest.js dist/tree/binary/BinaryTree.js dist/immutable.js.map dist/stack/Stack.js.map dist/tree/binary/BinaryTreeTest.js.map
dist/immutable.js dist/stack/Stack.js dist/tree/binary/BinaryTreeTest.js dist/queue/Queue.js.map dist/stack/StackTest.js.map
dist/queue/Queue.js dist/stack/StackTest.js dist/collections.js.map dist/queue/QueueTest.js.map dist/tree/binary/BinaryTree.js.map
スクリプトを変更して、Mochaに渡すものがシェルによる拡張から保護されるようにします。
"scripts": {
"test": "mocha 'dist/**/*Test.js'",
}
mocha
に指定されたパラメーターを一重引用符で囲んでいることに注意してください。
この問題は、外部ツールを使用せずに修正できます。問題の根本的な原因は、npm
がスクリプトコマンドを実行するシェルとしてsh
を使用していることです。
* nixプロセスがシェルを開始すると、他の方法で実行するように指示するものがない限り、シェルがsh
を開始するのは圧倒的なケースです。ログインに設定したシェル設定は、「別の方法で通知する」方法を構成するものではありません。したがって、たとえば、ログインシェルとしてzsh
がある場合、npm
がzsh
を使用する必要はありません。
sh
が提供するはずの拡張機能を含まないsh
の実装は、**
グロブを希望どおりに理解しません。私の知る限り、それは*
として解釈されます。ただし、MochaはグロブのJavaScript実装を使用して渡されたパスを解釈します。したがって、グロブがsh
によって解釈されないように保護することで、問題を回避できます。次のpackage.json
を検討してください。 :
{
"name": "immutable-ts",
"scripts": {
"bad": "mocha test/**/*a.js",
"good": "mocha 'test/**/*a.js'",
"Shell": "echo $0"
}
}
Shell
スクリプトは、どのシェルがスクリプトを実行しているかを確認できるようにするためのものです。実行すると、sh
が表示されます。
ここで、次のツリーが与えられます。
test/
├── a.js
├── b.js
├── x
│ ├── a
│ │ ├── a.js
│ │ └── b.js
│ ├── a.js
│ └── b
│ └── a.js
└── y
├── a.js
└── q
it(__filename);
を含むすべてのa.js
およびb.js
ファイル。次の結果が得られます。
$ npm run bad
> immutable-ts@ 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
> immutable-ts@ 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
スクリプトでfind
コマンドを-name
オプションとインライン化して、zshによって提供される拡張グロブ構文を置き換えることができます。
あなたの場合、コマンドは次のようになります。
mocha `find dist -type f -name '*Test.js'`
ディレクトリ名に「Test.js」を入れないことが確実な場合は、-type f
の部分を現実的に省略できます。 (おそらく安全な仮定ですが、完全を期すために含めました)