9301


`npm install -g
rx`でrxをインストールしたのですが、`require("rx")`でmoduleを読み込もうとすると下記のようなErrorが起こります。  
`npm install -g` は `coffee` などのコマンド用の場所なのでしょうか?  
環境はiojs v1.7.1, npm v2.7.6です。

[code]

    
    Error: Cannot find module 'rx'
        at Function.Module._resolveFilename (module.js:316:15)
        at Function.Module._load (module.js:258:25)
        at Module.require (module.js:345:17)
        at require (module.js:364:17)
        at repl:1:1
        at REPLServer.defaultEval (repl.js:124:27)
        at bound (domain.js:254:14)
        at REPLServer.runBound [as eval] (domain.js:267:12)
        at REPLServer. (repl.js:277:12)
        at emitOne (events.js:77:13)
    
    
[/code]


CC BY-SA 3.0
2015-04-19T03:49:34.083
9297
2015-04-19T05:09:25.650
2015-04-19T04:52:45.703
5246
5246
question
javascript npm iojs rx-javascript
iojsでrxをグローバルにインストールできない


仰る通り、npmにおけるグローバルインストールはあくまでコマンドラインツール用です。

`require()` するモジュールは、 `npm install` でプロジェクトごとにインストールしてください。コマンドラインでも
`require()` でも使う場合は、両方にインストールが必要です。

公式のFAQによると、依存関係の競合を回避するためにこういう設計になったようです。

とはいえ、 `npm link` というコマンドで `npm install -g` したモジュールへのリンクを作成することもできます。（単に
`node_modules` にシンボリックリンクを作成するだけです）

## 参考

  * [faq | npm Documentation](https://docs.npmjs.com/misc/faq#why-cant-npm-just-put-everything-in-one-place-like-other-package-managers)
  * [npm:globalとlocal - Room 3100](http://3100.github.io/blog/2014/06/28/npm-global-vs-local.html)


CC BY-SA 3.0
2015-04-19T05:09:10.903
9300
2015-04-19T05:09:10.903
8000
9297
answer


ローカルとグローバルの使い分けについては以下に説明があります。

<http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/>

> In general, the rule of thumb is:
>
> If you’re installing something that you want to use in your program, using
> require('whatever'), then install it locally, at the root of your project.  
>  If you’re installing something that you want to use in your shell, on the
> command line or something, install it globally, so that its binaries end up
> in your PATH environment variable.

簡単には、requireによってプログラムから利用したいのであれば、ローカルにインストール。  
一緒にインストールされるバイナリをコマンドラインからグローバルに実行したい場合など（forever, bowerなど。rxもrx-
cliはグローバルにいれて軽量モジュールの作成を行います）は、グローバルにインストールします。  
といった整理ですね。

デフォルトでは グローバルディレクトリはモジュールの探索対象ではありません。

[code]

    sh-4.3# pwd
    /tmp/so
    sh-4.3# node
    > global.module.paths
    [ '/tmp/so/repl/node_modules',
      '/tmp/so/node_modules',
      '/tmp/node_modules',
      '/node_modules' ]
    >
    
[/code]

もし、どうしてもglobalパッケージを利用したいのであれば、環境変数
`NODE_PATH`にグローバルモジュールのインストール先を追加することで、利用可能です。

[code]

    sh-4.3# node
    > require('rx')
    Error: Cannot find module 'rx'
        at Function.Module._resolveFilename (module.js:338:15)
        at Function.Module._load (module.js:280:25)
        at Module.require (module.js:364:17)
        at require (module.js:380:17)
        at repl:1:2
        at REPLServer.self.eval (repl.js:110:21)
        at Interface.<anonymous> (repl.js:239:12)
        at Interface.emit (events.js:95:17)
        at Interface._onLine (readline.js:203:10)
        at Interface._line (readline.js:532:8)
    >
    (^C again to quit)
    >
    sh-4.3# export NODE_PATH=/usr/lib/node_modules
    sh-4.3# node
    > require('rx')
     ～略～
      Subscription: [Function],
      MockDisposable: [Function],
      TestScheduler: [Function: TestScheduler] }
    >
    
[/code]

パスは環境にあわせてください。

ただし、複数のアプリケーションで同じバージョンを参照することになるのでバージョンの変更が難しくなったり（あるアプリのためにはバージョンXが必要だがバージョンXにすると別のアプリの修正が必要になるなど）、別の環境で実行するにあたってグローバルモジュールとしてインストールされていなければならないといった制約になる可能性もありますので、慎重に考えて採用するか決めた方が良いでしょう。


CC BY-SA 3.0
2015-04-19T05:09:25.650
9301
2015-04-19T05:09:25.650
728
9297
answer