NPMモジュールはsudoなしではグローバルにインストールされません


126

私はちょうどUbuntu 12.04 LTSを再インストールしました、そして何よりも前に私はこれらのステップをしました

  1. 次のスクリプトを使用して、パッケージマネージャーを介してノードをインストールしました

    sudo apt-get update
    
    sudo apt-get install python-software-properties python g++ make
    
    sudo add-apt-repository ppa:chris-lea/node.js
    
    sudo apt-get update
    
    sudo apt-get install nodejs
  2. yeoman、express、n、yeomanのジェネレーターをグローバルにインストールしようとしましたが、すべて同じエラーが返されました

    npm ERR!エラー:EACCES、symlink '../lib/node_modules/n/bin/n'

    npm ERR!{[エラー:EACCES、シンボリックリンク '../lib/node_modules/n/bin/n']エラー番号:3、コード: 'EACCES'、パス: '../lib/node_modules/n/bin/n'}

    npm ERR!

    npm ERR!root / Administratorとしてこのコマンドをもう一度実行してください。

    npm ERR!システムLinux 3.8.0-29-generic

    npm ERR!コマンド "/ usr / bin / node" "/ usr / bin / npm" "install" "-g" "-d" "n"

    npm ERR!cwd / home / heberlz

    npm ERR!ノード-v v0.10.20

    npm ERR!npm -v 1.3.11

    npm ERR!パス../lib/node_modules/n/bin/n

    npm ERR!コードEACCES

    npm ERR!エラー番号3

    npm ERR!スタックエラー:EACCES、symlink '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR!追加のロギングの詳細は以下にあります:

    npm ERR!/home/heberlz/npm-debug.log

    npm ERR!OKではないコード0

  3. 〜/ .npm、/ usr / lib / node、/ usr / lib / node_modules、および次のシンボリックリンク/ usr / bin / node、/ usr / bin / nodejsの所有権を再帰的に再利用しました

後でトラブルにならないように、sudoなしでyeomanとそのジェネレータをインストールする必要があります:(


Philのおかげで、見た目はずっと良くなりました
HeberLZ '07 / 07/31

2
あなたは$ HOMEいうよりは/ usrでグローバルなパッケージをインストールするには、NPMをしたい場合は、ガイドに従うgithub.com/sindresorhus/guides/blob/master/...を
大佐がパニック

これは私のために働いていたものですgithub.com/nodejs/node-v0.x-archive/issues/...ln -s /usr/bin/nodejs /usr/bin/node
ロイックMICHEL

回答:


318

Ubuntu 12.04で、Chris LeaのPPAを使用して次の作品をインストールします

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

そして$ HOME / .npm-packages / binを$ PATHに追加します

追加する .bashrc

export PATH="$PATH:$HOME/.npm-packages/bin"

@passyのhttps://stackoverflow.com/a/18277225を参照してください


9
これははるかにクリーンなソリューションのように見えます。ホームディレクトリのシステムフォルダが気に入らない場合は、〜/ .local / share / npmなどの場所を使用することもできます。
JeroenHoek 2014年

プレフィックスを変更した後、npm自体を含め、以前にインストールしたすべてのグローバルモジュールを再インストールする必要があることに注意してください。
Dziamid 2014

これは問題ないようですが、ユーザーにへの書き込み許可を与える方がはるかに簡単/usr/lib/node_modules/です。または、nodejs unixグループを作成し、そのグループにそのディレクトリへの書き込み権限を付与することもできます。
mehulkar 2014

追加する細かい点の1つは、〜/ npmディレクトリを自分で作成する必要があることです。そうでなければ、npmはENOENTエラーで終了します。
Jason Farnsworth

6
これがnpmのデフォルトではないのはなぜですか?共有いただきありがとうございます。
ドリアン

23

あなたがすでに$HOME/binあなたの道にいるなら、より簡単な解決策はただ...

npm config set prefix ~
  • 新しいノードコマンドが$HOME/binディレクトリにインストールされます。
  • パスを変更する必要はありません!

この説明はsudo、を実行することによるセキュリティリスクの軽減に関するものなので、インストールしようとしている登録済みのノードパッケージ名と一致しないアプリ名がノードアプリによってインストールされる可能性があることにも注意してください。したがってnpm install、が既存のシステムコマンドまたはにすでにあるコマンドを置き換えるというセキュリティ上のリスクがあります$HOME/bin。気になる場合はbin、最初にインストールするアプリscriptspackage.jsonファイルのとプロパティを確認してください。

一般に、次の方法が最も安全です。

  • (a)$HOME/binシステムコマンドが無効にならないように、パスの最後に配置します。
  • (b)「。」を含めないでください。または、相対パスを使用して$PATH、たまたま現在のディレクトリにあるコマンドを誤って実行しないようにします。

参照:


1
のもう1つの重要なセキュリティ問題npmgithub.com、ノードパッケージのリポジトリに表示されるソースコードが、npm.orgレジストリサーバーからインストールするコードと異なる場合があることです。
Tony O'Hagan 14

理論的には、巧妙に作成されたノードパッケージはにうまくインストールされますが~/bin、一部のノードパッケージ(またはそれらの依存パッケージ)sudoはでのインストールとしてのみテストされているため、テストされていない「インストール環境」の問題が発生する可能性があることに注意してください。他の環境問題(OSの変更など)と同様に、「一度だけ書いて、どこでもテストする」という原則は依然として当てはまります。
Tony O'Hagan、2014

この方法の欠点は、npmが〜/ libと呼ばれる追加のディレクトリを作成することです。組織の慣例によっては、これは望ましくない場合があります。
S氏

13

2014年10月の場合:

Node.jsは、NodeSource DebianおよびUbuntuバイナリディストリビューションリポジトリから入手できます

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

それでおしまい。

時代遅れの答え:

sudoを使用しない最速の方法はisaacによってここで説明されているようなものです

sudoでパッケージ管理を行わないことを強くお勧めします!パッケージは任意のスクリプトを実行できるため、パッケージマネージャーコマンドをチェーンソーの散髪と同じくらい安全にsudoできます。確かに、高速で確実に障害物を切り抜けますが、実際にはその障害物をそこに留めておきたい場合があります。

代わりにこれを1回行うことをお勧めします。

sudo chown -R $USER /usr/local

編集:

/ usr / localの所有権を現在のユーザーに変更することに関して、特定のセキュリティ上の懸念と機能制限があります。

とは言っても、sudoを使用せずにグローバルモジュールをインストールする場合、(実用的な観点から)言及されているよりも優れた解決策はありません。セキュリティと使いやすさは非常に広いトピックであり、簡単な答えはありません-それは単に要件に依存します。


23
すべての/ usr / localが1人のユーザーに属するため、これは悪い考えです。
リードG.ロー

4
@ ReedG.Lawが指摘したように、これは本当に悪い考えです。/ usr / localの所有権を特定のユーザーに変更しないでください。
Christopher Will

3
私はリードG法に同意する必要があります-/ usr / localの変更は悪い悪い悪い考えです。私の場合、私は方向性を見ていました、そしてそうしました:そして、私はこれを他の開発者と共有しなければならないことを思い出しました。私は戻って、(うまくいけば)すべての変更を取得しました。セキュリティだけでなく、機能性も重要です。
ロイドサージェント2014年

3
システムにユーザー1人しかいない場合、このソリューションの欠点はありますか?
connorbode 2014年

2
申し訳ありませんが、意味が/usr/local/lib/node_modulesありますnode
Creynders 2014

11

問題はsudoを使用してノードをインストールしたことです。npmモジュールをグローバルにインストールするときのエラーを回避するために、sudoを使用してノードをインストールしてはなりません。

私の解決策は、この方法でノード再インストールすることでした:

nodejs.orgから最新の安定したノードソースをダウンロードします#私の場合はnode-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #uncompress sources

cd node-v0.10.20#非圧縮フォルダーに入ります

sudo chown -R $ USER / usr / local

./configure --prefix = / usr / local && make && make install

注意すべき点の1つは、ノードのインストール自体がsudoで行われたため、/ usr / localフォルダーの所有権を取得するだけでは機能しないことです。

yeomanをインストールする最後のステップ:#yeoman.ioで「npm install -g yo」を実行すると、bowerとgruntがすでにインストールされていると表示されますが、gruntのサブモジュールがいくつか失敗しているため、自分でインストールして修正しました

npm install -g bower

npm install -g grunt

npm install -g yo

npm install -g generator-angular


理論的には素晴らしいですが、ノードをビルドしてグローバルにモジュールにアクセスするためだけに4つの追加モジュールをインストールすることを強制されずに同じ効果を達成する方法はありますか?
Dan Nissenbaum、2015年

選択した回答は、必要に応じて機能します。これは、2年前に他のパブリックソリューションがまだなかったときにやったことですが、今では役に立たない
HeberLZ

5

私は環境変数とシェルエイリアスでこの問題を解決しました:

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"

私にとって、npmは.npmrcの "prefix"構成設定を尊重しませんでした。


2

この同様のSOの投稿によると:npmはsudoなしでエラーをスローします

~/.npmディレクトリの所有権に問題がある可能性があります。

その答えと同様に、試してください:

sudo chown -R `whoami` ~/.npm

実際には、これを機能させることができなかったときに試みたステップ3で説明したように機能しませんでした。問題は、sudoを使用してノードをインストールしたため、状況によっては問題が発生する可能性があることです。ノードを削除してソースから再インストールすると、すべてが期待どおりに動作し始めました!
HeberLZ 2014

@HeberLZ私はあなたが正しいと思います、私は昨日別のマシンでこれを試してみましたが、うまくいきませんでした。私も対処する他の許可の問題がありました。このインストールnpmをソースから実行しないようにする最善の方法はまだわかりません。
prasanthv 2014

コメント内の質問にリンクするか、現在の質問を重複としてマークします。他の質問の回答をコピーして貼り付けることはできません。
givanse 2014年

@HeberLZこの回答の反対票は、あなたが作成した質問のタイトルに対応しているため、不適切です。
Sebastian Sastre 2015年

いつ回答に反対票を投じたのか覚えていませんが、私の特定のケースでは、あなたが書いたものは問題を解決しませんでした。理由はおそらく回答を反対票に投票したと思う理由です。質問に記載されているように、「次のフォルダーの所有権を再帰的に〜/ .npm、/ usr / lib / node、/ usr / lib / node_modules、および次のシンボリックリンク/ usr / bin / node、/ usr / bin / nodejsはまったく成功しませんでした」私は.npmと他のすべてのフォルダーの所有権を獲得しようとしましたが成功しませんでした
HeberLZ

2

npmのディレクトリへのパスを見つけます。

npm config get prefix

多くのシステムでは、これは/ usr / localになります。

npmのディレクトリの所有者を現在のユーザーの名前(ユーザー名!)に変更します。

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

これにより、npmおよびその他のいくつかのツール(lib / node_modules、bin、およびshare)で使用されるサブフォルダーの権限が変更されます。

詳細はこちらをご覧ください

https://docs.npmjs.com/getting-started/fixing-npm-permissions


重要です。括弧を追加しbinたりshare、括弧に入れたりしないようにしてください 。無視すると、このフォルダーの所有権が現在のユーザーsudoに変更され、所有権も変更されるため、システムに新しいパッケージをインストールするときに問題が発生する可能性があります
A.Ametov

これにより、すべてのファイルシステムが破壊されます:(
UA_


1

実際、私はrootが所有するユーザーフォルダーのアクセス許可を変更しました。

sudo chown -R $USER ~/.config/configstore

次に、sudoなしで「npm install」と「bower install」を実行できました。うまくいきました!


0

lubuntu 14.04.3を使用して、.npmとnpmプレフィックスの所有権を変更し、パスを更新しました。sudoを使用せずにnpmインストール済みモジュールをホームディレクトリに更新しましたが、パスが正しくないため、emberなどのモジュールが見つかりませんでした。linuxbewが問題をすばやく解決しましたnode / npmの設定ガイドはこちら


0

この問題と同じ理由によって引き起こされる他の問題は、ユーザー空間にノードをインストールすることで解決できます。

端末にコピーして貼り付けるだけで実行できます

NODEJS_ROOT=${NODEJS_ROOT:-~/nodejs}
cd /tmp
wget -N http://nodejs.org/dist/node-latest.tar.gz && tar xzf node-latest.tar.gz
NODEJS_CURRENT=$(tar tf node-latest.tar.gz|head -1)
mkdir -p $NODEJS_ROOT/$NODEJS_CURRENT
cd $NODEJS_CURRENT
./configure --prefix=$NODEJS_ROOT/$NODEJS_CURRENT && make install
cd $NODEJS_ROOT
rm current 2> /dev/null # Removes current symbolic link, if any
ln -s $NODEJS_CURRENT current

同じコマンドを起動して、ノードを最新バージョンに更新することもできます。

環境を編集することを忘れないでください。一度だけ、やります

echo "export NODEJS_ROOT=$NODEJS_ROOT"            >> $HOME/.bash_profile
echo 'export PATH=$NODEJS_ROOT/current/bin:$PATH' >> $HOME/.bash_profile
source $HOME/.bash_profile # reload your env, so you can use node right now

sudoを使用せずにNode.jsインストールする方法の概要については、この記事をご覧ください。

このトピックに関するより一般的な解決策(つまり、ソフトウェアをローカルにインストールする)については、dotsoftwareを参照してください。


0

nvmを使用するだけで、異なるノードバージョンを動的に切り替えることができ、ユーザーのローカルにインストールされます。sudoは必要ありません。事前に古いノードを完全にクリーンアップしたことを確認してください。

https://github.com/nvm-sh/nvm


-2

私が見つけた最良の解決策は、tarパッケージからNode.jsをユーザーのホームディレクトリにインストールし、libフォルダーの場所をリンクすることでした。これはあなたがする必要があることです

これにより、Nodejsがデフォルトの/ usr / local /ではなく〜/ .local /にインストールされます。

Add this to your ~/.npmrc (create the file if it doesn't exist already):

root =    /home/YOUR-USERNAME/.local/lib/node_modules
binroot = /home/YOUR-USERNAME/.local/bin
manroot = /home/YOUR-USERNAME/.local/share/man
Download the Nodejs source code from nodejs.org and install it under your ~/.local tree:

tar xf node......
cd node........
./configure --prefix=~/.local
make
make install

Create ~/.node_modules symlink. (This directory will be automatically searched when you load modules using require "module" in scripts. I'm not sure why Node doesn't search ~/.local/lib/node_modules by default.)

cd
ln -s .local/lib/node_modules .node_modules
Is ~/.local/bin in your path? Type

which npm
If it says ~/.local/bin/npm, you're done.

Otherwise, do this...

export PATH=$HOME/.local/bin:$PATH
...and add that line to your ~/.profile file, so it'll run every time you log in.

パッケージのインストール中にまだ所有権または権限のエラーが発生する場合は、実行して〜/ .local / dirの所有権を変更します

chown -R user:user ~/.local/

これで、「npm」を​​介してパッケージをインストールできるようになります。

注:上記のコマンドはすべて、ユーザーとして実行する必要があります。SUDOまたはROOTログインを使用しないでください

「/ USR / LIB /」の下のフォルダの権限を決して変更しないでください。不安定なOSにつながる



-2

Pawel Grzybekの説明は非常に説得力があると思います。これらは3つの単純なsudoコマンドに要約され、グローバルnpmインストールでsudoを再度使用する必要はありません。

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.