Installeer NPM in homedirectory met distributie nodejs-pakket (Ubuntu)

Ik wil graag de distributiepakketten van Node.js gebruiken (of de chris-lea ppavoor recentere releases) maar installeer NPM in mijn homedirectory.

Dit lijkt misschien kieskeurig, maar het is een vrij idiomatische manier voor ontwikkelaars die polyglot/github gebruiken om taalruntime/bibliotheekomgevingen onder Linux in te stellen: distro-pakketten voor de runtime, bibliotheken van derden in een omgeving per gebruiker (zie virtualenv, RVM – RVM zal ook Ruby voor u bouwen als u dat wilt). Indien nodig zal ik node lokaal bouwen, maar het is een PITA omdat Node een incidentele ontwikkelingsvereiste wordt voor veel projecten.


Antwoord 1, autoriteit 100%

NPM zal al lokale pakketten in uw projecten installeren, maar ik houd het systeem nog steeds graag uit de buurt van de bestanden van mijn besturingssysteem. Hier is hoe ik voorstel om Nodejs-pakketten te compartimenteren:

Installeer Nodejs en NPM via de chris-lea PPA. Vervolgens heb ik een pakketroot in mijn homedir ingesteld om de “globale” pakketten van Node te bewaren:

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

Stel NPM in om deze map te gebruiken voor zijn globale pakketinstallaties:

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

Configureer uw PATH en MANPATH om opdrachten in uw $NPM_PACKAGES-voorvoegsel te zien door het volgende toe te voegen aan uw .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"

Als je nu een npm install -gdoet, zal NPM de bibliotheken installeren in ~/.npm-packages/lib/node_modulesen uitvoerbare tools koppelen aan ~/.npm-packages/bin, die in je PATHstaat.

Gebruik gewoon npm install -gzoals je normaal zou doen:

[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
[email protected] /home/justjake/.npm-packages/lib/node_modules/coffee-script
[justjake@marathon:~] $ which coffee
/home/justjake/.npm-packages/bin/coffee

Antwoord 2, autoriteit 17%

Jake’s antwoord is in 2012 geplaatst en hoewel het nuttig is, verwijst het naar Chris Lea’s Node.js PPA’s die sinds maart 2015 niet meer zijn bijgewerkt.

Dit zijn de stappen die ik gebruik om Node.js en npm in mijn homedirectory te installeren:

Installeer Node.js met nvm(geen sudovereist) :

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

Nu kun je install -ginstalleren zonder sudoen alles gaat in ~/.nvm/

Of installeer Node.js zonder nvm (officiële instructies):

Installeer Node.js

  • Node.js v6 (huidige LTS vanaf mei 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
    

Verander de standaardmap van npm in een lokale:

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

U kunt ook .npm-globalvervangen door de directory van uw keuze.

Update npm en controleer of het is geïnstalleerd in uw $HOMEdirectory:

$ 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] 

Je kunt nu install -ginstalleren zonder sudoen zonder te knoeien met je systeembestanden.


Antwoord 3, autoriteit 3%

De oplossing van Just Jake is geweldig. Echter, vanwege een bug met npm > 1.4.10 werkt het mogelijk niet zoals verwacht. (Zie diten dit)

Terwijl de bug is opgelost, kunt u downgraden naar npm 1.4.10 door deze stappen te volgen:

  1. Reageer op de prefixregel in uw $HOME/.npmrc
  2. Voer sudo npm install -g [email protected]
  3. uit

  4. Zorg ervoor dat de juiste versie van npm is geïnstalleerd (npm --version)
  5. Maak het commentaar op de prefixregel in uw $HOME/.npmrc ongedaan
  6. Ga door met het installeren van uw globale pakketten in uw thuismap!.

Antwoord 4, autoriteit 2%

Omdat python al geweldig werk levert virtualenv, gebruik ik nodeenv. Vergeleken met nvmkunt u meerdere omgevingen maken voor dezelfde node-versie (bijvoorbeeld twee omgevingen voor node 0.10maar met verschillende sets pakketten).

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

De readme is redelijk goed:
https://github.com/ekalinin/nodeenv


Antwoord 5

Ik heb een tijdje @just-jake oplossinggebruikt en ontdekte dat nvmis eenvoudiger in te stellen.
Het is ook een krachtige oplossing waarmee verschillende versies van nodejskunnen worden geïnstalleerd en gebruikt.

Op Ubuntu 14.04 of 16.04:

  1. Installeer vereiste pakketten voor het bouwen van nodejs:

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

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

    In het geval dat er een nieuwere versie van nvm beschikbaar is, kun je de daadwerkelijke installatieopdracht vinden op de nvm-site.

  3. nvminstallatieprogramma zal bootstrap-script toevoegen aan ~/.bashrc, dus je moet ofwel de terminal opnieuw openen om het uit te voeren, of om het volgende te doen:

    source ~/.bashrc
    
  4. Je kunt nu elke gewenste nodejs-versie installeren, ertussen schakelen, enz.

    Gebruik nvm ls-remoteom beschikbare nodejs-versies weer te geven.

    Om bijvoorbeeld nodejsv4.2.4 te installeren:

    # 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
    

Antwoord 6

Zoals al vermeld hieren hier

npm config set prefix ~
echo export PATH=\$PATH:\~/bin >> ~/.bashrc
. ~/.bashrc

Antwoord 7

Andere antwoorden hebben verouderde oplossingen: de oplossing van 2020 gebruikt de omgevingsvariabele NPM_CONFIG_PREFIX. (Zie details)

Bijvoorbeeld

$ 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

Antwoord 8

Om het antwoord van Just Jake en user1533401 uit te breiden: ik kan niet downgraden omdat ik gedeelde hosting gebruik en het knooppunt in een systeemdirectory is geïnstalleerd. Dit is ook de reden waarom ik de map heb gewijzigd waarin npm globale scripts installeert als ik dat wil. Voor degenen die in hetzelfde schuitje zitten, hier is nog een tijdelijke oplossing die ik heb gevonden:

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

De fout is dat npm je configuratiebestand per gebruiker niet leest, maar het elke keer specificeert dat je een globaal script installeert, lost dat op. hiergevonden.


Antwoord 9

Ik heb een iets andere oplossing voor een soortgelijk probleem, omdat ik npmwereldwijd heb geïnstalleerd, zodat ik het in de terminal van mijn macOS-systeem kan gebruiken. Ik heb het gewoon lokaal geïnitialiseerd in de hoofdmap van mijn repository met het commando:

npm init --yes

Dit deed de truc om me in staat te stellen knooppuntpakketten te installeren in de lokale hoofdmap op /node_modules met de bestanden “package.json” en “package-lock.json” in plaats van in de thuismap van de gebruiker.


Antwoord 10

Tenminste op Ubuntu is de standaardconfiguratie voor systeembrede npmdat npm install --globalpakketten probeert te installeren op /usr/lib/node_modules. Om een ​​andere standaard voor uw eigen gebruikersaccount in te stellen, voert u het volgende één keer uit:

mkdir -p ~/.npm/lib/bin
npm config set prefix "~/.npm/lib"

Daarnaast wil je het volgende fragment in .profile:

# set PATH so it includes user's private .npm/lib/bin if it exists
if [ -d "$HOME/.npm/lib/bin" ] ; then
    PATH="$HOME/.npm/lib/bin:$PATH"
fi

Als u nu iets installeert met npm install --global packagename, zal het op de juiste locatie terechtkomen en kan het worden gevonden in uw PATH (mogelijk moet u uitloggen en opnieuw inloggen voor .profilewijzigingen worden doorgevoerd).

Natuurlijk kunt u in plaats daarvan een andere map selecteren. ~/.config/npmkan bijvoorbeeld zinvol zijn voor moderne systemen.


Antwoord 11

U kunt npm-usergebruiken om automatisch in te stellen npmom pakketten in de mappen van uw gebruiker te installeren in plaats van in die van het systeem. Geen root-rechten nodig.

Hier is een link naar het script, instructies over hoe het te gebruiken en informatie over opties. Het werkt op macOS, Linux, *BSD en Windows.

Je kunt het als volgt uitvoeren:

$ curl -s "https://raw.githubusercontent.com/alexdelorenzo/npm-user/main/npm-user.sh" | bash

Nadat je het hebt uitgevoerd, zal het gebruik van npm install -g <package>pakketten in de mappen van je gebruiker installeren zonder dat je sudohoeft te gebruiken.

Hier is de code als je deze wilt kopiëren en plakken in je console:

#!/usr/bin/env bash
# Copyright 2022 Alex DeLorenzo <alexdelorenzo.dev>. Licensed under the GPLv3.
export ROOT="${1:-$HOME}"
export NPM_DIR=".npm-packages"
export NPM_ROOT="$ROOT/$NPM_DIR"
export NPM_BIN="$NPM_ROOT/bin"
export NPM_MAN="$NPM_ROOT/share/man"
export BASH_RC="$HOME/.bashrc"
export ZSH_RC="$HOME/.zshrc"
export DEFAULT_RC="$BASH_RC"
export NULL="/dev/null"
test $OSTYPE == win* &&
  export NULL="NUL"
quiet() {
  "$@" &> "$NULL"
}
create-paths() {
  local bin="${1:-$NPM_BIN}"
  local man="${2:-$NPM_MAN}"
  mkdir --parents --verbose "$bin"
  mkdir --parents --verbose "$man"
}
set-prefix() {
  npm config set prefix "$NPM_ROOT"
}
already-added() {
  local rc="${1:-$DEFAULT_RC}"
  local bin="${2:-$NPM_BIN}"
  local line="export PATH=\"\$PATH:$bin\""
  quiet grep "$line" "$rc"
}
add-to-path () {
  local rc="${1:-$DEFAULT_RC}"
  local bin="${2:-$NPM_BIN}"
  local man="${3:-$NPM_MAN}"
  cat <<EOF
export PATH="\$PATH:$bin"
export MANPATH="\${MANPATH:-\$(manpath)}:$man"
export NPM_PACKAGES="$NPM_ROOT"
EOF
}
main() {
  local rc="${1:-$DEFAULT_RC}"
  local bin="${2:-$NPM_BIN}"
  local man="${3:-$NPM_MAN}"
  printf "Creating $bin and $man\n"
  create-paths "$bin" "$man"
  printf "Setting npm prefix.\n"
  set-prefix
  if ! already-added "$rc" "$bin"; then
    printf "Writing to %s.\n" "$rc"
    add-to-path "$rc" "$bin" "$man" >> "$rc"
  fi
  printf "Done.\n\n"
  printf "To load the changes in this shell, run:\n"
  printf "\tsource $rc\n"
}
main "$2" "$3" "$4"

Other episodes