Zainstaluj NPM w katalogu domowym za pomocą pakietu dystrybucyjnego nodejs (Ubuntu)

94

Chciałbym użyć pakietów dystrybucyjnych Node.js (lub chris-lea ppa dla nowszych wersji), ale zainstalować NPM w moim katalogu domowym.

Może się to wydawać wybredne, ale jest to dość idiomatyczny sposób dla programistów korzystających z polyglot / github na konfigurację środowisk wykonawczych / bibliotek języka w systemie Linux: pakiety dystrybucji dla środowiska wykonawczego, biblioteki innych firm w środowisku dla każdego użytkownika (patrz virtualenv, RVM - RVM jeśli chcesz, stworzy też Rubiego). W razie potrzeby zbuduję węzeł lokalnie, ale jest to PITA, ponieważ Node staje się przypadkowym wymaganiem programistycznym dla wielu projektów.

Eric Drechsel
źródło
Zobacz także stackoverflow.com/questions/19352976/…
Colonel Panic,

Odpowiedzi:

203

NPM zainstaluje już lokalne pakiety w twoich projektach, ale nadal lubię trzymać system z dala od plików mojego systemu operacyjnego. Oto, jak sugeruję podział pakietów Nodejs:

Zainstaluj Nodejs i NPM za pośrednictwem chris-lea PPA. Następnie ustawiłem katalog główny pakietu w moim katalogu domowym, aby przechowywać pakiety „globalne” Node:

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

Ustaw NPM, aby używał tego katalogu do instalacji pakietów globalnych:

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

Skonfiguruj PATH i MANPATH, aby wyświetlić polecenia w prefiksie $ NPM_PACKAGES, dodając następujące elementy do pliku .zshrc / .bashrc:

# 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"

Teraz, gdy wykonasz operację npm install -g, NPM zainstaluje biblioteki ~/.npm-packages/lib/node_modulesi połączy narzędzia wykonywalne, do ~/.npm-packages/binktórych znajduje się plik PATH.

Po prostu użyj npm install -gtak jak zwykle:

[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
Tylko Jake
źródło
2
Jeśli jesteś na wspólnym systemie, w którym nodejest zainstalowany, ale npmnie jest, należy wykonać instalację w powyższej odpowiedzi, a następnie npm_config_prefix=$NPM_PACKAGES curl -L https://npmjs.org/install.sh | shdostać się npmsam zainstalować w swoim katalogu domowym.
Tim Lewis
1
Zestaw prefiksów nie działa u mnie na npm 2.10.1, więc skończyło się na uruchomieniunpm config set prefix $NPM_PACKAGES
Calin
Poniższy skrypt twierdzi, że zautomatyzuje to: github.com/glenpike/npm-g_nosudo
Mike R
$HOME/.localZamiast tego używam przedrostka. Jest to obecnie powszechnie używany folder przez inne oprogramowanie do przechowywania plików lokalnych.
Vaibhav K
2
Jeśli używasz echo 'prefix = ${NPM_PACKAGES}' >> ~/.npmrc:, ścieżka nie jest zakodowana na stałe .npmrc, ale npm odczyta ją ze zmiennej środowiskowej za każdym razem, gdy npm zostanie uruchomiona (uwaga zmieniłem "na ', aby zapobiec rozwinięciu zmiennej przez powłokę wykonującą echo i dodałem {}wokół zmiennej , ponieważ jest to składnia używana w .npmrc. Aby to działało, musiałem zmienić, .bashrcaby przeczytać: export NPM_PACKAGES="$HOME/.npm-packages".Dodanie exportsprawia, że ​​jest on dostępny dla npm. Niepowiązane, myślę, że musiałbyś dodać exportrównież inne zmienne.
Matthijs Kooijman
31

Odpowiedź Jake'a została opublikowana w 2012 roku i chociaż jest przydatna, odnosi się do umów PPA Chrisa Lei Node.js, które nie są już aktualizowane od marca 2015 roku.

Oto kroki, których używam, aby zainstalować Node.js i npm w moim katalogu domowym:

Zainstaluj Node.js z nvm (nie jest sudowymagane):

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

Teraz możesz install -gbezsudo i wszystko wchodzi~/.nvm/

Lub zainstaluj Node.js bez nvm ( oficjalne instrukcje ):

Zainstaluj Node.js.

  • Node.js v6 (obecny LTS od maja 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
    

Zmień domyślny katalog npm na lokalny:

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

Alternatywnie wymienić .npm-global wybranym katalogiem.

Zaktualizuj npm i sprawdź, czy jest zainstalowany w Twoim $HOMEkatalogu:

$ 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
└─┬ [email protected] 
  ├─┬ [email protected] 
  │ └── [email protected] 
  ├── [email protected] 
  └── [email protected] 

Teraz możesz install -gbez sudoi bez ingerowania w pliki systemowe.

Maxime R.
źródło
Druga opcja jest również opisana w witrynie NPM docs: docs.npmjs.com/getting-started/ ...
Vadim,
6

Rozwiązanie opublikowane przez Just Jake jest świetne. Jednak z powodu błędu z npm> 1.4.10 może nie działać zgodnie z oczekiwaniami. (Zobacz to i to )

Po usunięciu błędu możesz przejść na starszą wersję do npm 1.4.10, wykonując następujące kroki:

  1. Skomentuj linię przedrostka w swoim $ HOME / .npmrc
  2. Biegać sudo npm install -g [email protected]
  3. Upewnij się, że zainstalowana jest właściwa wersja npm ( npm --version)
  4. Odkomentuj linię prefiksu w swoim $ HOME / .npmrc
  5. Kontynuuj instalację pakietów globalnych w folderze domowym !.
user1533401
źródło
4

Ponieważ Python już wykonuje świetną robotę virtualenv, używam nodeenv. W porównaniu do nvm, można utworzyć wiele środowisk dla tej samej wersji węzła (np. Dwa środowiska dla węzła, 0.10ale z różnymi zestawami pakietów).

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

Plik Readme jest całkiem niezły: https://github.com/ekalinin/nodeenv

dnozay
źródło
3

Używałem rozwiązania @ just-jake przez jakiś czas i stwierdziłem, że nvm jest łatwiejsze w konfiguracji. Jest to również potężne rozwiązanie, które pozwala na instalację i używanie różnych wersjinodejs .

W systemie Ubuntu 14.04 lub 16.04:

  1. Zainstaluj wstępnie wymagane pakiety do tworzenia nodejs:

    sudo apt-get update
    sudo apt-get install build-essential libssl-dev
    
  2. Zainstaluj nvm :

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

    W przypadku gdy będzie dostępna nowsza wersja nvm, aktualne polecenie instalacji można znaleźć na stronie nvm .

  3. nvminstalator doda skrypt bootstrap do ~/.bashrc, więc musisz albo ponownie otworzyć terminal, aby go uruchomić, albo zrobić:

    source ~/.bashrc
    
  4. Teraz możesz zainstalować dowolny nodejs wersję, przełączać się między nimi itp.

    Posługiwać się nvm ls-remote aby wyświetlić listę dostępnychnodejs wersji.

    Aby zainstalować na przykład nodejswersję 4.2.4 , wykonaj następujące czynności:

    # 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
    
rutsky
źródło
2

Aby rozwinąć odpowiedź udzieloną przez Just Jake i user1533401: Nie mogę przejść na starszą wersję, ponieważ używam hostingu współdzielonego, a węzeł jest zainstalowany w katalogu systemowym. Dlatego też zmieniłem katalog, w którym npm instaluje globalne skrypty, jeśli chcę, żeby to zrobiło. Dla tych, którzy są na tej samej łodzi, oto kolejna tymczasowa poprawka, która działa:

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

Błąd polega na tym, że npm nie odczytuje pliku konfiguracyjnego dla użytkownika, ale określanie go za każdym razem, gdy instalujesz skrypt globalny, rozwiązuje ten problem. Znaleziono tutaj .

Bart Louwers
źródło
2

Jak już wspomniano tutaj i tutaj

npm config set prefix ~
echo export PATH=\$PATH:\~/bin >> ~/.bashrc
. ~/.bashrc
rofrol
źródło
0

Inne odpowiedzi mają przestarzałe rozwiązania: rozwiązanie 2020 wykorzystuje NPM_CONFIG_PREFIXzmienną środowiskową. (Zobacz szczegóły )

Na przykład,

$ 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
+ [email protected]
added 108 packages from 68 contributors in 3.094s
Byoungchan Lee
źródło