web-dev-qa-db-ja.com

「npm test」がUNIXとWindowsの両方で動作するように、ノードnpm package.jsonを構成します

Node.js npmモジュールを開発し、Windowsで開発しました。今日、私はいくつかのMochaテストを書きました。多くの闘争の後、npm test働く、package.jsonは次のように見えなければなりませんでした:(他のオプションがあるかもしれません???)

"scripts": { "test": "node node_modules/mocha/bin/mocha" }

すべてのUnixベースの本にあるものの代わりに、

"scripts": { "test": "./node_modules/.bin/mocha" }

Package.jsonをWindowsとUnixの両方で動作するように設定するにはどうすればよいですか? Travis-CIはUnixを実行していると想定しているため、ビルドをそれにリンクすると、Windowsバージョンで爆発します。

誰かがまさにこれのために機能を要求した2年前のスレッドを見つけました。そのスレッドは消滅したように見えた。この SOの質問 は近いように見えますが、私が望んでいるものとはまったく異なり、率直に言って、私は答えを理解できません。 :-(誰でも明確にできますか?

当分の間、私は行きます

"scripts": {
      "test": "node node_modules/mocha/bin/mocha",
      "testOnUnixUseThis"    : "./node_modules/.bin/mocha (I think)",
      "testOnWindowsUseThis" : "node node_modules/mocha/bin/mocha"
  },

残念ながら、_npm test testOnWindowsUseThisまたはnpm testOnWindowsUseThis。また、Travis-CIの問題は修正されません。しかし、少なくともモジュールをダウンロードした人は、(できれば)何が起こっているのかを見ることができます。

より良いアイデアはありますか?私はまだWindowsで開発している唯一の人ですか? :-)

28
user949300

常にnpm install -g mochaまたはnpm install mochaを実行してから、追加するだけです。

"scripts": {
    "test": "mocha spec"
}

package.jsonに。これは、すべての環境で機能する場合と機能しない場合があります。たとえば、ラインマンでは、bin/mochaを使用する必要があります。また、これを回避する方法が見つからない場合は、テストスクリプトをUnix用に設定してから、「wintest」またはWindowsで必要な処理を実行するスクリプトを追加します。スクリプトには任意の名前を付けることができます。デフォルトのもの(test、startなど)はnpm [command]で使用できます。非標準のもの(wintestなど)はnpm run-script [command]で使用できますが、引き続き機能します。

これがどのように/なぜ機能するのかについてのちょっとした裏話:

モジュールをグローバルにインストールすると、そのモジュールはPATH(または同等のWindowsのもの)で利用可能になります。プロジェクトの依存関係をインストールするときに、そのモジュールにバイナリがある場合、それらはnode_modules/.binにシンボリックリンクされ、npm run [some-command]を実行すると、npmはnode_modules/.binをPATHに追加しますそのコマンド用。したがって、mochaがグローバルにインストールされると、"test": "mocha spec"はグローバルにインストールされたmochaを使用してテストを実行します。プロジェクトの依存関係である場合、node_modules/.binにあるものを使用します。私がこれを見つけたのは、npmがnode_modules/.binをPATHのfrontに追加するため、ローカルバイナリが常にグローバルバイナリよりも優先されることです。 ほとんどの場合、これはあなたが望むものですが、それがどのように機能するかを知っておく価値があります(最近、これに関連するバグがありました)。

編集:

Npmの履歴のどの時点でこれが変更されたかはわかりませんが、npm run <script-name>が動作するようになりました(npm run-script <script-name>を行う必要はもうありません)。おそらくrun-scriptは引き続き機能します。期待していますが、試したことはありません。

36
tandrewnichols

Package.jsonをWindowsとUnixの両方で動作するように設定するにはどうすればよいですか?

もし、あんたが

  • windowsを使用する
  • -gグローバルインストールを嫌う

...これは実用的なソリューションです

"scripts": {
  "test": "node node_modules/mocha/bin/mocha.js"
},

  • nodeを前に置いても害はなく、Windowsでも役立ちます(設定しない限り、.js拡張子は必ずしもnodejus実行可能ファイルに登録されません。テキストエディターを開くと、IDEまたは(さらに悪い)Windowsスクリプトホスト、Internet Explorer…)
  • スクリプトを直接アドレス指定すると、グローバルインストールが不要になります。 (これが良い習慣であるかどうかを判断しない)
  • スラッシュは、Linuxでの実行を支援し(当然)、Windowsで動作します(このシナリオでは、Windowsの落とし穴も回避します。バックスラッシュを使用する場合は、二重にする必要があります。
15
Frank Nocke

グローバルソリューションを使用しないでください。Mochaのメンバー say に従うことをお勧めします。

"scripts": {  
    "test": "node_modules/.bin/mocha -w"
 },
10
igorludi

使用する npm i mocha --save-dev

これにより、モジュールが開発の依存関係として保存され、npmはscriptsオブジェクト内で使用される実行可能ファイルを自動的にセットアップします。 package.jsonで定義されたスクリプトの外部で実行可能ファイルを使用する場合、グローバルにインストールすることもできますが、パッケージのバージョンが異なる可能性があることに注意してください。

グローバルにインストールするだけの場合、他の人がテストを実行しようとしても満足しません(標準のnpm test

5
1j01

6.x以降の新しいnpmバージョンの新しい方法では、globalモードでmochaをインストールする必要はありません。

"scripts": { "test": "npx mocha" }

npxは、新しいnpmインストールで自動的にインストールされます。 node_modules/.binまたは$ PATHからmochaを検索します

参照: https://www.npmjs.com/package/npx

1
Bill