узел: как избежать установки глобальных пакетов - PullRequest
2 голосов
/ 11 марта 2019

Я ищу шаблон, чтобы избежать необходимости глобальных пакетов при работе с узлом, я хотел бы установить все, что мне нужно, с помощью 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, в моем проекте нет файла 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 требует больше 10 секунд для установки jest каждый раз, когда я запускаю npm run test

Итак, каков будет правильный путь для достижения этого? O как я могу сказать npm установить jest в node_modules / .bin и использовать его, когда я ссылаюсь на него в своих скриптах?

1 Ответ

2 голосов
/ 11 марта 2019

Кажется, что это было проще, чем ожидалось, мне просто нужно было выдать:

npm install --only=dev

похоже, что по умолчанию npm не будет устанавливать зависимости dev


Я провел еще пару тестов, играя с переменной NODE_ENV, и после ее сброса npm install, кажется, устанавливает также devDependencies вместе с jest в node_modules / .bin / jest. Кажется, как-то предполагалось, что я работаю в производственном режиме.


Еще одна уловка, которую я научился избегать установки глобальных зависимостей, - это установить ее с --save-dev, а затем добавить скрипт для запуска с npm run. Например, чтобы избежать установки jest в глобальном масштабе, но при этом использовать его из командной строки, вам необходимо:

npm install jest --save-dev

Затем добавьте следующее в ваш package.json

scripts: {
  "jest": "jest"
}

И затем вы можете запустить его из командной строки с помощью npm run jest. Чтобы передать параметры из командной строки, вы должны добавить «-» перед параметрами, например: npm run jest -- --coverage. Или вы можете просто ввести npx jest --coverage, если установлен, npx будет использовать jest из node_modules / .bin. (проверьте это для получения дополнительной информации)

Кстати, этот ответ на похожий вопрос может быть полезен

...