Подтвердить что ты не робот

Npm postinstall только при разработке

У меня есть модуль npm со следующим пакетом. json

{
  "name": "my-app",
  "version": "0.0.0",
  "scripts": {
    "prepublish": "bower install",
    "build": "gulp"
  },
  "dependencies": {
    "express": "~4.0.0",
    "body-parser": "~1.0.1"
  },
  "devDependencies": {
   "gulp": "~3.6.0",
   "bower": "~1.3.2"
  }
}

Когда я развертываю свое приложение для производства, я не хочу устанавливать devDependecies, поэтому я запускаю npm install --production. Но в этом случае вызываются prepublish script, но это не нужно, потому что я использую ссылки CDN в процессе производства.

Как вызвать postinstall script только после npm install, но не после npm install --production?

4b9b3361

Ответ 1

Более новые версии npm (& Yarn) включают поддержку сценария prepare, который запускается после каждого запуска install, но только в режиме разработки. Кроме того, prepublish устарела. Этого должно быть достаточно:

{
  scripts: {
    "prepare": "bower install"
  }
}

Docs: https://docs.npmjs.com/misc/scripts

Ответ 2

Я думаю, вы не можете выбрать, какие сценарии выполняются на основе аргумента --production. Однако вы можете использовать script, который проверяет переменную NODE_ENV и запускает только bower install, если это не "производство".

Если вы всегда находитесь в среде unix-y, вы можете сделать это следующим образом:

{ 
  scripts: {
    "prepublish": "[ \"$NODE_ENV\" != production ] && bower install"
  }
}

Ответ 3

Это работает, только если вы находитесь в среде, подобной unix:

NPM устанавливает переменную окружения в "true", когда установка выполняется с --production. Чтобы запустить postinstall script, если npm-установка не была запущена с --production, используйте следующий код.

"postinstall": "if [ -z \"$npm_config_production\" ]; then node_modules/gulp/bin/gulp.js first-run; fi",

Ответ 4

Я работаю с окнами, osx и linux, поэтому для решения этой проблемы я использую специальное решение NON:

В обработчике postinstall я запускаю js script, который проверяет переменную process.env.NODE_ENV и выполняет работу.

в моем конкретном случае я должен выполнить задачу gulp только в разработке env:

часть пакета .json

"scripts": {
  "postinstall": "node postinstall"
}

все postinstall.js script

if (process.env.NODE_ENV === 'development') {
  const gulp = require('./gulpfile');
  gulp.start('taskname');
}

последняя строка gulpfile.js

module.exports = gulp;

важно экспортировать gulp из gulpfile.js, потому что все задачи находятся в этом конкретном экземпляре gulp.

Ответ 5

Решение, которое в меньшей степени зависит от unix-характера вашей оболочки:

  "scripts": {
    "postinstall": "node -e \"process.env.NODE_ENV != 'production' && process.exit(1)\" || echo do dev stuff"
  },

Ответ 6

Я использую if-env модуль. Это менее подробный.

PS: я еще не тестировал его на окнах.

Установить с помощью:

npm i if-env

чем в package.json скриптах:

"postinstall-production": "echo \"production, skipping...\"",
"postinstall-dev": "echo \"doing dev exclusive stuff\"",
"postinstall": "if-env NODE_ENV=production && npm run postinstall-production || npm run postinstall-dev"

Ответ 7

Приземлился здесь, потому что у меня была такая же проблема. Закончилось решением, которое проверяет наличие пакета в node_modules, который, как я знаю, должен быть доступен только в разработке.

{
  "scripts": {
    "postinstall": "bash -c '[ -d ./node_modules/@types ] && lerna run prepare || echo No postinstall without type info'" 
  }
}

С концептуальной точки зрения это прекрасно работает для меня, поскольку скрипты подготовки, называемые lerna, в основном предназначены для компиляций ts-to-js.

Ответ 8

У меня есть более общая проблема - где я хочу пропустить запуск сценария postinstall при локальной (прямой) установке - например, когда я разрабатываю пакет и запускаю yarn add --dev my-new-dependency.

Это то, что я придумал. Работает как с npm, так и с пряжей.

postinstall.js:

const env = process.env;
if (
    // if INIT_CWD (yarn/npm install invocation path) and PWD
    // are the same, then local (dev) install/add is taking place
    env.INIT_CWD === env.PWD ||
    // local (dev) yarn install may have been run
    // from a project subfolder
    env.INIT_CWD.indexOf(env.PWD) === 0
) {
    console.info('Skipping 'postinstall' script on local installs');
}
else {
    // do post-installation things
    // ...
}

package.json:

"script": {
    "postinstall": "node postinstall.js",
    ...