gulp に関する2つのマニュアルでは、最初にgulpをグローバルに(-gフラグを付けて)インストールしてから、もう一度ローカルにインストールする必要があると説明しています。なぜこれが必要なのですか?
ツールをグローバルにインストールするときは、ノードプロジェクト以外の場所を含め、どこでもコマンドラインユーティリティとしてユーザーが使用します。ノードプロジェクトのグローバルインストールは bad です。これはデプロイがより困難になるためです。
npx
5.2
にバンドルされている npm
ユーティリティは、この問題を解決します。これを使えば、グローバルにインストールされたユーティリティのようにローカルにインストールされたユーティリティを呼び出すことができます(ただし、コマンドをnpx
で始める必要があります)。たとえば、ローカルにインストールされたeslint
を起動したい場合は、次のようにします。
npx eslint .
あなたのpackage.jsonのscript
フィールドで使われるとき、npm
はツールとグローバルにインストールされたモジュールをnode_modules
で検索するので、ローカルインストールは十分です。
それで、もしあなたが(あなたのpackage.jsonの中で)満足しているならば:
"devDependencies": {
"gulp": "3.5.2"
}
"scripts": {
"test": "gulp test"
}
などとnpm run test
で実行しているなら、あなたはグローバルインストールをまったく必要とするべきではありません。
Sudo
は必要ないので、どちらの方法もあなたのプロジェクトで人々を立ち上げるのに便利です。それはまた、バージョンがpackage.jsonにぶつかったときにgulp
が更新されることを意味しているので、あなたのプロジェクトで開発するときは誰もが同じバージョンのgulpを使用するでしょう。
Gulpは世界的に使用されたとき、いくつかの異常な振る舞いをしているようです。グローバルインストールとして使用されるとき、gulpは制御を渡すためにローカルにインストールされたgulpを探します。そのため、gulpグローバルインストールが機能するにはgulpローカルインストールが必要です。上記の答えはまだ立っています。ローカルインストールは、グローバルインストールよりも常に優先されます。
TLDR;これが なぜ :
これがうまくいく理由は、
gulp
がローカルにインストールされたバージョンのgulp
を使ってgulpfile.js
を実行しようとするからです。 here を見てください。それゆえ、gulpのグローバルおよびローカルインストールの理由です。
基本的に、gulp
をローカルにインストールすると、スクリプトはPATH
に含まれないため、gulp
と入力してシェルがコマンドを見つけることを期待できません。グローバルにインストールすることで、グローバルのnode/bin/
ディレクトリがあなたのパス上にある可能性が最も高いので、gulp
スクリプトがあなたのPATH
に入ります。
しかし、あなたのローカルな依存関係を尊重するために、gulp
はローカルにインストールされたそれ自身のバージョンを使ってgulpfile.js
を実行します。
グローバルにインストールされたgulp
をローカルにリンクすることができます。
npm link gulp
質問 " なぜグローバルにそしてローカルにgulpをインストールする必要があるのですか? "は次の2つの質問に分けられます:
すでにグローバルにインストールしているのになぜgulpをローカルにインストールする必要があるのですか?
すでにローカルにインストールしているのに、なぜgulpをグローバルにインストールする必要があるのですか?
他の何人かはこれらの質問に対する優れた回答を単独で提供してきましたが、私は情報を統一された回答にまとめることが有益であると思いました。
すでにグローバルにインストールしているのになぜgulpをローカルにインストールする必要があるのですか?
Gulpをローカルにインストールする理由はいくつかの理由から成り立っています。
すでにローカルにインストールしているのに、なぜgulpをグローバルにインストールする必要があるのですか?
ローカルでインストールするのを避けるためにnpm link [package]
を使うことができますが、linkコマンドとinstall --global
コマンドは--save-dev
オプションをサポートしていないようです。つまり、gulpをグローバルにインストールしてどんなバージョンを追加するのも簡単ではないようです。ローカルのpackage.jsonファイルにあります。
最終的には、特にgrunt、gulp、jshintなどの開発ツールの場合には、グローバルモジュールを使用してすべてのプロジェクトにわたって共通ツールのインストールを複製する必要性を回避することがより理にかなっていると思います。あなたが穀物に反対するとき、あなたは道具を少し戦うことになっているようです。
技術的には、ローカルインストールのnode_modules
フォルダがPATH
にある場合は、グローバルにインストールする必要はありません。一般的にこれは良い考えではありません。
あるいは、npm test
がgulp
を参照している場合は、npm test
と入力するだけでローカルグループが実行されます。
私はgulpを世界規模でインストールしたことは一度もない - それは悪い形式だと思う。
私たちの問題が直接ローカルだけでgulpをインストールすることに直接関連していたのかどうかはわかりません。しかし、私たちは自分自身でたくさんの依存関係をインストールしなければなりませんでした。これは "巨大な" package.jsonにつながりますが、gulpをローカルにのみインストールするのが本当に良い考えかどうかはわかりません。私たちの構築環境のためにそうしなければなりませんでした。しかし、絶対に必要というわけではないのであれば、gulpをグローバルにインストールすることはお勧めできません。次のような問題に直面しました。 blog-post
これらの問題はどれも、彼らのすべてがグローバルにgulpをインストールしたので、彼らのローカルマシン上の我々の開発者の誰にも起こらない。ビルドシステムでは、説明した問題がありました。誰かが興味を持っているなら、私はこの問題についてもっと深く掘り下げることができました。しかし今、私はgulpをローカルにのみインストールするのが簡単な方法ではないことを述べたいと思いました。
私がここでそれを見たことがないという理由だけで、あなたがMacOSかLinux上にいるならば、私はあなたがあなたのPATHにこれを追加することを勧めます(あなたのbashrcなどで):
node_modules/.bin
この相対パスエントリを使用すると、任意のノードプロジェクトのルートフォルダにいる場合は、「グローバルインストール」やnpm run
などを気にせずに任意のコマンドラインツール(eslint、gulpなど)を実行できます。
私がこれをしたら、私は世界的にモジュールをインストールしたことがない。