3

ノードで作業するときにグローバルパッケージの必要性を回避するためのパターンを探しています。必要なものをすべてインストールしてから、グローバルパッケージをインストールせずにnpm installすべてのコマンドを実行したいと思います。npm run xxx

たとえば、テストを実行するように jest を構成しました。

これらは私のpackage.jsonの依存関係です:

[...]
},
"author": "",
"license": "ISC",
"dependencies": {
  "@types/express": "^4.16.1",
  "@types/node": "^11.10.5",
  "express": "^4.16.4",
  "ts-node-dev": "^1.0.0-pre.32",
  "typescript": "^3.3.3333"
},
"devDependencies": {
  "@types/jest": "^24.0.9",
  "@types/supertest": "^2.0.7",
  "jest": "^24.3.1",
  "nodemon": "^1.18.10",
  "supertest": "^4.0.0",
  "ts-jest": "^24.0.0"
}
[...]

これらは私が設定したいくつかのスクリプトです:

[...]
"scripts": {
  "test": "jest --coverage",
  "tsc": "tsc",
  "watch": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts"
},
[...]

しかし、発行npm run testすると、次のエラーが発生します。

$ npm run test
> ci-test@0.0.1 test /home/sas/devel/apps/vue/ci-test
> jest --coverage
sh: 1: jest: not found
npm ERR! file sh
[...]

jest をグローバルにインストールすると、npm install -g jestすべて正常に動作しますが、それはまさに私が避けようとしているものです。

私が行ったいくつかの仮定は、間違っている可能性があります。

  • スクリプトを実行するとき、ノードは最初に node_modules/.bin でコマンドを検索します (ローカルにインストールされたパッケージを使用するため)

  • npm installすべてのコマンドラインコマンドを発行すると、node_modules/.bin にインストールされます

devDependencies に jest があっても、プロジェクトに node_modules/.bin/jest ファイルがないため、この最後のものは機能しません。

$ ls node_modules/.bin/
acorn  cdl        esgenerate  esvalidate            is-ci  json5    loose-envify  mime    nodetouch  parser  semver      sshpk-sign    strip-indent  watch
atob   escodegen  esparse     import-local-fixture  jsesc  js-yaml  marked        mkdirp  nopt       rc      sshpk-conv  sshpk-verify  uglifyjs

一方、回避策として、次のように動作するようです。

"scripts": {
  "test": "npx jest --coverage",

しかし、実行するたびにnpxがjestをインストールするのに10秒以上かかりますnpm run test

それで、それを達成する正しい方法は何ですか?npm に jest を node_modules/.bin にインストールし、スクリプトで参照するときにそれを使用するように指示するにはどうすればよいですか?

4

1 に答える 1