2016-07-15 10 views
6

私は自宅でnode.js開発を開始しようとしていましたが、npmパッケージをグローバルにインストールするときに奇妙な動作に遭遇しました。npmは、グローバルにインストールされたパッケージに対して奇妙なパーミッションを設定します。

私はIDEとしてWebStormを使用しており、ECMAScript6の機能を使用したいと考えています。つまり、WebStormがBabelを使用してソースを切り抜かなければなりません。

だから私は、グローバルバベルをインストールしようとした:

$ sudo npm install -g babel-cli 

は何が起こることはファイルはrootユーザーからアクセス可能なすべての罰金、およびbabel-cliディレクトリであり、その中のすべてのファイルとディレクトリは限り罰金に見えるということです私はrootのように見えます。私はそれをパッケージを見て、または使用しようとすると問題が別のユーザーとして、来る:

$ ls -l /usr/lib/node_modules/babel-cli/ 
ls: cannot access '/usr/lib/node_modules/babel-cli/lib': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/index.js': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/scripts': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/node_modules': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/package.json': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/README.md': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/bin': Permission denied 
total 0 
d????????? ? ? ? ?   ? bin/ 
d????????? ? ? ? ?   ? lib/ 
d????????? ? ? ? ?   ? node_modules/ 
d????????? ? ? ? ?   ? scripts/ 
-????????? ? ? ? ?   ? index.js 
-????????? ? ? ? ?   ? package.json 
-????????? ? ? ? ?   ? README.md 

私がインストールされたパッケージは関係ありませんが、それらはすべて、このようになります。

私はUbuntu 16.04でnode.js v6.3.0とnpm 3.10.3を使用しています。

hereの指示に従ってnode.jsを新しくインストールしました。 npmを更新しようとすると、同じことがグローバルnpmディレクトリに発生し、npmはroot以外では使用できなくなります。

私はユーザーとしてグローバルnode_modulesの一覧を表示するとき、私は特別な何も見えないnobodyによって所有されているディレクトリのほかに

$ ll /usr/lib/node_modules/ 
total 8,0K 
drwxr--r-- 6 nobody root 4,0K jul 15 23:50 babel-cli/ 
drwxr-xr-x 10 root root 4,0K jul 15 23:21 npm/ 

を参照してください。

パッケージをインストールするときにエラーはありません。

npmやノードに問題がありますか? Ubuntuで何か問題がありますか?または、どのようにノードをインストールしましたか?何かの理由は何でしょうか そのようなことが起こりますか?

ローカルインストールは正常に動作し、babel-cliパッケージの場合は、ローカル開発パッケージとしてインストールするのが許容される回避策です。私はまだパッケージをグローバルにインストールするときに何が起こるのか、またその理由を知りたいと思います。


問題answered here。問題はnpmnodeとは無関係でした。

+0

私はノードのソースリポジトリを使用し、私はこれらの問題を見ていない。しかし、私は古いnpmでノード4.4を実行しています。あなたはバベルのためだけに彼の問題を経験していますか?何か他のCLIのツールについてはどうですか? – tsturzl

+0

@tsturzlグローバルにインストールするすべてのパッケージで同じです。 –

+0

絶対に 'ndo'で' sudo'を使用しないでください。あなたはただのトラブルを求めているだけです。ノードを吹き飛ばし、すべてのnpmのモジュールとディレクトリを開き、すべてのものを通常のユーザー権限でインストールします。 – xdumaine

答えて

5

あなたが世界的にパッケージをインストールしたい場合は、同じようにsudoせずにコマンドを使用する:あなたはEACCESまたは許可エラーを取得している場合は

$ npm install -g <package> 

sudoの使用は避けるべきであるが、あなたの代わりに修正する必要がありますあなたのアクセス許可はnpmがsudoなしで実行できるようにします。

これらのエラーは、npmがグローバルパッケージの格納に使用するフォルダに書き込む権限がない場合に発生します。ほとんどのシステムで

$ npm config get prefix 

が、それは/usr/localだろうと、あなたは、このフォルダのアクセス許可を修正することができます:それを修正するには、NPMのデフォルトディレクトリへのパス何見つけることによって開始することができます。フォルダが/usrまたは/usr/libの場合、このディレクトリのアクセス権を変更しないでください。何か問題が発生する可能性があります。その場合、デフォルトディレクトリのアクセス権を変更したくない場合は、npmが別のディレクトリ。

することができますし、デフォルトのフォルダのアクセス許可を変更したい場合は、あなたが使用することができます。

$ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} 

それは、現在のユーザーの名前にNPMのディレクトリの所有者を変更します。

あなたはNPMのデフォルトのディレクトリを変更したい場合は、この新しいフォルダの作成により起動することができます。そして、

$ mkdir ~/.npm-packages 

を、あなたがこの新しいフォルダを使用するようにNPMを設定します。

$ npm config set prefix '~/.npm-packages' 

あなたはまた、この新しいフォルダをPATHに追加する必要があります(たとえば〜/ .profileを使用)。

export PATH=~/.npm-packages/bin:$PATH 

この時点で、source ~/.profileでシステム変数を更新し、sudoを使わずにパッケージをグローバルにインストールすることができます。

npmは~/.npm-packagesフォルダを使用するため、アクセス許可のエラーを表示せずにパッケージをインストールすることができます。

この問題に関する詳細はnpm documentationにあります。

+0

'/ usr'の下でシステムディレクトリの特権を持たないユーザの所有権を与えることは、常に悪い考えです。この答えが奨励しているようです。モジュールをグローバルに(つまり、他のユーザが利用できるように)システムにインストールするには、 'root'ユーザまたは' sudo 'を使ってモジュールをインストールする必要があります。何かをすることは無責任です - 自分のマシンでは問題ですが、これが正しい方法であることをデベロッパーに教えてから、自分のサーバー上で行うことは災害です。 – Guss

+0

アクセス権の変更は、npmのデフォルトが直接 '/ usr/local'である場合にのみ示唆されており、その答えが別のディレクトリにある場合にはアクセス権を変更すべきでないことを明確に述べています。反対に、 '/ usr/local'のパーミッションを変更することがまだ悪いと思うなら、おそらくあなたは[npmにすぐに問題を開く](https://github.com/npm/npm/issues)これは公式の文書化された推奨アクセス許可の方法ですので、https://docs.npmjs.com/getting-started/fixing-npm-permissions – HiDeo

+0

私はその愚かな文書に精通しています。それは:https://github.com/npm/docs/issues/745です。 NPM文書の所有者(少なくとも)は同意しているようです。彼女が約束したとおり、すぐにこれを直すことを願っています。 – Guss

0

ユーザを変更する場合は、npmをインストールしたときにrootユーザとしてインストールされていますが、ユーザを変更した後に、ユーザが変更を行ったことを示すため、アクセス権エラーが発生するため、 npmがグローバルパッケージとコマンドを保存するために使用するディレクトリに書き込む権限を持っていません。-

これを担当するパッケージマネージャを使用してください。

Mac OSでノードを新規インストールする場合は、Homebrewパッケージマネージャを使用してこの問題を回避できます。自作では、適切な権限を使って物事を設定します。

brew install node 

OR

変更NPMのデフォルトディレクトリ別のディレクトリに

あなたは(つまりは/ usr)の使用をNPMデフォルトディレクトリの所有権を変更したくない回があります。これは、たとえば、システムを他のユーザーと共有している場合など、いくつかの問題を引き起こす可能性があるためです。

代わりに、別のディレクトリを使用するようにnpmを構成することができます。私たちの場合、これはホームフォルダの隠しディレクトリになります。

グローバルインストール用のディレクトリを作成します:新しいディレクトリ・パスを使用する

mkdir ~/.npm-global 

設定NPMを:

npm config set prefix '~/.npm-global' 

オープンまたは〜/ .profileファイルを作成すると、次の行を追加します。

export PATH=~/.npm-global/bin:$PATH 

コマンドラインに戻り、システム変数を更新します。

source ~/.profile 

テスト:sudoを使用せずにパッケージをグローバルにダウンロードします。

(あなたは〜/ .profileには変更したくない場合など)、あなたはまた、対応するENV変数を使用することができます
npm install -g babel-cli 

の代わりにステップ2-4:

NPM_CONFIG_PREFIX=~/.npm-global 
関連する問題