web-dev-qa-db-ja.com

開発時のみのNPMポストインストール

私は次のpackage.jsonを持つnpmモジュールを持っています

{
  "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スクリプトが呼び出されますが、本番環境ではCDNリンクを使用しているため、必要ありません。

ポストインストールスクリプトをnpm installの後にのみ呼び出し、npm install --productionの後には呼び出せない方法

33
just-boris

新しいnpm(&ヤーン)バージョンには、各prepare実行後に実行されるinstallスクリプトのサポートが含まれますが、開発モードでのみ実行されます。また、prepublishは非推奨です。これで十分です:

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

ドキュメント: https://docs.npmjs.com/misc/scripts

14
mgol

--production引数に基づいて実行するスクリプトを選択することはできないと思います。ただし、できることは、NODE_ENV変数をテストし、_bower installが「製品」でない場合にのみ実行するスクリプトを提供することです。

常にunix-y環境にいる場合は、次のように実行できます。

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

これは、UNIXのような環境を使用している場合にのみ機能します。

NPMは、-productionを指定してインストールを実行すると、環境変数を「true」に設定します。 npm installが--productionで実行されなかった場合にのみpostinstallスクリプトを実行するには、次のコードを使用します。

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

私はWindows、OSX、Linuxを使用しているので、この問題を解決するために非環境固有のソリューションを使用します。

postinstallハンドラーで、process.env.NODE_ENV変数をチェックして作業を行うjsスクリプトを実行します。

私の特定のケースでは、開発環境でのみgulpタスクを実行する必要があります。

package.jsonの一部

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

すべてのpostinstall.jsスクリプト

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

gulpfile.jsの最後の行

module.exports = gulp;

すべてのタスクはその特定のgulpインスタンス内にあるため、gulpfile.jsからgulpをエクスポートすることが重要です。

10
Giovanni Bruno

シェルのUNIXの性質にあまり依存しないソリューション:

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

もっと一般的な問題があります-ローカル(直接)インストールでの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",
    ...
0
Már Örlygsson

私が同じ問題を抱えていたので、ここに着陸しました。最終的には、node_modulesの下にパッケージが存在するかどうかをテストするソリューションができましたが、これは開発でのみ使用できるはずです。

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

ここではlernaによって呼び出される準備スクリプトが主にts-to-jsコンパイル用であるため、これは概念的にはうまく機能します。

0

if-env モジュールを使用しています。冗長ではありません。

[〜#〜] ps [〜#〜]:I Windowsではまだテストしていません。

インストール:

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"
0
JacopKane