npm prefisso percorso globale


142

Sono più cauto del solito perché sono stato confuso dal comportamento di npmin passato.

Sono su un Mac e ho installato node.js tramite brew install node.

Ora che voglio eseguire jslint.jssulla riga di comando come comando, jslinttrovo che il modo canonico per ottenere ciò è sudo npm install -g jslintche ha funzionato correttamente con questo output:

$ sudo npm install -g jslint
npm http GET https://registry.npmjs.org/jslint
npm http 200 https://registry.npmjs.org/jslint
npm http GET https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http 200 https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http GET https://registry.npmjs.org/nopt
npm http 200 https://registry.npmjs.org/nopt
npm http GET https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http 200 https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http GET https://registry.npmjs.org/abbrev
npm http 200 https://registry.npmjs.org/abbrev
npm http GET https://registry.npmjs.org/abbrev/-/abbrev-l.0.4.tgz
npm http 200 https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz
/usr/local/share/npm/bin/jslint -> /usr/local/share/npm/lib/node_modules/jslint/
bin/jslint.js
jslint@0.1.9 /usr/local/share/npm/lib/node_modules/jslint
└── nopt@1.0.10 (abbrev@1.0.4)

Successivamente

$ jslint ply.js
zsh: command not found: jslint

a causa di /usr/local/share/npm/binnon essere nel mio $PATH.

1) Perché non brewha installato il npm binpercorso globale al percorso? Forse lo ha fatto, ma qualcosa zshnon fa che rovinarlo. Dove potrei trovarlo?
2) Devo farlo? (Aggiungi :/usr/local/share/npm/binall'esportato $PATHin fondo al mio ~/.zshrc)

Sembra che questo non sia il modo giusto di farlo perché se installo qualcos'altro in seguito (usando Homebrew o qualcosa del genere) dovrò aggiungerlo al mio script di avvio di zsh per impostare il percorso. Immagino in questo caso particolare sia solo una questione di npm install -gnon creare i giusti symlink in una posizione "corretta" (come /usr/local/binforse).

Penso che quello che farò è creare manualmente collegamenti simbolici all'interno /usr/local/bindi tutti i programmi con cui ho problemi e dovrebbe essere abbastanza buono per i miei scopi.

EDIT : lo sto aggiornando nel 2019, perché questa vecchia domanda è popolare ma ora obsoleta sia in termini di flusso di lavoro personale sia in termini di come installare al meglio il nodo e gestire le sue varie dipendenze.

Il mio flusso di lavoro personale è ora quello di utilizzare il programma di installazione ottenuto da nodejs.org per installare il nodo sui sistemi. In realtà mi fido di questo più del pacchetto homebrew stesso, perché sa meglio come gestire i file. Se si desidera modificare il nodo di sistema da 8.10 a 10.15, sia su Mac che su Windows, è sufficiente scaricare il programma di installazione da nodejs.org per 10.15 per il proprio sistema operativo. Il tentativo di aggiornare il nodo installato tramite homebrew ha sempre dimostrato di essere un approccio più difficile nella mia esperienza.

Inoltre, la cosa più importante da sottolineare è che l'uso di sudo come mostrato nella mia installazione npm dell'esempio jslint sopra è altamente scoraggiato; Sono abbastanza certo che i pacchetti homebrew non debbano mai essere installati o interagiti in alcun modo usando il superutente. Non dovrebbe essere necessario e porterà a mal di testa per i permessi dei file!

Inoltre raccomando ESLint su jslint e non uso jslint da anni.


Grazie, ora sono riparati. Di solito non sono così negligente, ma ho scritto questa domanda molto rapidamente
Steven Lu

@DaveNewton Di solito lo faccio, sì. Questa domanda era davvero sciatta, ma è una delle mie più popolari.
Steven Lu,

copiare il testo non è più semplice dello screenshot? comunque risolto.

1
@ saleemrashid1 ​​Ehi, intendevo farlo. L'hai davvero letto e copiato? Grazie.
Steven Lu,

3
Sì! Prego. Sto lavorando a un gioco e mentre aspettavo che NPM scaricasse roba l'ho fatto!

Risposte:


308

Estensione PATHcon:

export PATH=/usr/local/share/npm/bin:$PATH

non è un'idea terribile. Detto questo, non dovresti farlo.

Esegui questo:

npm config get prefix

L'impostazione predefinita su OS X è /usr/local, il che significa che npm eseguirà il collegamento simbolico dei binari /usr/local/bin, che dovrebbe essere già presente sul tuo PATH(specialmente se stai usando Homebrew).

Così:

  1. npm config set prefix /usr/local se è qualcos'altro, e
  2. Non usare sudocon npm! Secondo i documenti jslint , dovresti essere in grado di npm installfarlo.

Se hai installato npm come sudo ( sudo brew install), prova a reinstallarlo con semplicemente vecchio brew install. L'homebrew dovrebbe aiutarti a mantenerti libero sudo.


1
Grazie! npmsi rifiuta di installare a jslintlivello globale, però. npm install -g jslintnon riesce. Error: EACCES, open '/Users/user/.npm/564fcf84-jslint.lock'
Steven Lu,

2
Non dovrei farlo chown /usr/localse devo avere degli script che ci scrivono dei collegamenti senza richiedere sudo? Che ne dici di seguire questo per impostare nom / node ~/.localo qualcosa del genere?
Steven Lu,

2
DOLCE! Sono andato e ho annullato le varie directory depositate dall'utente rootnella mia directory ~/(da sudo rm -ron tmp/e a .npm/) e successivamente ho npm install -g jslintlavorato magnificamente. È bello che npm stesso sia un programma nodo ed è un po 'una prova di concetto della riga di comando JS per me che sto cominciando ad apprezzare ora che lo capisco un po' meglio.
Steven Lu,

2
@StevenLu Sì, chown-ing /usr/locale tutto ciò che contiene è una pratica standard su OS X. Vedi la pagina di risoluzione dei problemi sul wiki di Homebrew.
Trevor Burnham,

Sì, sembra che l' chowning /usr/localsia già avvenuto sulla mia macchina, altrimenti non npmfunzionerebbe senza sudoche non sia possibile depositare collegamenti in /usr/local/bin/ecc.
Steven Lu,

8

Ho passato un po 'di tempo su questo problema e l'interruttore PATH non stava aiutando. Il mio problema era il bug Homebrew / node / npm trovato qui - https://github.com/npm/npm/issues/3794

Se hai già installato il nodo usando Homebrew, prova **** Nota per commento che questo potrebbe non essere sicuro. Ha funzionato per me ma potrebbe avere conseguenze indesiderate. Sembra anche che l'ultima versione di Homebrew installi correttamente npm. Quindi probabilmente vorrei provare brew update, brew doctor, brew upgrade nodeecc prima di provare ****:

npm update -gf

Oppure, se si desidera installare il nodo con Homebrew e far funzionare npm, utilizzare:

brew install node --without-npm
curl -L https://npmjs.org/install.sh | sh

3
Raccomandare casualmente che le persone a livello globale forzino un aggiornamento non è una buona idea.
toxaq,

1
Seguire ciecamente il consiglio di qualcuno su Internet non è una buona idea.
Volte,

Il metodo force su -gf ce l'ha fatta per me. Grazie.
MEM

5

Uso brew e il prefisso era già impostato su:

$ npm config get prefix
/Users/[user]/.node

Ho notato che la cartella bin e lib erano di proprietà di root, il che ha impedito la solita installazione non sudo, quindi le ho ri-possedute per l'utente

$ cd /Users/[user]/.node
$ chown -R [user]:[group] lib
$ chown -R [user]:[group] bin

Quindi ho appena aggiunto il percorso al mio .bash_profile che si trova in / Users / [utente]

PATH=$PATH:~/.node/bin

3

brew non dovrebbe richiedere l'uso di sudo anche quando si esegue npm con -g. Questo potrebbe effettivamente creare più problemi lungo la strada.

In genere, brew o port ti consentono di aggiornare il tuo percorso in modo da non rischiare di rovinare il tuo .zshrc, .bashrc, .cshrc o qualsiasi tipo di shell che usi.


Infatti la birra non richiede e sconsiglia l'uso sudo. Stavo usando sudo su npm(perché qualcosa che ho letto mi ha detto di). Sono curioso di sapere dove è impostato il percorso. In realtà sembra che il programma di zshinstallazione esegua qualcosa che finisce per codificare il percorso (al momento dell'installazione di zsh) in .zshrccui non mi piace così tanto
Steven Lu

Tutto ciò che è installato npm dovrebbe essere installato in /usr/local. Lo /usrspazio dei nomi dei percorsi è riservato ai pacchetti ufficiali della tua distribuzione. /usr/local/binnel tuo $ PATH o no, è un problema di zsh.
Floby,

gli script brew non aggiungono nulla al tuo script di avvio, questo è qualcosa che devi fare. vedi madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x per un esempio.
Pascal Belloncle,

2

Sono riuscito a correggere Vue Cli nessun errore di comando nel modo seguente:

  • Nel terminale sudo nano ~/.bash_profileper modificare il tuo profilo bash.
  • Inserisci export PATH=$PATH:/Users/[your username]/.npm-packages/bin
  • Salva il file e riavvia il terminale
  • Ora dovresti essere in grado di usare vue create my-projected vue --versionecc.

L'ho fatto dopo aver installato l'ultimo Vue Cli da https://cli.vuejs.org/

In genere uso il filato, ma l'ho installato a livello globale con npm npm install -g @vue/cli. Puoi usare anche il filato, se lo desideriyarn global add @vue/cli

Nota: potrebbe essere necessario disinstallarlo prima a livello globale se è già installato: npm uninstall -g vue-cli

Spero che questo ti aiuti!


1
Questo sostanzialmente ha funzionato per me. Ho dovuto modificarlo per esportare PATH = $ PATH: / Users / [il tuo nome utente] /node_modules/.bin
Mike Carpenter,


0

Prova a correre:

PATH=$PATH:~/npm/bin

e quindi eseguire un test eseguendo expressnella riga di comando. Questo ha funzionato per me.


abbastanza sicuro che vuoi dire ~/.npm/bino qualcosa del genere. non ci dovrebbe essere una npmdirectory aggiunta alla tua home directory.
Steven Lu,

0

Se sono stati collegati i pacchetti di nodi usando il comando sudo

Quindi vai alla cartella in cui sono installati node_modules a livello globale.

Sui sistemi Unix sono normalmente collocati in / usr / local / lib / node o / usr / local / lib / node_modules quando installati a livello globale. Se si imposta la variabile di ambiente NODE_PATH su questo percorso, i moduli possono essere trovati per nodo.

Windows XP -% USERPROFILE% \ Dati applicazioni \ npm \ node_modules Windows 7 -% AppData% \ npm \ node_modules

e quindi eseguire il comando

ls -l

Questo fornirà l'elenco di tutti i node_modules globali e potrai vedere facilmente i moduli dei nodi collegati.


0

sudo brew non è più un'opzione, quindi se installi con brew a questo punto otterrai 2 cose davvero odiose: A: gli piace installare in /usr/local/optso secondo questo, / usr / local / shared. All'inizio non è un grosso problema, ma ho avuto problemi con il nodo PATH, specialmente quando ho installato lint. B: sei un po 'bloccato con i comandi sudo fino a quando non lo disinstalli e lo installi in questo modo o puoi ottenere lo stack da Bitnami

Raccomando questo metodo sull'opzione stack perché è pronto per l'uso se si dispone di più progetti. Se vai con lo stack MEAN premade dovrai impostare host virtuali in httpd.conf (più di un problema in questo stack rispetto a XAMPP), aggiorna il solito extra extra / vhosts.conf e / etc / hosts per ogni ulteriore progetto, a meno che non si desideri reimpostare e riavviare il server al termine dell'aggiornamento delle cose.


0

La soluzione semplice è ...

Basta mettere sotto il comando:

  1. sudo npm config get prefix

    se non è qualcosa del genere /usr/local, è necessario risolverlo utilizzando il comando seguente.

  2. sudo npm config set prefix /usr/local...

Ora funziona al 100%


Consiglio vivamente di evitare sudo con npm. Vedi la mia modifica.
Steven Lu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.