グローバルとローカルでgulpをインストールする必要があるのはなぜですか?


292

gulpに関する2つのマニュアルによると、最初にgulpをグローバルに(-gフラグを付けて)インストールし、次にローカルにもう一度インストールする必要があります。なぜこれが必要なのですか?


12
プロジェクト独自の「はじめに」ページでも同じことが言えます。(理由も
明記

11
npmがローカルパッケージと同じバージョンであるグローバルにインストールされた依存パッケージを使用できることを願っています。プロジェクトディレクトリごとに5MBのグループスタッフ:/
Ciantic

@Cianticありませんguarantes、しかし...➪ stackoverflow.com/a/25879563/444255
フランクNocke

回答:


238

ツールをグローバルにインストールする場合、ユーザーはノードプロジェクトの外部を含む任意の場所でコマンドラインユーティリティとして使用します。ノードプロジェクトのためのグローバル・インストールは、悪い彼らは、展開をより困難にするため。

npm 5.2以降

npxバンドルされているユーティリティは、npm 5.2この問題を解決します。これにより、グローバルにインストールされたユーティリティと同様にローカルにインストールされたユーティリティを呼び出すことができます(ただし、コマンドはで始める必要がありますnpx)。たとえば、ローカルにインストールされたを呼び出すeslint場合は、次のようにできます。

npx eslint .

npm <5.2

scriptpackage.jsonのフィールドで使用npmするnode_modulesと、ツールとグローバルにインストールされたモジュールが検索されるため、ローカルインストールで十分です。

したがって、(package.jsonで)満足している場合:

"devDependencies": {
    "gulp": "3.5.2"
}
"scripts": {
    "test": "gulp test"
}

等で実行するとnpm run test、グローバルインストールはまったく必要ありません。

どちらの方法もsudo必要ないため、プロジェクトをセットアップするのに役立ちます。またgulp、package.jsonでバージョンがバンプされたときに更新されるため、プロジェクトで開発するときに全員が同じバージョンのgulpを使用することになります。

補遺:

グローバルで使用した場合、gulpにはいくつかの異常な動作があるようです。グローバルインストールとして使用される場合、gulpはローカルにインストールされたgulpを探し、制御を渡します。したがって、gulpグローバルインストールが機能するには、gulpローカルインストールが必要です。上記の答えはまだ残っています。ローカルインストールは、グローバルインストールより常に望ましい方法です。


3
はい、ただしインターネットにアクセスできない場合はどうなりますか?グローバルにインストールされていない場合、gulpをどのように使用できますか?
IGRACH 2014

3
@IGRACH上記のスクリプトはインターネット接続を使用していません。package.jsonのスクリプトフィールドを使用せずに同じことを行う場合は、を使用します./node_modules/.bin/gulp
キューバイト2014

1
のエイリアスを定義gulpしたcoffeeので、コマンドはノードプロジェクトのルート(例:)から機能しますalias gulp="node_modules/.bin/gulp"。このように、コマンドは必要に応じて簡単に使用でき、グローバル/ローカルバージョンの競合は発生しません。
vesse 2014

@qubyteに感謝!ローカルにインストールすることは、一般的には良い習慣だと思います。もう1つ質問があったので、私の心の整理にご協力ください。ローカルにインストールせずにGulpのドキュメントで提案されているように、グローバルにインストールしてみました。そのため、実行しようとするgulpと、次のエラーメッセージが表示されますLocal gulp not found in ...。私が理解している限り、まずローカルのnode_modulesを調べ、見つからない場合はグローバルにインストールされているモジュールを調べます。ありがとう!
yeelan 2015

1
補遺を追加しました。うまくいけば、それはガックの奇妙さをカバーします。
Qubyteの

82

TLDR; ここだ理由

これが機能する理由は、のローカルにインストールされたバージョンを使用してgulpを実行しようとするためですここを参照してください。したがって、gulpのグローバルおよびローカルインストールの理由。gulpfile.jsgulp

基本的に、gulpローカルにインストールする場合、スクリプトはに含まれてPATHいないgulpため、入力してシェルがコマンドを見つけることを期待することはできません。グローバルディレクトリをインストールすると、グローバルディレクトリがパス上にある可能性が最も高いため、gulpスクリプトが実行されます。PATHnode/bin/

ただし、ローカルの依存関係を尊重gulpするには、ローカルにインストールされたバージョンのそれ自体を使用してを実行しgulpfile.jsます。


1
〜/ binは、ユーザーごとのバイナリのUnix規約であり、多くのOSではデフォルトでPATHに含まれています。gulpはそこからバイナリをリンクできるはずです。
mikemaccana 2016

2
言い換えれば、あなたのグローバルにインストールされたgulpパッケージはnode_modules/.bin/gulpパスを入れるために必要です。ストレージは安価ですが、シンボリックリンクをシミュレートするためにMBを破棄することは、IMOの純粋なだらしさです。
ntd '14年

79

グローバルにgulpローカルにインストールされた

npm link gulp

1
ローカルインストールを使用するのが最適であることはわかっていますが、インストールできない、またはインストールしたくない場合もあります(専用CIサーバーがグローバルにgulpをインストールし、コミットごとに再インストールしていると想像してください)。 。とにかく、+ 1について言及しnpm linkます。
gion_13 2015

1
あなたがそこで何をしたかわかる。それは賢いです。
deepelement 2017

これは質問に答えようとするものではありません
mikemaccana

1
いいえ、無効にするだけです。
Berislav Lopac 2018

67

なぜgulpをグローバルおよびローカルにインストールする必要があるの」という質問は、次の2つの質問に分類できます。

  1. すでにグローバルにインストールしているのに、ローカルでgulpをインストールする必要があるのはなぜですか?

  2. ローカルにgulpをインストールしているのに、なぜgulpをグローバルにインストールする必要があるのですか?

他のいくつかは、これらの質問に対する優れた回答を単独で提供していますが、情報を統合された回答に統合することが有益だと思いました。

すでにグローバルにインストールしているのに、ローカルでgulpをインストールする必要があるのはなぜですか?

gulpをローカルにインストールする理由には、いくつかの理由があります。

  1. プロジェクトの依存関係をローカルに含めると、使用されるgulp(または他の依存関係)のバージョンが元々意図したバージョンになることが保証されます。
  2. require()を使用する場合、Nodeはデフォルトでグローバルモジュールを考慮しません(スクリプトにgulpを含める必要があります)。最終的に、これはグローバルモジュールへのパスがデフォルトでNODE_PATHに追加されないためです。
  3. Node開発チームによると、ローカルモジュールはより速くロードされます。これがなぜなのかは言えませんが、これは開発(つまりdev依存関係)よりも本番(つまりランタイム依存関係)でのノードの使用に関連しているようです。これは正当な理由だと思います。ローカルモジュールとグローバルモジュールをロードすることで得られる速度のマイナーな利点を気にかける人がいるかもしれませんが、この理由で眉を上げてもかまいません。

ローカルにgulpをインストールしているのに、なぜgulpをグローバルにインストールする必要があるのですか?

  1. gulpをグローバルにインストールする根拠は、実際には、システムパス内でgulp実行可能ファイルが自動的に見つかるという便利さです。

ローカルでのインストールを回避するにはnpm link [package]、を使用できますが、linkコマンドとinstall --globalコマンドはこの--save-devオプションをサポートしていないようです。つまり、gulpをグローバルにインストールして、目的のバージョンを簡単に追加する簡単な方法がないようです。ローカルのpackage.jsonファイル。

結局のところ、特にgrunt、gulp、jshintなどの開発ツールの場合は、グローバルモジュールを使用して、すべてのプロジェクトに共通のツールのインストールを複製する必要がないようにする方が理にかなっていると思います。残念ながら、穀物に逆らうと、ツールと少し戦うことになるようです。


7
質問には2つのポイントがあることを指摘するためにインターネット全体で最初の人物であることの+1。世界中のほとんどの人が「gulpをローカルにインストールしているのに、なぜグローバルにインストールする必要があるのですか?」私が知りたかったのは、「すでにグローバルにインストールしているのに、なぜローカルでgulpをインストールする必要があるのか​​」ということでした。
Nathan JB

10
この質問がそのような入念な説明を必要とするという事実は、これが単に論理的に機能する方法ではないことを意味します。プロジェクトごとに同じツールを何度もインストールする必要はありません。
Kokodoko

4
あなたの答えはとても感情的ではありません。これはすごい*******ばかげているように見えるので、鉱山は80%の不名誉を持っていたでしょう。ツールの観点からはローカルインストールの理論はおそらく正しいですが、OSの観点とパッケージマネージャーの観点からはこれはあまりにも奇妙で、言葉を見つけることができません。NPM / gulpの人はどんな薬を服用していますか?!?誰もが同意しない場合は、dpkg、yum、pacman、coなどのシステムパッケージマネージャーをご覧ください。作業。
JepZ

2
@JepZそれはすごく奇妙なだけですが、これを強制するノードやnpmには何もありません。また、プロジェクトでgulpの特定のバージョンを維持することは、gulpの担当者が定期的にパッチバージョンを破壊する場合などにのみ意味があります。他のビルドツールは通常、グローバルインストールです。しかし、まあ。誓うためだけにここに。
Stoffe 2017

2
コミュニティが糸を使用することに移行したため、これは実際には問題ではありません:)
Derek Greer

8

技術的にnode_modulesは、ローカルインストールのフォルダがにある場合は、グローバルにインストールする必要はありませんPATH。一般的にこれは良い考えではありません。

または、npm test参照のgulp場合は入力するだけでnpm testローカルgulpが実行されます。

私はgulpをグローバルにインストールしたことがありません-それは悪い形だと思います。


3
パスに入れるよりも良いアプローチは、NPMスクリプトを使用することです
Jay

2

私の問題がgulpをローカルにのみインストールすることに直接関連していたかどうかはわかりません。しかし、私たちはたくさんの依存関係を自分でインストールする必要がありました。これは「巨大な」package.jsonにつながり、gulpをローカルにのみインストールすることが本当に素晴らしいアイデアであるかどうかはわかりません。ビルド環境のために、そうする必要がありました。しかし、絶対に必要でなければ、gulpをグローバルにインストールすることはお勧めしません。次のブログ投稿で説明されているように、同様の問題に直面しました

すべての開発者がgulpをグローバルにインストールしているため、これらの問題はローカルマシンの開発者には起こりません。ビルドシステムでは、説明した問題がありました。誰かが興味を持っているなら、私はこの問題をより深く掘り下げることができます。しかし、現時点では、gulpをローカルにのみインストールするのは簡単な方法ではないことをお伝えしたいと思います。


はい、お願いします。この問題について詳しく説明します。
ケノーブ2016

1

ここで見たことがないからといって、MacOSまたはLinuxを使用している場合は、これを(bashrcなどの)PATHに追加することをお勧めします。

node_modules/.bin

この相対パスエントリを使用すると、ノードプロジェクトのルートフォルダーにいる場合、「グローバルインストール」npm runなどを気にすることなく、コマンドラインツール(eslint、gulpなど)を実行できます。

これを行ったら、モジュールをグローバルにインストールしたことはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.