Cài đặt NPM vào thư mục chính với gói nodejs phân phối (Ubuntu)


93

Tôi muốn sử dụng các gói Node.js phân phối (hoặc chris-lea ppa cho các bản phát hành gần đây hơn) nhưng cài đặt NPM vào thư mục chính của tôi.

Điều này có vẻ cầu kỳ, nhưng đó là một cách khá dễ hiểu đối với các nhà phát triển sử dụng polyglot / github để thiết lập môi trường thời gian chạy / thư viện ngôn ngữ trong Linux: gói phân phối cho thời gian chạy, thư viện bên thứ 3 trong môi trường mỗi người dùng (xem virtualenv, RVM - RVM cũng sẽ xây dựng Ruby cho bạn nếu bạn muốn). Nếu cần, tôi sẽ xây dựng nút cục bộ nhưng đó là PITA vì Node đang trở thành một yêu cầu phát triển ngẫu nhiên cho rất nhiều dự án.


Câu trả lời:


200

NPM sẽ cài đặt các gói cục bộ vào các dự án của bạn, nhưng tôi vẫn muốn giữ hệ thống tránh xa các tệp hệ điều hành của mình. Đây là cách tôi đề xuất chia nhỏ các gói Nodejs:

Cài đặt Nodejs và NPM thông qua PPA chris-lea. Sau đó, tôi thiết lập một gốc gói trong homedir của mình để giữ các gói "toàn cầu" của Node:

 $ NPM_PACKAGES="$HOME/.npm-packages"
 $ mkdir -p "$NPM_PACKAGES"

Đặt NPM để sử dụng thư mục này cho các cài đặt gói toàn cầu của nó:

 $ echo "prefix = $NPM_PACKAGES" >> ~/.npmrc

Định cấu hình PATH và MANPATH của bạn để xem các lệnh trong tiền tố $ NPM_PACKAGES của bạn bằng cách thêm phần sau vào .zshrc / .bashrc của bạn:

# NPM packages in homedir
NPM_PACKAGES="$HOME/.npm-packages"

# Tell our environment about user-installed node tools
PATH="$NPM_PACKAGES/bin:$PATH"
# Unset manpath so we can inherit from /etc/manpath via the `manpath` command
unset MANPATH  # delete if you already modified MANPATH elsewhere in your configuration
MANPATH="$NPM_PACKAGES/share/man:$(manpath)"

# Tell Node about these packages
NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"

Bây giờ khi bạn thực hiện npm install -g, NPM sẽ cài đặt các thư viện vào ~/.npm-packages/lib/node_modulesvà liên kết các công cụ có thể thực thi vào ~/.npm-packages/bin, trong đó của bạn PATH.

Chỉ cần sử dụng npm install -gnhư bình thường:

[justjake@marathon:~] $ npm install -g coffee-script
... (npm downloads stuff) ...
/home/justjake/.npm-packages/bin/coffee -> /home/justjake/.npm-packages/lib/node_modules/coffee-script/bin/coffee
/home/justjake/.npm-packages/bin/cake -> /home/justjake/.npm-packages/lib/node_modules/coffee-script/bin/cake
coffee-script@1.3.3 /home/justjake/.npm-packages/lib/node_modules/coffee-script

[justjake@marathon:~] $ which coffee
/home/justjake/.npm-packages/bin/coffee

2
Nếu bạn đang sử dụng hệ thống chia sẻ đã nodeđược cài đặt nhưng npmchưa được cài đặt , hãy làm theo thiết lập trong câu trả lời ở trên và sau đó npm_config_prefix=$NPM_PACKAGES curl -L https://npmjs.org/install.sh | shđể npmtự cài đặt trong thư mục chính của bạn.
Tim Lewis

1
Bộ tiền tố không hoạt động đối với tôi vào npm 2.10.1 vì vậy tôi đã kết thúc chạynpm config set prefix $NPM_PACKAGES
Calin

Tập lệnh sau tuyên bố sẽ tự động hóa việc này: github.com/glenpike/npm-g_nosudo
Mike R

Tôi sử dụng $HOME/.localthay thế cho tiền tố. Đó là một thư mục được sử dụng phổ biến hiện nay bởi các phần mềm khác để lưu trữ các tệp cục bộ.
Vaibhav K

2
Nếu bạn sử dụng :, echo 'prefix = ${NPM_PACKAGES}' >> ~/.npmrcđường dẫn không được mã hóa cứng .npmrc, nhưng npm sẽ đọc nó từ biến môi trường bất cứ khi nào npm chạy (lưu ý rằng tôi đã thay đổi "thành 'để ngăn trình bao thực thi echo mở rộng biến và tôi đã thêm {}xung quanh biến , vì đó là cú pháp được sử dụng trong .npmrc. Để làm cho nó hoạt động, tôi đã phải thay đổi .bashrcđể đọc:. export NPM_PACKAGES="$HOME/.npm-packages"Thêm exportbiến làm cho nó có sẵn cho npm. Không liên quan, tôi nghĩ bạn cũng cần phải thêm exportvào các biến khác.
Matthijs Kooijman

30

Câu trả lời của Jake đã được đăng vào năm 2012 và mặc dù hữu ích nhưng nó tham khảo các PPA Node.js của Chris Lea, những người không còn được cập nhật kể từ tháng 3 năm 2015.

Đây là các bước tôi sử dụng để cài đặt Node.js và npm trong thư mục chính của mình:

Cài đặt Node.js với nvm (không sudobắt buộc):

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
source ~/.bashrc
nvm install 7
npm install -g npm  # update npm

Bây giờ bạn có thể install -gkhông có sudovà mọi thứ đi vào~/.nvm/

Hoặc cài đặt Node.js mà không có nvm ( hướng dẫn chính thức ):

Cài đặt Node.js

  • Node.js v6 (LTS hiện tại tính đến tháng 5 năm 2017):

    curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
    sudo apt-get install -y nodejs
  • Node.js v7:

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

Thay đổi thư mục mặc định của npm thành thư mục cục bộ:

mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
export PATH="$HOME/.npm-global/bin:$PATH"  # ← put this line in .bashrc
source ~/.bashrc  # if you only updated .bashrc

Hoặc thay thế .npm-globalbằng thư mục bạn chọn.

Cập nhật npm và kiểm tra xem nó đã được cài đặt trong $HOMEthư mục của bạn chưa :

$ npm install npm -g
/home/<username>/.npm-global/bin/npm -> /home/<username>/.npm-global/lib/node_modules/npm/bin/npm-cli.js
/home/<username>/.npm-global/lib
└─┬ npm@3.10.6 
  ├─┬ glob@7.0.5 
   └── minimatch@3.0.2 
  ├── npm-user-validate@0.1.5 
  └── rimraf@2.5.3 

Giờ đây, bạn có thể install -gkhông cần sudovà không làm phiền các tệp hệ thống của mình.


Lựa chọn thứ 2 cũng được mô tả tại trang web tài liệu NPM: docs.npmjs.com/getting-started/...
Vadim

6

Giải pháp được đăng bởi Just Jake là tuyệt vời. Tuy nhiên, do một lỗi với npm> 1.4.10, nó có thể không hoạt động như mong đợi. (Xem cái nàycái này )

Trong khi lỗi được giải quyết, bạn có thể hạ cấp xuống npm 1.4.10 bằng cách làm theo các bước sau:

  1. Nhận xét dòng tiền tố trong $ HOME / .npmrc của bạn
  2. Chạy sudo npm install -g npm@1.4.10
  3. Đảm bảo rằng phiên bản npm phù hợp được cài đặt ( npm --version)
  4. Bỏ ghi chú dòng tiền tố trong $ HOME / .npmrc của bạn
  5. Tiến hành cài đặt gói chung của bạn trong thư mục chính của bạn !.

4

Vì python đã làm rất tốt virtualenv, tôi sử dụng nodeenv. So với nvm, bạn có thể tạo nhiều môi trường cho cùng một phiên bản nút (ví dụ: hai môi trường cho nút 0.10nhưng với các bộ gói khác nhau).

ENVNAME=dev1

#  create an environment
python -m virtualenv ${ENVNAME}

# switch to the newly created env
source ${ENVNAME}/bin/activate

# install nodeenv
pip install nodeenv

# install system's node into virtualenv
nodeenv --node=system --python-virtualenv

Readme khá tốt: https://github.com/ekalinin/nodeenv


3

Tôi đã sử dụng giải pháp @ just-jake một thời gian và thấy rằng nvm dễ thiết lập hơn. Ngoài ra, nó còn là giải pháp mạnh mẽ cho phép cài đặt và sử dụng các phiên bản khác nhau của nodejs.

Trên Ubuntu 14.04 hoặc 16.04:

  1. Cài đặt các gói điều kiện tiên quyết để xây dựng nodejs:

    sudo apt-get update
    sudo apt-get install build-essential libssl-dev
  2. Cài đặt nvm :

    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash

    Trong trường hợp có phiên bản nvm mới hơn, bạn có thể tìm thấy lệnh cài đặt thực tế trên trang web nvm .

  3. nvmtrình cài đặt sẽ thêm tập lệnh bootstrap vào ~/.bashrc, vì vậy bạn cần mở lại thiết bị đầu cuối để chạy nó hoặc thực hiện:

    source ~/.bashrc
  4. Bây giờ bạn có thể cài đặt bất kỳ nodejsphiên bản nào bạn thích, chuyển đổi giữa chúng, v.v.

    Sử dụng nvm ls-remoteđể liệt kê nodejscác phiên bản có sẵn .

    Để cài đặt, ví dụ, nodejsv4.2.4 , hãy làm:

    # install v4.2.4
    nvm install v4.2.4 
    # use nodejs v4.2.4 in the current terminal session
    nvm use v4.2.4
    # use v4.2.4 by default in new terminal session
    nvm alias default v4.2.4

2

Để mở rộng câu trả lời do Just Jake và user1533401 cung cấp: Tôi không thể hạ cấp vì tôi sử dụng dịch vụ lưu trữ được chia sẻ và nút được cài đặt trong thư mục hệ thống. Đây cũng là lý do tại sao tôi đã thay đổi thư mục nơi npm cài đặt các tập lệnh toàn cầu nếu tôi muốn nó làm điều đó. Đối với những người trong cùng một chiếc thuyền, đây là một bản sửa lỗi tạm thời khác mà tôi thấy hoạt động:

npm install -g --prefix=$(npm config get prefix) <package>

Lỗi là npm không đọc tệp cấu hình cho mỗi người dùng của bạn, nhưng việc chỉ định tệp đó mỗi khi bạn cài đặt tập lệnh chung sẽ khắc phục điều đó. Tìm thấy ở đây .



0

Các câu trả lời khác có các giải pháp lỗi thời: giải pháp của năm 2020 là sử dụng NPM_CONFIG_PREFIXbiến môi trường. (Xem chi tiết )

Ví dụ,

$ NPM_CONFIG_PREFIX="$HOME/.npm-packages" npm install -g ios-sim
/Users/<name>/.npm-packages/bin/ios-sim -> /Users/<name>/.npm-packages/lib/node_modules/ios-sim/bin/ios-sim
+ ios-sim@9.0.0
added 108 packages from 68 contributors in 3.094s
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.