Tidak dapat menginstal paket menggunakan manajer paket simpul di Ubuntu

501

Nama juru bahasa NodeJS ( node) di Ubuntu telah diubah namanya menjadi nodejskarena konflik nama dengan paket lain. Inilah yang readme. Debian berkata:

Nama upstream untuk perintah penerjemah Node.js adalah "node". Di Debian, perintah penerjemah telah diubah menjadi "nodejs".

Ini dilakukan untuk mencegah tabrakan namespace: perintah lain menggunakan nama yang sama di hulu mereka, seperti ax25-node dari paket "node".

Skrip yang memanggil Node.js sebagai perintah shell harus diubah untuk menggunakan perintah "nodejs".

Namun, menggunakan nodejs akan menginstal paket menggunakan npm. Instalasi paket gagal dengan kesalahan berikut:

sh: 1: node: not found
npm WARN This failure might be due to the use of legacy binary "node"
npm WARN For further explanations, please read /usr/share/doc/nodejs/README.Debian

Bagaimana saya membuat npm mengerti bahwa nodejs sudah diinstal pada sistem tetapi nama interpreternya berbeda?

Sayem
sumber
29
Anda dapat mencoba untuk ln -s nodejs nodedi /usr/bin. Ini semacam retas.
vbo
1
@vbo Anda dapat menambahkan itu sebagai jawaban - itu memecahkan masalah!
Himel Nag Rana
2
@ HimelNagRana ​​Saya punya jawaban lain (lebih baik, diterima). Komentar awal saya juga diubah untuk menjawab ( stackoverflow.com/a/21168305/539686 ).
vbo
4
Gunakan NVM untuk menginstal dan mengelola versi Node.js, github.com/creationix/nvm , mudah dan nyaman!
Unitech
2
Saya sangat merekomendasikan solusi ini: stackoverflow.com/a/38325376/3197383 untuk mendapatkan kontrol dari node dan versi npm setiap saat dan untuk penggunaan apa pun.
Rémi Becheras

Jawaban:

1094

TL; DR:

sudo apt-get install nodejs-legacy

Pertama-tama izinkan saya mengklarifikasi situasinya sedikit. Di musim panas 2012, pengelola Debian memutuskan untuk mengganti nama Node.js yang dapat dieksekusi untuk mencegah beberapa jenis tabrakan namespace dengan paket lain. Itu adalah keputusan yang sangat sulit bagi Komite Teknis Debian, karena itu merusak kompatibilitas.

Berikut ini adalah kutipan dari draft resolusi Komite, yang diterbitkan dalam milis Debian :

  1. Paket nodejs harus diubah untuk menyediakan / usr / bin / nodejs, bukan / usr / bin / node. Paket harus mendeklarasikan hubungan Breaks: dengan paket apa pun di Debian yang merujuk / usr / bin / node.

  2. Paket sumber nodejs juga harus menyediakan paket biner nodejs-legacy pada Prioritas: tambahan yang berisi / usr / bin / node sebagai symlink ke / usr / bin / nodejs. Tidak ada paket dalam arsip yang bergantung pada atau merekomendasikan paket nodejs-legacy, yang disediakan semata-mata untuk
    kompatibilitas upstream . Paket ini menyatakan juga akan mendeklarasikan hubungan Konflik: dengan paket node.

<...>

Paragraf 2 adalah solusi aktual untuk masalah OP. OP harus mencoba menginstal paket ini daripada melakukan symlink dengan tangan. Berikut ini tautan ke paket ini di situs web indeks paket Debian .

Itu dapat diinstal menggunakan sudo apt-get install nodejs-legacy.

Saya belum menemukan informasi tentang mengadopsi semuanya oleh pengembang NPM, tapi saya pikir npmpaket akan diperbaiki pada beberapa titik dan nodejs-legacymenjadi benar-benar warisan.

vbo
sumber
106
Untuk meringkas:sudo apt-get install nodejs-legacy
Alf Eaton
58
Saya suka jawaban yang menjelaskan situasi secara menyeluruh daripada hanya memberikan perintah untuk mengeksekusi secara membabi buta. Lalu saya bisa menyalin info itu ke komentar di skrip pengaturan lingkungan saya jadi saya tahu apa yang terjadi setahun dari sekarang ketika tidak berfungsi.
Mnebuerquo
29
Sebagai seseorang saya merasa sangat tidak nyaman bahwa simpul bukanlah simpul, melainkan simpul, hanya pada Debian. Benar-benar, sangat, sangat luar biasa bodoh untuk membuat alat pengembangan sempalan seperti ini. Pada dasarnya, keputusan ini menciptakan situasi luar biasa untuk Debian di SETIAP PAKET NODEJS! Saya belum pernah mendengar apa yang "simpul" lakukan sebaliknya, jadi saya kurang simpati; (
Lodewijk
4
Kecuali saya kehilangan sesuatu, ini bukan tabrakan ruang nama . Tidak ada namespace , itu adalah tabrakan nama yang sederhana . Ruang nama memungkinkan Anda memiliki nama yang sama dua kali (atau lebih) selama masing-masing ada di ruang nama yang berbeda . Tidak ada "spasi" seperti itu untuk nama yang dapat dieksekusi di Linux atau Unix. Hal yang paling dekat adalah Anda dapat memiliki banyak direktori dalam variabel $ PATH Anda, dan yang paling awal dengan pencocokan nama yang dapat dieksekusi digunakan. (Tapi itu benar-benar sangat berbeda dari namespace.)
iconoclast
7
Ini sangat menjengkelkan, terlebih karena konflik nama dengan "Amateur Packet Radio" .
Suzana
113

Coba tautkan node ke nodejs. Pertama cari tahu di mana nodejs berada

whereis nodejs

Kemudian soft link node ke nodejs

ln -s [the path of nodejs] /usr/bin/node 

Saya berasumsi / usr / bin ada di jalur eksekusi Anda. Kemudian Anda dapat menguji dengan mengetik simpul atau npm ke dalam baris perintah Anda, dan semuanya akan berfungsi sekarang.

leorex
sumber
3
-s menciptakan tautan simbolis (yang sering pilihan pilihan), bukan tautan keras.
hyde
20
Ini berfungsi, tetapi jawaban vbo untuk menginstal nodejs-legacypaket lebih mudah.
Don Kirkby
2
Saya kedua komentar Don Kirkby dan jawaban vbo. Saya pikir jawaban vbo harus menjadi jawaban yang dipilih.
modulitos
3
Saya merasa jauh lebih nyaman untuk hanya membuat tautan simbolik daripada menginstal perangkat lunak yang sama dua kali ....
frankies
7
Tidak. Jangan mengacau /usr/binkecuali kamu dpkg. Solusi yang tepat (jika Anda menyukai pendekatan symlinking manual ini) adalah membuat symlink/usr/local/bin yang ditujukan untuk pemasangan dan penggantian lokal. Apa pun yang Anda lakukan secara manual dalam /usr/binkaleng dan akan ditimpa oleh manajer paket, dan / atau akan membingungkannya.
tripleee
44

Anda juga dapat menginstal Nodejs menggunakan NVM atau Nodejs Version Manager. Ada banyak manfaat menggunakan pengelola versi. Salah satunya adalah Anda tidak perlu khawatir tentang masalah ini.


Instruksi:


sudo apt-get update
sudo apt-get install build-essential libssl-dev

Setelah paket prasyarat terinstal, Anda dapat menarik skrip instalasi nvm dari halaman GitHub proyek. Nomor versi mungkin berbeda, tetapi secara umum, Anda dapat mengunduh dan menginstalnya dengan sintaks berikut:

curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh

Ini akan mengunduh skrip dan menjalankannya. Ini akan menginstal perangkat lunak ke dalam subdirektori dari direktori home Anda di ~/.nvm. Ini juga akan menambahkan baris yang diperlukan ke ~/.profilefile Anda untuk menggunakan file tersebut.

Untuk mendapatkan akses ke fungsionalitas nvm, Anda harus keluar dan masuk kembali, atau Anda dapat sumber file ~ / .profile sehingga sesi Anda saat ini mengetahui tentang perubahan:

source ~/.profile

Sekarang Anda telah menginstal nvm, Anda dapat menginstal versi Node.js yang terisolasi.

Untuk mengetahui versi Node.js yang tersedia untuk instalasi, Anda dapat mengetik:

nvm ls-remote
. . .

v0.11.10
v0.11.11
v0.11.12
v0.11.13
v0.11.14

Seperti yang Anda lihat, versi terbaru pada saat penulisan ini adalah v0.11.14. Anda dapat menginstalnya dengan mengetik:

nvm install 0.11.14

Biasanya, nvm akan beralih untuk menggunakan versi yang paling baru diinstal. Anda dapat secara eksplisit memberi tahu nvm untuk menggunakan versi yang baru saja kami unduh dengan mengetik:

nvm use 0.11.14

Ketika Anda menginstal Node.js menggunakan nvm, yang dapat dieksekusi disebut node. Anda dapat melihat versi yang saat ini digunakan oleh shell dengan mengetik:

node -v

Tutorial lengkap dapat ditemukan di sini

Eduardo Dennis
sumber
3
Ini juga memperbaiki kesalahan di atas untuk saya. Ini jauh lebih baik untuk pengembang nodejs (dalam pandangan saya seluruh pengembang, saya bukan orang yang bekerja di nodejs). Saya memang menggunakannya.
Ajeeb.KP
1
Saya perlu soft link ke node nvm usr/bin/node. Jadi berlarisudo ln -s /home/www/.nvm/v0.10.36/bin/node /usr/bin/node
Jason Kim
2
Saya telah bekerja berusaha mencari tahu ini selama berjam-jam .. Ini adalah satu-satunya solusi yang saya temukan untuk bekerja. Terima kasih.
w3bMak3r
'manfaat' sekarang merupakan tautan mati
tamasya
20
  1. Instal nvmdulu menggunakan:

    curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
  2. Jalankan perintah

    source ~/.profile
  3. Sekarang jalankan ini dan ini akan menunjukkan semua akan menginstal atau versi lain dari paket:

    nvm ls-remote
  4. Paket yang diinstal akan berwarna hijau. Instal versi apa pun yang Anda inginkan:

    nvm install 6.0.0
  5. Periksa di mana tidak diinstal:

    which node
  6. Periksa versi saat ini:

    node -v
    
    n=$(which node);
    n=${n%/bin/node}; 
    chmod -R 755 $n/bin/*; 
    sudo cp -r $n/{bin,lib,share} /usr/local
    
Ritesh
sumber
2
Saya sangat merekomendasikan solusi ini untuk mengontrol versi node dan npm kapan saja dan untuk penggunaan apa pun.
Rémi Becheras
14
sudo apt-get --purge remove node
sudo apt-get --purge remove nodejs-legacy
sudo apt-get --purge remove nodejs

sudo apt-get install nodejs-legacy
source ~/.profile

Menggabungkan jawaban yang diterima dengan source ~/.profiledari komentar yang telah dilipat dan beberapa perintah pembersihan sebelumnya. Kemungkinan besar Anda juga perlu melakukannya sudo apt-get install npm.

Xiao Peng - ZenUML.com
sumber
12

bagi saya masalah diselesaikan oleh,

sudo apt-get remove node
sudo apt-get remove nodejs
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo ln -s /usr/bin/nodejs /usr/bin/node
alias node=nodejs
rm -r /usr/local/lib/python2.7/dist-packages/localstack/node_modules
npm install -g npm@latest || sudo npm install -g npm@latest
Shrishinde
sumber
10

Inilah pendekatan lain yang saya gunakan karena saya suka n untuk beralih dengan mudah antar versi node

Pada sistem Ubuntu baru, instal simpul 'sistem' terlebih dahulu:

curl -sL https://deb.nodesource.com/setup | sudo bash -

Kemudian instal modul n secara global:

npm install -g n

Karena node sistem diinstal terlebih dahulu (di atas), sistem alternatif dapat digunakan untuk menunjuk ke node yang disediakan oleh n . Pertama, pastikan sistem alternatif tidak memiliki apa pun untuk simpul:

update-alternatives --remove-all node

Kemudian tambahkan node yang disediakan oleh n :

update-alternatives --install /usr/bin/node node /usr/local/bin/node 1

Selanjutnya tambahkan node yang disediakan oleh sistem (yang diinstal dengan curl):

update-alternatives --install /usr/bin/node node /usr/bin/nodejs 2

Sekarang pilih node yang disediakan oleh n menggunakan menu interaktif (pilih /usr/local/bin/nodedari menu yang disajikan oleh perintah berikut):

update-alternatives --config node

Akhirnya, karena /usr/local/binbiasanya memiliki prioritas lebih tinggi dalam PATH daripada /usr/bin, alias berikut harus dibuat (masukkan .bashrc atau .zshrc Anda) jika node sistem alternatif efektif; jika tidak, node yang diinstal dengan n di / usr / local / bin akan selalu diutamakan:

alias node='/usr/bin/node'

Sekarang Anda dapat dengan mudah beralih antara versi node dengan n <desired node version number>.

Ville
sumber
9

Di Linux Mint 17, saya mencoba kedua solusi (membuat symlink atau menggunakan nodejs-legacypaket) tanpa hasil.

Satu-satunya hal yang akhirnya berhasil bagi saya adalah menggunakan ppa dari Chris Lea:

sudo apt-get purge node-*
sudo apt-get autoremove 
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

Node ini diinstal versi 10.37 dan npm 1.4.28. Setelah itu, saya bisa menginstal paket secara global.

Suzana
sumber
9

Seperti yang sudah disebutkan orang lain, saya akan menyarankan untuk tidak menggunakan "sudo apt-get" untuk menginstal node atau perpustakaan pengembangan apa pun. Anda dapat mengunduh versi yang diperlukan dari https://nodejs.org/dist/v6.9.2/ dan mengatur lingkungan Anda sendiri.

Saya akan merekomendasikan alat-alat seperti nvm dan n , untuk mengelola versi simpul Anda. Sangat mudah untuk berganti dan bekerja dengan modul-modul ini. https://github.com/creationix/nvm https://github.com/tj/n

Atau tulis bash dasar untuk mengunduh zip / tar, ekstrak pindahkan folder, dan buat tautan lunak. Kapan pun Anda perlu memperbarui, arahkan saja tautan lunak lama ke versi yang baru diunduh. Seperti yang saya buat sendiri, Anda dapat merujuk: https://github.com/deepakshrma/NodeJs-4.0-Reference-Guide/blob/master/nodejs-installer.sh

#Go to home
cd ~
#run command
#New Script
wget https://raw.githubusercontent.com/deepakshrma/NodeJs-4.0-Reference-Guide/master/nodejs-installer.sh 
bash nodejs-installer.sh -v lts
#here -v or --version can be sepecific to 0.10.37 or it could be latest/lts 
#Examples
bash nodejs-installer.sh -v lts
bash nodejs-installer.sh -v latest
bash nodejs-installer.sh -v 4.4.2
xdeepakv
sumber
6

Solusi sederhana dari sini

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash --
sudo apt-get install nodejs

Anda dapat menentukan versi dengan mengubah nilai setup_x.x, misalnya ke setup_5.x

Krzysztof Karolak
sumber
5

Sistem Anda tidak dapat mendeteksi jalur simpul binary js.

1. simpul mana

2.Lalu soft link node ke nodejs

ln -s [the path of nodejs] /usr/bin/node 

Saya berasumsi / usr / bin ada di jalur eksekusi Anda. Kemudian Anda dapat menguji dengan mengetik simpul atau npm ke dalam baris perintah Anda, dan semuanya akan berfungsi sekarang.

embun beku
sumber
4

Copot versi node apa pun yang Anda miliki

sudo apt-get --purge remove node
sudo apt-get --purge remove nodejs-legacy
sudo apt-get --purge remove nodejs

instal nvm (Pengelola Versi Node) https://github.com/creationix/nvm

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash

Sekarang Anda dapat menginstal versi node apa pun yang Anda inginkan dan beralih di antara versi tersebut.

davide andreazzini
sumber
FYI - siapa pun yang menggunakan metode di atas nvm,, perhatikan bahwa paket nodejs-legacy adalah v0.10.25. (atau setidaknya, itulah yang saya lihat ketika saya mencobanya.)
JaredH
2

Saya memperbaikinya unlinking / usr / sbin / node (yang terkait dengan paket ax25-node), maka saya telah membuat tautan ke nodejs menggunakan ini pada baris perintah

sudo ln -s /usr/bin/nodejs /usr/bin/node

Karena paket seperti karma tidak bekerja dengan nama nodejs, namun mengubah baris pertama skrip karma dari node ke nodejs, tapi saya lebih suka menyelesaikan masalah ini sekali dan untuk semua

Juan Antonio Aguilar
sumber
1

Bagi saya perbaikannya adalah menghapus paket * node dan juga paket npm.

Kemudian instal baru sebagai:

sudo apt-get install autoclean
sudo apt-get install nodejs-legacy
npm install
Jimmy
sumber
sudo apt-get autocleantidak "sama" darisudo apt-get install autoclean
m3nda
1

Masalahnya bukan di installer
ganti nodejs dengan node atau ubah path dari / usr / bin / nodejs ke / usr / bin / node

Vinayk93
sumber
0

Anda dapat membuat ln -s nodejssimpul tautan dengan /usr/bin harapan ini menyelesaikan masalah Anda.

Nitish Agarwal
sumber