Q:

Npm postinstall only on development

I have npm module with following package.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"
  }
}

When I deploy my app to production I don't want install devDependecies so, I run npm install --production. But in this case prepublish script are called, but it doesn't need, because I use CDN links in production.
How to call postinstall script only after npm install but not after npm install --production?

A:

Newer npm (& Yarn) versions include support for the prepare script that is run after each install run but only in development mode. Also, the prepublish is deprecated. This should be enough:
{
  scripts: {
    "prepare": "bower install"
  }
}

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

A:

I think you cannot choose what scripts are run based on the --production argument.  What you can do, however, is supply a script which tests the NODE_ENV variable and only runs bower install if it's not "production".
If you are always in a unix-y environment, you can do it like this:
{ 
  scripts: {
    "prepublish": "[ \"$NODE_ENV\" != production ] && bower install"
  }
}

A:

This only works if you're on a unix-like environment: 
NPM sets an environment variable to "true" when install is run with --production. To only run the postinstall script if npm install was not run with --production, use the following code.
"postinstall": "if [ -z \"$npm_config_production\" ]; then node_modules/gulp/bin/gulp.js first-run; fi",

