Không thể cài đặt gói bằng trình quản lý gói nút trong Ubuntu


500

Tên trình thông dịch NodeJS ( node) trên Ubuntu đã được đổi tên thành nodejsdo xung đột tên với gói khác. Đây là những gì đã đọc. Debian nói:

Tên ngược dòng cho lệnh trình thông dịch Node.js là "nút". Trong Debian, lệnh phiên dịch đã được thay đổi thành "nodejs".

Điều này được thực hiện để ngăn xung đột không gian tên: các lệnh khác sử dụng cùng tên trong dòng ngược của chúng, chẳng hạn như nút ax25 từ gói "nút".

Các kịch bản gọi Node.js là lệnh shell phải được thay đổi thành thay vào đó sử dụng lệnh "nodejs".

Tuy nhiên, bằng cách sử dụng nodejs, cài đặt các gói bằng cách sử dụng npm. Cài đặt gói không thành công với lỗi sau:

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

Làm cách nào để npm hiểu rằng nodejs đã được cài đặt trên hệ thống nhưng tên trình thông dịch thì khác?


29
Bạn có thể thử ln -s nodejs nodevào /usr/bin. Đó là loại hack mặc dù.
vbo

1
@vbo bạn có thể thêm nó như một câu trả lời - nó giải quyết vấn đề!
Himel Nag Rana

2
@HimelNagRana ​​Tôi có một câu trả lời khác (tốt hơn, được chấp nhận). Nhận xét ban đầu của tôi cũng được chuyển đổi để trả lời ( stackoverflow.com/a/21168305/539486 ).
vbo

4
Sử dụng NVM để cài đặt và quản lý các phiên bản Node.js, github.com/creationix/nvm , thật dễ dàng và thuận tiện!
Unitech

2
Tôi đánh giá cao giải pháp này: stackoverflow.com/a/38325376/3197383 để có quyền kiểm soát các phiên bản nút và npm bất cứ lúc nào và cho bất kỳ việc sử dụng nào.
Rémi Becheras

Câu trả lời:


1094

TL; DR:

sudo apt-get install nodejs-legacy

Trước hết hãy để tôi làm rõ tình hình một chút. Vào mùa hè 2012, các nhà bảo trì Debian đã quyết định đổi tên tệp thực thi Node.js để ngăn chặn một số loại xung đột không gian tên với gói khác. Đó là quyết định rất khó khăn đối với Ủy ban Kỹ thuật Debian, vì nó phá vỡ tính tương thích ngược.

Sau đây là trích dẫn từ dự thảo nghị quyết của Ủy ban, được công bố trong danh sách gửi thư của Debian :

  1. Gói nodejs sẽ được thay đổi thành cung cấp / usr / bin / nodejs, không phải / usr / bin / node. Gói nên khai báo mối quan hệ Breaks: với bất kỳ gói nào trong Debian tham chiếu / usr / bin / nút.

  2. Gói nguồn nodejs cũng sẽ cung cấp gói nhị phân nodejs-legacy ở mức độ ưu tiên: phần bổ sung có chứa / usr / bin / nút dưới dạng liên kết đến / usr / bin / nodejs. Không có gói nào trong kho lưu trữ có thể phụ thuộc hoặc đề xuất gói nodejs-legacy, vốn chỉ được cung cấp để
    tương thích ngược dòng . Gói này tuyên bố cũng sẽ khai báo mối quan hệ Xung đột: với gói nút.

<...>

Đoạn 2 là giải pháp thực tế cho vấn đề của OP. OP nên cố gắng cài đặt gói này thay vì thực hiện symlink bằng tay. Đây là một liên kết đến gói này trong trang web chỉ mục gói Debian .

Nó có thể được cài đặt bằng cách sử dụng sudo apt-get install nodejs-legacy.

Tôi chưa tìm thấy bất kỳ thông tin nào về việc áp dụng toàn bộ điều này bởi các nhà phát triển NPM, nhưng tôi nghĩ rằng npmgói sẽ được sửa chữa vào một số điểm và nodejs-legacytrở thành di sản thực sự.


106
Để tóm tắt:sudo apt-get install nodejs-legacy
Alf Eaton

58
Tôi thích câu trả lời giải thích cặn kẽ tình huống hơn là chỉ đưa ra mệnh lệnh để thực thi một cách mù quáng. Sau đó, tôi có thể sao chép thông tin đó vào các bình luận trong kịch bản thiết lập môi trường của mình để tôi biết điều gì sẽ xảy ra sau một năm kể từ khi nó không hoạt động.
Mnebuerquo

29
Là một người tôi thấy thật bất tiện khi nút đó không phải là nút, mà thay vào đó là nodejs, chỉ có trên Debian. Nó thực sự, thực sự, thực sự ngu ngốc đáng kinh ngạc đối với các công cụ phát triển như thế này. Về cơ bản, quyết định này đã tạo ra một tình huống đặc biệt cho Debian trong MỌI GÓI NODEJS! Tôi chưa bao giờ nghe nói "nút" làm gì khác, vì vậy tôi không có cảm tình; (
Lodewijk

4
Trừ khi tôi thiếu một cái gì đó, đây không phải là một vụ va chạm không gian tên . Không có không gian tên , đó là một sự va chạm tên đơn giản . Không gian tên cho phép bạn có cùng tên hai lần (hoặc nhiều hơn) miễn là mỗi không gian tồn tại trong một không gian tên khác nhau . Không có "khoảng trắng" như vậy tồn tại cho các tên thực thi trong Linux hoặc Unix. Điều gần nhất là bạn có thể có nhiều thư mục trong biến $ PATH của mình và thư mục đầu tiên có tên thực thi phù hợp được sử dụng. (Nhưng điều đó thực sự rất khác với một không gian tên.)
iconoclast

7
Điều này rất khó chịu, thậm chí còn nhiều hơn bởi vì xung đột tên là với "Đài phát thanh gói nghiệp dư" .
Suzana

113

Hãy thử liên kết nút với nodejs. Trước tiên hãy tìm xem nodejs ở đâu

whereis nodejs

Sau đó, nút liên kết mềm đến nodejs

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

Tôi giả sử / usr / bin nằm trong đường dẫn thực thi của bạn. Sau đó, bạn có thể kiểm tra bằng cách nhập nút hoặc npm vào dòng lệnh của mình và mọi thứ sẽ hoạt động ngay bây giờ.


3
-s tạo liên kết tượng trưng (thường được lựa chọn ưu tiên), không phải liên kết cứng.
hyde

20
Điều này hoạt động, nhưng câu trả lời của vbo về việc cài đặt nodejs-legacygói dễ dàng hơn.
Don Kirkby

2
Tôi thứ hai bình luận của Don Kirkby và câu trả lời của vbo. Tôi nghĩ rằng câu trả lời của vbo nên là câu trả lời được chọn.
modulitos

3
Tôi thấy thuận tiện hơn nhiều khi chỉ cần tạo một liên kết tượng trưng thay vì cài đặt cùng một phần mềm hai lần ....
frankies 11/215

7
Không. Đừng muck với /usr/bintrừ khi bạn là dpkg. Giải pháp thích hợp (nếu bạn thích phương pháp liên kết tượng trưng thủ công/usr/local/bin này) là tạo liên kết tượng trưng được chỉ định cho cài đặt cục bộ và ghi đè. Bất cứ điều gì bạn làm thủ công /usr/binđều có thể và sẽ được ghi đè bởi người quản lý gói và / hoặc sẽ gây nhầm lẫn.
tripleee

44

Bạn cũng có thể cài đặt Nodejs bằng Trình quản lý phiên bản NVM hoặc Nodejs Có rất nhiều lợi ích khi sử dụng trình quản lý phiên bản. Một trong số họ là bạn không phải lo lắng về vấn đề này.


Hướng dẫn:


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

Khi các gói điều kiện tiên quyết được cài đặt, bạn có thể kéo xuống tập lệnh cài đặt nvm từ trang GitHub của dự án. Số phiên bản có thể khác nhau, nhưng nói chung, bạn có thể tải xuống và cài đặt nó với cú pháp sau:

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

Điều này sẽ tải tập lệnh và chạy nó. Nó sẽ cài đặt phần mềm vào thư mục con của thư mục chính của bạn tại ~/.nvm. Nó cũng sẽ thêm các dòng cần thiết vào ~/.profiletệp của bạn để sử dụng tệp.

Để có quyền truy cập vào chức năng nvm, bạn sẽ cần phải đăng xuất và đăng nhập lại hoặc bạn có thể lấy nguồn ~ / .profile để phiên hiện tại của bạn biết về các thay đổi:

source ~/.profile

Bây giờ bạn đã cài đặt nvm, bạn có thể cài đặt các phiên bản Node.js bị cô lập.

Để tìm hiểu các phiên bản Node.js có sẵn để cài đặt, bạn có thể nhập:

nvm ls-remote
. . .

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

Như bạn có thể thấy, phiên bản mới nhất tại thời điểm viết bài này là v0.11,14. Bạn có thể cài đặt bằng cách gõ:

nvm install 0.11.14

Thông thường, nvm sẽ chuyển sang sử dụng phiên bản được cài đặt gần đây nhất. Bạn có thể nói rõ ràng với nvm để sử dụng phiên bản chúng tôi vừa tải xuống bằng cách gõ:

nvm use 0.11.14

Khi bạn cài đặt Node.js bằng nvm, tệp thực thi được gọi là nút. Bạn có thể thấy phiên bản hiện đang được shell sử dụng bằng cách gõ:

node -v

Hướng dẫn comeplete có thể được tìm thấy ở đây


3
Điều này cũng đã sửa lỗi ở trên cho tôi. Nó tốt hơn nhiều cho nhà phát triển nodejs (theo quan điểm của tôi, toàn bộ nhà phát triển, tôi không phải là người làm việc trong nodejs). Tôi đã sử dụng nó.
Ajeeb.KP

1
Tôi cần phải liên kết mềm nút nvm usr/bin/node. Vì vậy, chạysudo ln -s /home/www/.nvm/v0.10.36/bin/node /usr/bin/node
Jason Kim

2
Tôi đã làm việc để cố gắng tìm ra điều này trong nhiều giờ .. Đây là giải pháp duy nhất tôi tìm thấy để làm việc. Cảm ơn bạn.
w3bMak3r 30/03/2015

'lợi ích' bây giờ là một liên kết chết
ghen tị

20
  1. Cài đặt nvmđầu tiên bằng cách sử dụng:

    curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
  2. Chạy lệnh

    source ~/.profile
  3. Bây giờ hãy chạy cái này và nó sẽ hiển thị tất cả các phiên bản gói đã cài đặt hoặc khác:

    nvm ls-remote
  4. Các gói đã cài đặt sẽ có màu xanh lá cây. Cài đặt bất kỳ phiên bản nào bạn muốn:

    nvm install 6.0.0
  5. Kiểm tra nơi chưa được cài đặt:

    which node
  6. Kiểm tra phiên bản hiện tại:

    node -v
    
    n=$(which node);
    n=${n%/bin/node}; 
    chmod -R 755 $n/bin/*; 
    sudo cp -r $n/{bin,lib,share} /usr/local

2
Tôi đặc biệt khuyên dùng giải pháp này để có quyền kiểm soát các phiên bản nút và npm bất cứ lúc nào và cho bất kỳ việc sử dụng nào.
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

Kết hợp câu trả lời được chấp nhận với source ~/.profiletừ nhận xét đã được gấp lại và một số lệnh dọn sạch trước đó. Nhiều khả năng bạn cũng sẽ cần sudo apt-get install npmsau.


12

vấn đề của tôi đã được giải quyết bằng,

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

10

Đây là một cách tiếp cận khác mà tôi sử dụng vì tôi thích n để dễ dàng chuyển đổi giữa các phiên bản nút.

Trên hệ thống Ubuntu mới, trước tiên hãy cài đặt nút 'hệ thống':

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

Sau đó cài đặt n module trên toàn cầu:

npm install -g n

Do nút hệ thống đã được cài đặt trước (ở trên), nên hệ thống thay thế có thể được sử dụng để chỉ rõ đến nút được cung cấp bởi n . Trước tiên, hãy đảm bảo hệ thống thay thế không có gì cho nút:

update-alternatives --remove-all node

Sau đó thêm nút được cung cấp bởi n :

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

Nút thêm tiếp theo được cung cấp bởi hệ thống (nút được cài đặt với curl):

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

Bây giờ chọn nút được cung cấp bởi n bằng menu tương tác (chọn /usr/local/bin/nodetừ menu được trình bày bởi lệnh sau):

update-alternatives --config node

Cuối cùng, vì /usr/local/binthường có độ ưu tiên cao hơn trong PATH so với /usr/bin, các bí danh sau phải được tạo (nhập vào .bashrc hoặc .zshrc) nếu nút hệ thống thay thế có hiệu lực; mặt khác, nút được cài đặt với n in / usr / local / bin luôn được ưu tiên:

alias node='/usr/bin/node'

Bây giờ bạn có thể dễ dàng chuyển đổi giữa các phiên bản nút với n <desired node version number>.


9

Trên Linux Mint 17, tôi đã thử cả hai giải pháp (tạo liên kết tượng trưng hoặc sử dụng nodejs-legacygói) nhưng không thành công.

Điều duy nhất cuối cùng làm việc cho tôi là sử dụng ppa từ 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

Nút cài đặt phiên bản 10.37 và npm 1.4.28 này. Sau đó, tôi có thể cài đặt các gói trên toàn cầu.


9

Như những người khác đã đề cập, tôi sẽ đề nghị không sử dụng "sudo apt-get" để cài đặt nút hoặc bất kỳ thư viện phát triển nào. Bạn có thể tải xuống phiên bản bắt buộc từ https://nodejs.org/dist/v6.9.2/ và thiết lập môi trường của riêng bạn.

Tôi sẽ giới thiệu các công cụ như nvmn , để quản lý phiên bản nút của bạn. Nó rất thuận tiện để chuyển đổi và làm việc với các mô-đun. https://github.com/creationix/nvm https://github.com/tj/n

Hoặc viết bash cơ bản để tải xuống zip / tar, giải nén thư mục di chuyển và tạo một liên kết mềm. Bất cứ khi nào bạn cần cập nhật, chỉ cần trỏ liên kết mềm cũ đến phiên bản mới tải xuống. Giống như tôi đã tạo cho riêng mình, bạn có thể tham khảo: 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

6

Giải pháp đơn giản từ đây

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

Bạn có thể chỉ định phiên bản bằng cách thay đổi giá trị setup_x.x, ví dụ như setup_5.x


5

Hệ thống của bạn không thể phát hiện nhị phân js nút đường dẫn.

1. nút nào

2.Sau đó liên kết nút mềm đến nodejs

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

Tôi giả sử / usr / bin nằm trong đường dẫn thực thi của bạn. Sau đó, bạn có thể kiểm tra bằng cách nhập nút hoặc npm vào dòng lệnh của mình và mọi thứ sẽ hoạt động ngay bây giờ.


4

Gỡ cài đặt bất kỳ phiên bản nút nào bạn có

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

cài đặt nvm (Trình quản lý phiên bản nút) https://github.com/creationix/nvm

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

Bây giờ bạn có thể cài đặt bất kỳ phiên bản nút nào bạn muốn và chuyển đổi giữa các phiên bản.


FYI - bất cứ ai sử dụng phương pháp trên nvm, lưu ý rằng gói nodejs-legacy là v0.10.25. (hoặc ít nhất, đó là những gì tôi đã thấy khi tôi thử nó.)
JaredH

2

Tôi đã sửa lỗi hủy liên kết / usr / sbin / nút (được liên kết với gói nút ax25), sau đó tôi đã tạo một liên kết đến nodejs bằng cách sử dụng dòng lệnh này

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

Bởi vì gói như karma không hoạt động với tên nodejs, tuy nhiên thay đổi dòng script karma đầu tiên từ nút sang nodejs, nhưng tôi thích giải quyết vấn đề này một lần và mãi mãi


1

Đối với tôi, bản sửa lỗi đã loại bỏ các gói nút * và các gói npm.

Sau đó, cài đặt mới như:

sudo apt-get install autoclean
sudo apt-get install nodejs-legacy
npm install

sudo apt-get autocleankhông "giống" hơnsudo apt-get install autoclean
m3nda

1

Vấn đề không nằm ở trình cài đặt
thay thế nodejs bằng nút hoặc thay đổi đường dẫn từ / usr / bin / nodejs thành / usr / bin / node



0

bạn có thể tạo một ln -s nodejsnút liên kết với /usr/bin hy vọng điều này sẽ giải quyết vấn đề của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.