TL; DR:npm install
が変更されている場合、npmスクリプトを実行する前にpackage.json
を自動的に実行する方法はありますか?
package.json
を更新したブランチをプルまたはチェックアウトします。 npm run my-script
を実行します。 my-script
は、package.json
に新しく追加されたパッケージに依存しています。 my-script
は失敗します。なぜだろう。机を裏返す前に、念のためnpm install
を実行します。 my-script
は正常に実行されます。新しい机は必要ありません。
gradle
のようなビルド/タスクランナーツールは、タスクを実行する前に依存関係が最新であることを確認します。私は常にnpm
がそれを行わない(マイナーな)問題点でした。特に気に入らない2つの解決策を見つけました。
package.json
のnpmスクリプトに依存してコマンドを実行する代わりに、make
を使用して、次のトリックで統合された依存関係の追跡を利用します。
# Smart install: Only executes if package.json's
# modification date is later than node_module's
node_modules: package.json
npm install
@rm -f node_modules/.modified
@touch -m node_modules/.modified
install: node_modules
ソース: https://mattandre.ws/2016/05/make-for-hipsters/
問題は、スクリプトを実行するためにmake
に依存する必要があり、他のスクリプトを便利に参照したり、スクリプトを並行して実行したり(npm-run-all
)など、npmスクリプトの特定の利点を失う必要があることです。また、make
を知らない、または実行に問題がある場合(Windows)、他のユーザーと一緒に作業することは困難です。これは、node/npmエコシステムの外にある古いツールであり、このスマートインストールの利点だけではコストがかかりすぎます。
もう1つの方法は、post-merge
gitフックを追加することです。
問題は、このソリューションがリポジトリに対してローカルであり、簡単に共有できないことです。 npm install
は、gitマージでのみ自動的に実行されます。 package.json
を他の方法で変更した場合でも、npm install
の実行を覚えておく必要があります。確かに、それは実際にはマイナーなポイントです。それでも、スクリプトを実行する場合は、npm install
の実行についてまったく考えなくて済むのは素晴らしいことです。
ソース: https://davidwalsh.name/git-hook-npm-install-package-json-modified
次のような方法でpackage.json
を定義したいと思います。
{
"scripts": {
"pre-run": "npm-smart-install",
"my-script": "…"
},
"dependencies": {
"npm-smart-install": "1.0.0"
}
}
npm-smart-install
は、私が存在したいと思った架空のnpmパッケージです。 pre-run
は、架空のnpm-scriptsライフサイクルフックです。 npm run my-script
を実行し、最後にスクリプトを実行してからpackage.json
が変更されている場合は、npm install
を実行してからmy-script
を実行してください。
繰り返します:npm install
がnpmエコシステム外のツールに依存せずに変更されている場合、npmスクリプトを実行する前にpackage.json
を自動的に実行する方法はありますか?
これでパッケージは完了です。 ここ です。理想的なシナリオで指定したのとまったく同じ方法で使用できます。 npm install install-changed
を使用して、例のpre-run
のようにカスタムスクリプトに追加します。 npm install
が必要かどうかを判断し、必要に応じてそうする必要があります。
{
"scripts": {
"pre-run": "install-changed",
"my-script": "…"
},
プログラムでこれを行うこともできますが、これが必要になるとは思いません。
let installChanged = require('install-changed')
let isModified = installChanged.watchPackage()
上記の関数はまったく同じことを行います。さらに、便利なブール値も返します。