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 -g
doet, zal NPM de bibliotheken installeren in ~/.npm-packages/lib/node_modules
en uitvoerbare tools koppelen aan ~/.npm-packages/bin
, die in je PATH
staat.
Gebruik gewoon npm install -g
zoals 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 sudo
vereist) :
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 -g
installeren zonder sudo
en 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-global
vervangen door de directory van uw keuze.
Update npm en controleer of het is geïnstalleerd in uw $HOME
directory:
$ 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 -g
installeren zonder sudo
en 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:
- Reageer op de prefixregel in uw $HOME/.npmrc
- Voer
sudo npm install -g [email protected]
- Zorg ervoor dat de juiste versie van npm is geïnstalleerd (
npm --version
) - Maak het commentaar op de prefixregel in uw $HOME/.npmrc ongedaan
- Ga door met het installeren van uw globale pakketten in uw thuismap!.
uit
Antwoord 4, autoriteit 2%
Omdat python al geweldig werk levert virtualenv
, gebruik ik nodeenv
. Vergeleken met nvm
kunt u meerdere omgevingen maken voor dezelfde node-versie (bijvoorbeeld twee omgevingen voor node 0.10
maar 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 nodejs
kunnen worden geïnstalleerd en gebruikt.
Op Ubuntu 14.04 of 16.04:
-
Installeer vereiste pakketten voor het bouwen van
nodejs
:sudo apt-get update sudo apt-get install build-essential libssl-dev
-
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.
-
nvm
installatieprogramma 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
-
Je kunt nu elke gewenste
nodejs
-versie installeren, ertussen schakelen, enz.Gebruik
nvm ls-remote
om beschikbarenodejs
-versies weer te geven.Om bijvoorbeeld
nodejs
v4.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
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 npm
wereldwijd 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 npm
dat npm install --global
pakketten 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 .profile
wijzigingen worden doorgevoerd).
Natuurlijk kunt u in plaats daarvan een andere map selecteren. ~/.config/npm
kan bijvoorbeeld zinvol zijn voor moderne systemen.
Antwoord 11
U kunt npm-user
gebruiken om automatisch in te stellen npm
om 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 sudo
hoeft 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"