nbyを使用して、rubygemsのbundlerのように必要なパッケージをインストールまたは更新する


88

私はバンドラーが大好きです。依存関係の管理に優れています。私はnpmが大好きです。ノードパッケージのインストールは簡単です。私はnodejsアプリを持っているので、アプリの依存関係を指定し、アプリを展開する場所にそれらを簡単にインストール/更新できるようにしたいと考えています。これは私がリリースしているライブラリではなく、本格的なウェブアプリです。

npm bundleコマンドは知っていますが、パッケージがインストールされているディレクトリをオーバーライドするだけです。

私はこの方法でバンドラーを使用することに慣れています:

# Gemfile
gem "rails", "3.0.3"

Rails v3.0.3およびその他の必要なGemがまだ存在しない場合にのみ、ホストマシンにインストールします。

> bundle install

npmで同様のことをするにはどうすればよいですか?


私の答えはあなたが知りたかったことではありませんか?
アルフレッド、

回答:


147

npm 1.0(READMEファイルの手順に従うとデフォルトで取得されるようになりました)以降、「バンドル」は分離されたものではなく、単に「動作する方法」です。

そう:

  1. package.jsonプロジェクトのルートにファイルを置く
  2. そのファイルにあなたの担当者をリストしてください

    { "name" : "my-project"
    , "version" : "1.0.0"
    , "dependencies" : { "express" : "1.0.0" } }
  3. npm install 引数なしでグローバルモードではなくこれを呼び出すため、すべてのdepをローカルにインストールします。

  4. require("express") そして幸せになる。

2
本番your_app/node_modules環境では、ローカルディレクトリをアプリディレクトリの外部のシンボリックリンクに変更することを強くお勧めします。デプロイするたびに各依存関係をダウンロード、ビルド、インストールする必要はありません。
ダニエルビアズリー

OK。package.jsonの更新を忘れた場合はどうなりますか?NPMがpackage.jsonではなく、コードで使用しているパッケージを検索するように強制する方法はありますか?
Pono、2011

4
これは正しくありません。NPMは上記のすべての依存関係をにインストールmy-project./node_modules/my-project/node_modulesます。./node_modules Anyoneにすべての依存関係をインストールする便利な方法があるかどうかはわかりませんか?
ダニエルビアズリー

@DanielBeardsleyそれはnpmがどのように機能するか私は思いません。その動作が見られ、再現できる場合は、npm githubページに問題を投稿してください。
isaacs 2011

2
@DanielBeardsleyに同意します。私はnpm 1.1.70でもその振る舞いに苦しんでいます
1

10

編集:これはnpmバージョン<1.0にのみ適用されます


これを理解することは非常に困難でしたが、NPMはこれを可能にします。

3つのコンポーネントが必要です

  1. リポジトリのサブディレクトリ(つまりdeps/
  2. package.json上記のディレクトリ内のファイルそのリストの依存関係
  3. index.js依存関係を必要とする上記のディレクトリ内のファイル

その想像Expressは、あなただけの依存性であります

deps / package.json

注:依存関係を変更するたびにバージョン番号を増やします

{
  "name": "myapp_dependencies",
  "version": "0.0.1",
  "engines": {
    "node": "0.4.1"
  },
  "dependencies":{
    "express": "2.0.0beta2"
  }
}

deps / index.js

export.modules = {
  express: require('express')
  //add more
}

これで、npmを使用して依存関係をインストールできるはずです。これを導入プロセスの一部にすることもできます

cd deps
npm install

次に、アプリコード内で、次のように特定のバージョンのExpressにアクセスできます。

var express = require('myapp_dependencies').express;

おかげで、これは私が今まで見た中で最高の方法です。ただし、require('express')deps / index.js のinは、最新のExpressバージョンをインポートするだけでなく、必ずしもインストールしたバージョンをインポートするのではないですか?私はnodeJS noobなので、我慢してください。
adamJLev 2011

いいえ、それはの魔法ですnpm install。インストールされたパッケージのディレクトリ内のシンボリックリンクを、依存するパッケージの正しいバージョンに追加します。依存関係パッケージが必要な場合、はrequire('express')最初にローカルディレクトリをチェックし、正しいバージョンのExpressへのシンボリックリンクを見つけます。
ダニエルビアズリー

5

Isaacs(author npm)ブログのこれら2つの記事を読んでください。私はそれらが本当に良いと思います、そして私はあなたの目標を達成する方法をあなたに教えると信じています:

  1. http://blog.izs.me/post/1675072029/10-cool-things-you-probably-didnt-realize-npm-could-do
  2. http://foohack.com/2010/08/intro-to-npm/

リンク#1(ポイント#11)はこれを説明していると思います:

11:すべての依存関係をパッケージ自体にバンドルする

npm bundleコマンドを使用すると、npmはすべての依存関係をパッケージのnode_modulesフォルダーに配置します。しかし、それだけではありません。

レジストリにないものに依存したい場合は、それを実行できます。これを行うだけです:

npm bundle install http://github.com/whoever/whatever/tarball/master これにより、そのtarballのコンテンツがバンドルにインストールさ れ、依存関係として一覧表示できます。パッケージがインストールされます。

これは、何か独自のフォークがあり、名前を変更したくない場合にも便利です。

実際、バンドルではほとんどすべてのnpmコマンドを実行できます。内容を確認するには、npm bundle lsを実行します。何かを削除するには、npm bundle rmthingを実行します。そしてもちろん、複数のバージョンをインストールして、必要なバージョンをアクティブ化できます。


これは私が探していたものではありませんが、便利です。おそらく、説明を追加する必要があります。アプリを展開するたびに、アプリが依存するNPMパッケージを(移行先マシンで)自動的にインストールまたは更新する方法を探しています。npm bundleすべての依存関係をデフォルト以外の特定のディレクトリに収集するために使用されているように見えます。bundle installbundlerルビーの場合)と同様に機能する独自のソリューションを思いつくと思います
Daniel Beardsley

1
npmバージョン1.0 以降、メモnpm bundleは削除されました。代わりに、npm installパッケージ名なしでコマンドを使用すると、package.jsonが読み取られ、必要なパッケージがプルダウンされます。
Arthur Maltson、2011年

2

Npmバージョン1.1.2以降、に類似したnpm shrinkwrapnpm-shrinkwrapped.jsonファイルを作成する新しいコマンドがありますGemfile.lock。ソフトウェアの腐敗を防ぐために、1つを作成することが重要です(Bundlerの理論的根拠を参照))。特にNodejsには非常に動きの速いコミュニティがあります。

一方でbundle install作成しGemfile.lock、自動的にnpm install作成されることはありませんnpm-shrinkwrapped.json(それが存在する場合、それを使用します)。したがって、使用することを覚えておく必要がありますnpm shrinkwrap

http://blog.nodejs.org/2012/02/27/managing-node-js-dependencies-with-shrinkwrap/で完全なガイドを読む


2

最も簡単な解決策はpackage.jsonprivateフラグ(先月npmに追加された)がに設定されたファイルを使用することですtrue。このようにして、プロジェクトの依存関係を実行npm installまたはnpm bundle取得できますが、非公開プロジェクトを誰かが誤って公開することを防ぎます。

次に例を示しpackage.jsonます。

{
"name": "yourProject"
,"version": "1.0.0"
,"dependencies": { "express" : ">=2.1.0" }
,"private": true
}

実行していない場合は、実行npm installするとexpressローカルシステムにインストールされます。実行npm publishするとエラーが発生します"private": true

あなたとあなたのチームはバージョンタグを内部的に使用して、依存関係の変化を経時的に追跡できます。依存関係を変更するたびに、バージョンをバンプします。インストールしたバージョンを確認するには、を使用しますnpm ls installed


true文字列は真の値(つまり、!!"false" === true)であるため、引用しないでください。それが機能しているだけだと思います。
Camilo Martin、

1

アプリを公開する npm同様にし、package.jsonファイルにその依存関係をリストします。

誰かがを使用npmしてパッケージをインストールするときに、npmその依存関係を解決します。

パッケージスペック:http : //wiki.commonjs.org/wiki/Packages/1.0


ええ、でもこれはオープンソースではないウェブアプリです。アプリの公開を含まないアイデアがある場合は、回答を編集するか、別の回答を作成してください。
Daniel Beardsley

1
次に、ユーザーがnpmアプリをインストールする前にインストールに使用できる「myapp-dependencies」のようなパッケージを公開します。gemnode.jsに相当するものは他にないと思います。
Dan Grossman、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.