prefixo do caminho global npm

142

Estou sendo mais cauteloso do que o habitual, porque fiquei confuso com o comportamento do npmpassado.

Estou em um Mac e instalei o node.js completamente brew install node.

Agora que eu quero executar jslint.jsna linha de comando como o comando jslint, acho que a maneira canônica de fazer isso é sudo npm install -g jslintexecutada com êxito com esta saída:

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

Subseqüentemente

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

devido a /usr/local/share/npm/binnão estar no meu $PATH.

1) Por que brewnão instalou o npm bincaminho global para o caminho? Talvez tenha acontecido, mas algo zshestá estragando tudo. Onde eu posso encontrar isso?
2) Devo fazer isso? (Anexe :/usr/local/share/npm/binao exportado $PATHna parte inferior do meu ~/.zshrc)

Parece que este não é o caminho certo para fazê-lo, porque se eu instalar algo mais tarde (usando o Homebrew ou algo assim), precisarei anexá-lo ao meu script de inicialização zsh para definir o caminho. Eu acho que, neste caso específico, é apenas uma questão de npm install -gnão criar os links simbólicos corretos em um local "adequado" (como /usr/local/bintalvez).

Acho que o que farei é criar manualmente links simbólicos /usr/local/binpara todos os programas com problemas e deve ser bom o suficiente para meus propósitos.

EDIT : Estou atualizando isso em 2019, porque essa pergunta antiga é popular, mas agora desatualizada em termos de fluxo de trabalho pessoal e também em termos de como melhor proceder para instalar o nó e gerenciar suas várias dependências.

Meu fluxo de trabalho pessoal agora é usar o instalador obtido no nodejs.org para instalar o nó nos sistemas. Na verdade, confio nisso mais do que o próprio pacote homebrew, porque ele sabe como gerenciar os arquivos. Se você deseja alterar o nó do sistema de 8.10 para 10.15, seja no Mac ou no Windows, basta baixar o instalador do nodejs.org para 10.15 para o seu sistema operacional. Tentar atualizar o nó instalado via homebrew sempre provou ser uma abordagem mais difícil na minha experiência.

Além disso, a principal coisa a destacar é que o uso do sudo, como mostrado no meu exemplo de instalação do jslint do npm, é altamente desencorajado; Estou bastante certo de que os pacotes homebrew nunca devem ser instalados ou interagidos com o superusuário. Não deve ser necessário e levará a dores de cabeça com permissão de arquivo!

Além disso, eu recomendo o ESLint sobre o jslint e não o utilizo há anos.

Steven Lu
fonte
Obrigado, eles estão consertados agora. Eu não sou normalmente tão descuidada, mas eu digitei essa pergunta-se muito rapidamente
Steven Lu
@DaveNewton Eu costumo fazer isso, sim. Essa pergunta foi muito superficial, mas é uma das minhas mais populares.
Steven Lu
não é mais fácil copiar texto do que captura de tela? de qualquer maneira corrigido.
1
@ saleemrashid1 ​​Ei, eu pretendia fazer isso. Você realmente leu e copiou? Obrigado.
Steven Lu
3
Sim! De nada. Estou trabalhando em um jogo e, enquanto esperava o NPM baixar coisas, fiz isso!

Respostas:

308

Estendendo seu PATHcom:

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

Não é uma péssima ideia. Dito isto, você não deveria ter que fazer isso.

Rode isto:

npm config get prefix

O padrão no OS X é /usr/local, o que significa que o npm fará o link simbólico dos binários /usr/local/bin, que já devem estar no seu PATH(especialmente se você estiver usando o Homebrew).

Assim:

  1. npm config set prefix /usr/local se é outra coisa, e
  2. Não use sudocom npm! De acordo com os documentos do jslint , você deve conseguir npm install.

Se você instalou o npm como sudo ( sudo brew install), tente reinstalá-lo com o ol 'simples brew install. O Homebrew deve ajudar a mantê-lo sudolivre.

Trevor Burnham
fonte
1
Obrigado! npmse recusa a instalar jslintglobalmente, no entanto. npm install -g jslintfalha. Error: EACCES, open '/Users/user/.npm/564fcf84-jslint.lock'
Steven Lu
2
Eu não precisaria, se chown /usr/localquiser que algum script escreva links nele sem a necessidade de sudo? Que tal seguir isso para configurar nom / node ~/.localou algo assim?
Steven Lu
2
DOCE! Eu desfiz os vários diretórios depositados pelo usuário rootno meu ~/diretório (por sudo rm -ron tmp/e a .npm/) e, posteriormente, npm install -g jslinttrabalhei lindamente. É interessante que o próprio npm seja um programa de nó e seja um pouco de uma prova de conceito da linha de comando JS para mim, que estou começando a apreciar agora que entendo um pouco melhor.
Steven Lu
2
@StevenLu Sim, chown-ing /usr/locale tudo mais são práticas padrão no OS X. Consulte a página de solução de problemas no wiki do Homebrew.
Trevor Burnham
Sim, parece que o chowning /usr/localjá ocorreu na minha máquina, caso contrário, npmet al correr sem sudonão seria capaz de depositar links em /usr/local/bin/etc.
Steven Lu
8

Passou um tempo nessa questão, e a opção PATH não estava ajudando. Meu problema foi o bug Homebrew / node / npm encontrado aqui - https://github.com/npm/npm/issues/3794

Se você já instalou o nó usando o Homebrew, tente **** Observe nos comentários que isso pode não ser seguro. Funcionou para mim, mas poderia ter consequências não intencionais. Parece também que a versão mais recente do Homebrew instala corretamente o npm. Então, provavelmente eu iria tentar brew update, brew doctor, brew upgrade nodeetc antes de tentar ****:

npm update -gf

Ou, se você deseja instalar o nó com o Homebrew e executar o npm, use:

brew install node --without-npm
curl -L https://npmjs.org/install.sh | sh
YPCrumble
fonte
3
Recomendar casualmente que as pessoas forçam globalmente uma atualização não é uma boa ideia.
toxaq
1
Seguir cegamente o conselho de alguém na internet não é uma boa ideia.
Volte
O método force no -gf fez isso por mim. Obrigado.
MEM
5

Eu uso o brew e o prefixo já estava definido para:

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

Eu notei que as pastas bin e lib eram de propriedade do root, o que impedia a instalação não-sudo usual, então, eu as detive novamente ao usuário

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

Acabei de adicionar o caminho para o meu .bash_profile, localizado em / Users / [user]

PATH=$PATH:~/.node/bin
Greg
fonte
3

O brew não deve exigir que você use o sudo mesmo quando estiver executando o npm com -g. Isso pode realmente criar mais problemas no caminho.

Normalmente, o brew ou port permitem que você atualize seu caminho para que não arrisque atrapalhar o seu .zshrc, .bashrc, .cshrc ou qualquer outro tipo de shell que você usa.

Pascal Belloncle
fonte
Na verdade, a fermentação não requer e recomenda contra o uso de sudo. Eu estava usando o sudo on npm(porque algo que li me disse para). Estou curioso sobre onde procurar como o caminho está definido. Na verdade, parece que o zshinstalador é executado algo que acaba por codificar o caminho (no momento da instalação do zsh) para o .zshrcqual eu não estou gostando muito
Steven Lu
Qualquer coisa instalada por npm deve ser instalada em /usr/local. O /usrespaço para nome do caminho é reservado para os pacotes oficiais da sua distribuição. /usr/local/binno seu $ PATH ou não, é um problema do zsh.
Floby
os scripts de preparação não adicionam nada ao script de inicialização, é algo que você precisa fazer. consulte madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x para obter um exemplo.
Pascal Belloncle 11/02
2

Consegui corrigir o erro Vue Cli no command, fazendo o seguinte:

  • No terminal sudo nano ~/.bash_profile para editar seu perfil do bash.
  • Adicionar export PATH=$PATH:/Users/[your username]/.npm-packages/bin
  • Salvar arquivo e reiniciar o terminal
  • Agora você deve poder usar vue create my-projecte vue --versionetc.

Fiz isso depois de instalar o Vue Cli mais recente em https://cli.vuejs.org/

Geralmente uso fios, mas instalei isso globalmente com o npm npm install -g @vue/cli. Você também pode usar fios se quiseryarn global add @vue/cli

Nota: pode ser necessário desinstalá-lo primeiro globalmente, se você já o tiver instalado: npm uninstall -g vue-cli

Espero que isto ajude!

Mark Fasel
fonte
1
Isso basicamente funcionou para mim. Eu tive que ajustá-lo para export PATH = $ PATH: / Users / [seu nome de usuário] /node_modules/.bin
Mike Carpenter
0

Tente executar:

PATH=$PATH:~/npm/bin

e faça um teste executando expressna linha de comando. Isso funcionou para mim.

kiko carisse
fonte
tenho certeza que você quer dizer ~/.npm/binou algo assim. não deve haver um npmdiretório adicionado ao seu diretório doméstico.
Steven Lu
0

Se você vinculou os pacotes de nós usando o comando sudo

Em seguida, vá para a pasta em que node_modules está instalado globalmente.

Nos sistemas Unix, eles são normalmente colocados em / usr / local / lib / node ou / usr / local / lib / node_modules quando instalados globalmente. Se você definir a variável de ambiente NODE_PATH para esse caminho, os módulos poderão ser encontrados por nó.

Windows XP -% USERPROFILE% \ Dados do Aplicativo \ npm \ node_modules Windows 7 -% AppData% \ npm \ node_modules

e depois execute o comando

ls -l

Isso fornecerá a lista de todos os node_modules globais e você poderá ver facilmente os módulos de nós vinculados.

selftaught91
fonte
0

O sudo brew não é mais uma opção, portanto, se você instalar o brew nesse momento, obterá duas coisas realmente desagradáveis: R: ele gosta de instalar /usr/local/optsou de acordo com isso, / usr / local / shared. Isso não é grande coisa no começo, mas tive problemas com o nó PATH, especialmente quando instalei o lint. B: você está meio que preso aos comandos sudo até desinstalá-lo e instalá-lo dessa maneira ou obter a pilha do Bitnami

Eu recomendo esse método sobre a opção de pilha porque está pronto para ser usado se você tiver vários projetos. Se você usar a pilha MEAN pré-fabricada, terá que configurar hosts virtuais no httpd.conf (mais do que o XAMPP é uma chatice nessa pilha), atualize normalmente os seus extras / vhosts.conf e / etc / hosts para cada atualização adicional. projeto, a menos que você queira nomear e reiniciar seu servidor quando terminar de atualizar as coisas.

anjo
fonte
0

Solução simples é ...

Basta colocar o comando abaixo:

  1. sudo npm config get prefix

    se não for algo assim /usr/local, você precisará corrigi-lo usando o comando abaixo.

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

Agora está 100% funcionando bem

Yogesh Kumar
fonte
É altamente recomendável evitar o sudo com npm. Veja minha edição.
Steven Lu