web-dev-qa-db-ja.com

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

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

私はnpm bundleコマンドですが、それは単にパッケージがインストールされているディレクトリを単に上書きするように思えます。

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

# Gemfile
gem "Rails", "3.0.3"

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

> bundle install

npmで似たようなことを達成するにはどうすればよいですか?

86

Npm 1.0の時点で(READMEファイル)の手順に従うとデフォルトで取得されるようになりました)、「バンドル」は分離されたものではなくなりました。 「。

そう:

  1. プロジェクトのルートに_package.json_ファイルを配置します
  2. そのファイルの深さをリストします

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

  4. require("express")と幸せになります。
145
isaacs

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


これを理解することは非常に困難でしたが、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;
10

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 rm thingを実行します。そしてもちろん、複数のバージョンをインストールして、必要なバージョンをアクティブにすることができます。

5
Alfred

私には、最も簡単な解決策はpackage.jsonファイルにprivateフラグ(先月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

2
Trevor Burnham

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

bundle installGemfile.lockを自動的に作成しますが、npm installnpm-shrinkwrapped.jsonを作成しません(存在する場合は使用します)。したがって、npm shrinkwrapを使用することを忘れないでください。

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

2
Colonel Panic

npmを使用してアプリを公開し、package.jsonファイルに依存関係をリストします。

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

パッケージ仕様: http://wiki.commonjs.org/wiki/Packages/1.

1
Dan Grossman