web-dev-qa-db-ja.com

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

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

284
Stepan Suvorov

ツールをグローバルにインストールするときは、ノードプロジェクト以外の場所を含め、どこでもコマンドラインユーティリティとしてユーザーが使用します。ノードプロジェクトのグローバルインストールは bad です。これはデプロイがより困難になるためです。

npm 5.2以上

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

npx eslint .

npm <5.2

あなたの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ローカルインストールが必要です。上記の答えはまだ立っています。ローカルインストールは、グローバルインストールよりも常に優先されます。

231
qubyte

TLDR;これが なぜ

これがうまくいく理由は、gulpがローカルにインストールされたバージョンのgulpを使ってgulpfile.jsを実行しようとするからです。 here を見てください。それゆえ、gulpのグローバルおよびローカルインストールの理由です。

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

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

80
Dwayne Crooks

グローバルにインストールされたgulpをローカルにリンクすることができます。

npm link gulp
78
Berislav Lopac

質問 " なぜグローバルにそしてローカルにgulpをインストールする必要があるのですか? "は次の2つの質問に分けられます:

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

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

他の何人かはこれらの質問に対する優れた回答を単独で提供してきましたが、私は情報を統一された回答にまとめることが有益であると思いました。

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

Gulpをローカルにインストールする理由はいくつかの理由から成り立っています。

  1. プロジェクトの依存関係をローカルに含めることで、使用されているgulpのバージョン(または他の依存関係)が元々意図されているバージョンであることを確認できます。
  2. Nodeはrequire()を使うとき、デフォルトではグローバルモジュールを考慮しません(あなたはスクリプトの中にgulpを含める必要があります)。結局、これはグローバルモジュールへのパスがデフォルトでNODE_PATHに追加されないからです。
  3. Node開発チームによると、ローカルモジュールはより速くロードされます。これがなぜなのか私には言えませんが、これは開発(すなわちdev依存)よりもプロダクション(すなわちランタイム依存)でのノードの使用により関連しているように思われるでしょう。ローカルモジュールとグローバルモジュールのどちらを使用してもマイナーなスピード上の利点が得られるのではないかと心配する人もいるかもしれませんが、これは正当な理由であると思います。

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

  1. Gulpをグローバルにインストールするための理論的根拠は、実際にはgulp実行可能ファイルをシステムパス内で自動的に見つけることの便利さにすぎません。

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

最終的には、特にgrunt、gulp、jshintなどの開発ツールの場合には、グローバルモジュールを使用してすべてのプロジェクトにわたって共通ツールのインストールを複製する必要性を回避することがより理にかなっていると思います。あなたが穀物に反対するとき、あなたは道具を少し戦うことになっているようです。

63
Derek Greer

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

あるいは、npm testgulpを参照している場合は、npm testと入力するだけでローカルグループが実行されます。

私はgulpを世界規模でインストールしたことは一度もない - それは悪い形式だと思う。

8
robrich

私たちの問題が直接ローカルだけでgulpをインストールすることに直接関連していたのかどうかはわかりません。しかし、私たちは自分自身でたくさんの依存関係をインストールしなければなりませんでした。これは "巨大な" package.jsonにつながりますが、gulpをローカルにのみインストールするのが本当に良い考えかどうかはわかりません。私たちの構築環境のためにそうしなければなりませんでした。しかし、絶対に必要というわけではないのであれば、gulpをグローバルにインストールすることはお勧めできません。次のような問題に直面しました。 blog-post

これらの問題はどれも、彼らのすべてがグローバルにgulpをインストールしたので、彼らのローカルマシン上の我々の開発者の誰にも起こらない。ビルドシステムでは、説明した問題がありました。誰かが興味を持っているなら、私はこの問題についてもっと深く掘り下げることができました。しかし今、私はgulpをローカルにのみインストールするのが簡単な方法ではないことを述べたいと思いました。

2
tschoartschi

私がここでそれを見たことがないという理由だけで、あなたがMacOSかLinux上にいるならば、私はあなたがあなたのPATHにこれを追加することを勧めます(あなたのbashrcなどで):

node_modules/.bin

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

私がこれをしたら、私は世界的にモジュールをインストールしたことがない。

0
Elliot Nelson