Como definir o local personalizado para instalação local do pacote npm?


177

É possível especificar um destino de pacote personalizado para npm install, por meio de um sinalizador de comando ou variável de ambiente?

Por padrão, as instalações locais do npm acabam no node_modulesdiretório atual, mas eu quero que ele seja instalado em node_modulesum diretório diferente, por exemplo vendor/node_modules. Como posso fazer isso acontecer?


O que você está tentando realizar? isso foi discutido aqui: stackoverflow.com/questions/13668097/…
Pascal Belloncle

10
@ PascalBelloncle: Em vez de instalar pacotes em subdiretórios de ./node_modules, eu quero que o npm os instale em subdiretórios de ./vendor/node_modules. (Ou para saber que isso não é configurável).
pje

1
Entendi que é isso que você quer fazer, o que não acho que seja possível imediatamente. Além disso, exigir também não funcionaria. Então, eu estava perguntando por que você queria fazer isso. Talvez haja uma solução alternativa para fazer o que você deseja.
Pascal Belloncle

1
Estou instalando um pacote exclusivamente para o seu binário (ou seja, ele será usado apenas na linha de comando e nunca required), mas não quero instalá-lo globalmente.
pje

Entendo. Veja minha sugestão abaixo então.
Pascal Belloncle

Respostas:


180

TL; DR

Você pode fazer isso usando a --prefixbandeira e a --globalbandeira *.

pje@friendbear:~/foo $ npm install bower -g --prefix ./vendor/node_modules
bower@0.7.0 /Users/pje/foo/vendor/node_modules/bower

* Mesmo que seja uma instalação "global", os compartimentos instalados não serão acessíveis pela linha de comando, a menos que ~/foo/vendor/node_modulesexista no PATH.

TL; R

Cada atributo configurável de npmpode ser definido em qualquer um dos seis locais diferentes. Em ordem de prioridade:

  • Sinalizadores de linha de comando: --prefix ./vendor/node_modules
  • Variáveis ​​ambientais: NPM_CONFIG_PREFIX=./vendor/node_modules
  • Arquivo de configuração do usuário: $HOME/.npmrcou userconfigparam
  • Arquivo de configuração global: $PREFIX/etc/npmrcou userconfigparam
  • Arquivo de configuração embutido: path/to/npm/itself/npmrc
  • Configuração padrão: node_modules / npmconf / config-defs.js

Por padrão, os pacotes instalados localmente são acessados ./node_modules. os globais vão para a prefixvariável de configuração ( /usr/localpor padrão).

Você pode executar npm config listpara ver sua configuração atual e npm config editalterá-la.

PS

Em geral, npma documentação do é realmente útil. A seção de pastas é uma boa visão geral estrutural do npm e a seção de configuração responde a essa pergunta.


2
Como eu teste, na verdade, se seguir o comando acima, ele será instalado em ./vendor/node_modules/lib/bowerusonpm#3.8.0
e-cloud

2
Ao fazer isso, eu estou recebendo erroNo version provided in package.json
FooBar

Você escreve bins won't be accessible through the command line. O programa pode, naturalmente, ser chamado utilizando o caminho completo npm install eslint@3.4.0 -g --prefix c:\my_npm` calling c: \ my_npm \ eslint --fix my.js`
Bernhard Dobler

13
É possível obter algo semelhante com um arquivo package.json? ou seja, se eu executar npm installno diretório A com o arquivo package.json, os pacotes serão instalados no diretório B. Parece que esta solução é para pacotes individuais sendo instalados.
Ryan-Neal Mes

1
Existe alguma maneira de instalar todas as dependências usando esse método? npm installinstala dependências localmente. npm install X -g -prefix "..."instala o módulo X no prefixo, npm install -g -prefix "..."instala o pacote atual no prefixo.
AnnanFay

28

Se você deseja isso em config, pode definir o npm config da seguinte forma:

npm config set prefix "$(pwd)/vendor/node_modules"

ou

npm config set prefix "$HOME/vendor/node_modules"

Verifique sua configuração com

npm config ls -l

Ou como @pje diz e use a --prefixbandeira


4
Eu acredito que isso define o prefixo global? Isso npm installainda será instalado localmente, ./node_modulesmas npm install -gserá instalado no "$(pwd)/vendor/node_modules". Posso imaginar as configurações e depois esquecê-las, voltando mais tarde, me perguntando por que meus pacotes globais estão agindo de maneira estranha.
AnnanFay

13

No OSX, você pode acessar o usuário $HOME(provavelmente / Users / seunome /) e, se ele ainda não existir, criar um .npmrcarquivo (um arquivo que o npm usa para configuração do usuário) e criar um diretório para os pacotes npm ser instalado em (por exemplo, / Users / seunome / npm). Nesse arquivo .npmrc, defina "prefix" para o seu novo diretório npm, que será onde os pacotes npm instalados "globalmente" serão instalados; esses pacotes "globais" estarão obviamente disponíveis apenas para sua conta de usuário.

Em .npmrc:

prefix=${HOME}/npm

Em seguida, execute este comando na linha de comando:

npm config ls -l

Ele deve fornecer saída tanto na sua configuração local quanto na configuração global do npm, e você deve ver a configuração do seu prefixo local refletida, provavelmente perto do topo da longa lista de saída.

Por segurança, recomendo esta abordagem para configurar o comportamento npm da sua conta de usuário em exibir suas /usr/localpastas, o que vi recomendado em outro lugar.


9

No Windows 7, por exemplo, o seguinte conjunto de comandos / operações pode ser usado.

Crie uma variável de ambiente pessoal, as barras invertidas duplas são obrigatórias:

  • Nome variável: %NPM_HOME%
  • Valor variável: C:\\SomeFolder\\SubFolder\\

Agora, defina os valores de configuração para as novas pastas (nomes de arquivos de exemplo):

  • Defina a pasta npm

npm config set prefix "%NPM_HOME%\\npm"

  • Defina a pasta npm-cache

npm config set cache "%NPM_HOME%\\npm-cache"

  • Defina a pasta temporária npm

npm config set tmp "%NPM_HOME%\\temp"

Opcionalmente, você pode limpar o conteúdo das pastas originais antes que a configuração seja alterada.

  • Exclua o npm-cache npm cache clear

  • Listar os módulos npm npm -g ls

  • Exclua os módulos npm npm -g rm name_of_package1 name_of_package2


1
Obrigado, eu sigo as etapas. Mas ele cria um diretório chamado c: /% NPM_HOME% / npm, etc., em vez de c: / npm_home / npm
Jay

6

Depois de procurar por mim mesmo, querendo que vários projetos com dependências compartilhadas sejam mais secos, descobri:

  • A instalação local é a maneira do Nó para qualquer coisa que você queira usar via require()
  • A instalação global é para binários que você deseja em seu caminho, mas não se destina a nada via require()
  • Através de um meio de prefixo que você precisa adicionar apropriado bine mancaminhos para$PATH
  • npm link( info ) permite que você use uma instalação local como fonte para globais

→ siga o caminho do nó e instale localmente

ref:

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.