web-dev-qa-db-ja.com

npmグロブパターンがサブディレクトリと一致しません

私の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
20
David Souther

解決

スクリプトを変更して、Mochaに渡すものがシェルによる拡張から保護されるようにします。

"scripts": {
    "test": "mocha 'dist/**/*Test.js'",
 }

mochaに指定されたパラメーターを一重引用符で囲んでいることに注意してください。

説明

この問題は、外部ツールを使用せずに修正できます。問題の根本的な原因は、npmがスクリプトコマンドを実行するシェルとしてshを使用していることです。

* nixプロセスがシェルを開始すると、他の方法で実行するように指示するものがない限り、シェルがshを開始するのは圧倒的なケースです。ログインに設定したシェル設定は、「別の方法で通知する」方法を構成するものではありません。したがって、たとえば、ログインシェルとしてzshがある場合、npmzshを使用する必要はありません。

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
31
Louis

スクリプトでfindコマンドを-nameオプションとインライン化して、zshによって提供される拡張グロブ構文を置き換えることができます。

あなたの場合、コマンドは次のようになります。

mocha `find dist -type f -name '*Test.js'`

ディレクトリ名に「Test.js」を入れないことが確実な場合は、-type fの部分を現実的に省略できます。 (おそらく安全な仮定ですが、完全を期すために含めました)

2
Retsam