Por que precisamos instalar o gulp global e localmente?

292

2 manuais sobre o gulp dizem que eu preciso instalar o gulp primeiro globalmente (com sinalizador -g) e depois mais uma vez localmente. Por que eu preciso disso?

Stepan Suvorov
fonte
12
A página "Introdução" do projeto diz a mesma coisa. (Também não diz porquê.)
TJ Crowder
11
Eu gostaria que o npm pudesse usar globalmente um pacote de dependência instalado com a mesma versão do pacote local. 5MB de coisas glup para cada diretório do projeto: /
Ciantic
@Ciantic No guarantes, but ... ➪ stackoverflow.com/a/25879563/444255
Frank

Respostas:

238

Ao instalar uma ferramenta globalmente, ela deve ser usada por um usuário como um utilitário de linha de comando em qualquer lugar, inclusive fora dos projetos de nós. As instalações globais para um projeto de nó são ruins porque dificultam a implantação.

npm 5.2+

O npxutilitário que acompanha o pacote npm 5.2resolve esse problema. Com ele, você pode chamar utilitários instalados localmente, como utilitários instalados globalmente (mas você deve iniciar o comando npx). Por exemplo, se você desejar chamar um instalado localmente eslint, poderá:

npx eslint .

npm <5,2

Quando usado em um scriptcampo do seu package.json, npmprocura node_modulesa ferramenta e também os módulos instalados globalmente, para que a instalação local seja suficiente.

Então, se você está satisfeito com (no seu package.json):

"devDependencies": {
    "gulp": "3.5.2"
}
"scripts": {
    "test": "gulp test"
}

etc. e executando com npm run testisso, você não precisa da instalação global.

Ambos os métodos são úteis para configurar as pessoas com o seu projeto, uma vez que sudonão é necessário. Isso também significa que gulpserá atualizado quando a versão for lançada no package.json, para que todos usem a mesma versão do gulp ao desenvolver com o seu projeto.

Termo aditivo:

Parece que o gulp tem um comportamento incomum quando usado globalmente. Quando usado como uma instalação global, o gulp procura um gulp instalado localmente para passar o controle. Portanto, uma instalação global gulp requer uma instalação local gulp para funcionar. A resposta acima ainda permanece. As instalações locais são sempre preferíveis às instalações globais.

qubyte
fonte
3
Sim, mas e quando você não tem acesso à Internet? Como você pode usar o gulp se não estiver instalado globalmente?
IGRACH 14/08/14
3
@IGRACH O script acima não usa uma conexão à Internet. Se você quiser fazer a mesma coisa sem usar um campo de script no package.json, use ./node_modules/.bin/gulp.
qubyte
1
Eu defini aliases para gulpe, coffeeportanto, os comandos funcionam na raiz do projeto do nó (por exemplo alias gulp="node_modules/.bin/gulp"). Dessa forma, os comandos são fáceis de usar, se necessário, e os conflitos de versão global / local não ocorrem.
vesse 8/09/14
Obrigado @qubyte! Eu acho que instalá-lo localmente é uma boa prática em geral. Eu tenho mais uma pergunta, então espero que você possa me ajudar a limpar minha mente. Tentei instalá-lo globalmente, como sugerido pelo documento do Gulp, sem instalá-lo localmente. Então, quando tento executar gulp, ele me dá a seguinte mensagem de erro Local gulp not found in .... Tanto quanto eu entendo, ele deve primeiro examinar os node_modules locais e, se não for encontrado, deve procurar os módulos instalados globalmente, não é? Obrigado!
yeelan
1
Adicionado um adendo. Espero que isso cubra a estranheza do gole.
qubyte
82

TLDR; Aqui está o porquê :

A razão pela qual isso funciona é porque você gulptenta executá-lo gulpfile.jsusando sua versão instalada localmente gulp, veja aqui . Daí a razão para uma instalação global e local do gulp.

Essencialmente, quando você instala gulplocalmente, o script não está no seu PATHe, portanto, você não pode apenas digitar gulpe esperar que o shell encontre o comando. Ao instalá-lo globalmente, o gulpscript entra no seu PATHarquivo porque o node/bin/diretório global provavelmente está no seu caminho.

Porém, para respeitar suas dependências locais, gulpuse sua própria versão instalada localmente para executar o gulpfile.js.

Dwayne Crooks
fonte
1
~ / bin é uma convenção Unix para binários por usuário e no PATH por padrão em muitos sistemas operacionais. O gulp deve ser capaz de vincular seu binário a partir daí.
Mikemaccana
2
Dito em outras palavras, seu gulppacote instalado globalmente é necessário para colocar node_modules/.bin/gulpno caminho. O armazenamento é barato, mas jogar fora o MB para simular um link simbólico é pura negligência da IMO.
ntd 14/11/18
79

Você pode vincular o gulplocalmente instalado globalmente ao

npm link gulp
Berislav Lopac
fonte
1
Sei que é melhor usar instalações locais, mas pode haver casos em que você simplesmente não pode instalá-lo ou simplesmente não deseja (imagine que seu servidor de IC dedicado tenha o gulp instalado globalmente e você o esteja reinstalando em todas as confirmações) . Enfim, +1 para mencionar npm link.
gion_13 7/07/2015
1
Eu vi o que você fez lá. Isso é esperto.
aprofundamento
Isso não tenta responder à pergunta
mikemaccana
1
Não, apenas invalida.
Berislav Lopac
67

A pergunta " Por que precisamos instalar o gulp global e localmente? " Pode ser dividida nas duas perguntas a seguir:

  1. Por que preciso instalar o gulp localmente se já o instalei globalmente?

  2. Por que preciso instalar o gulp globalmente se já o instalei localmente?

Vários outros forneceram excelentes respostas para essas perguntas isoladamente, mas achei que seria benéfico consolidar as informações em uma resposta unificada.

Por que preciso instalar o gulp localmente se já o instalei globalmente?

A lógica para instalar o gulp localmente é composta por vários motivos:

  1. A inclusão das dependências do seu projeto localmente garante que a versão do gulp (ou outras dependências) usada seja a versão original.
  2. O nó não considera os módulos globais por padrão ao usar o require () (que você precisa incluir gulp no seu script). Por fim, isso ocorre porque o caminho para os módulos globais não é adicionado ao NODE_PATH por padrão.
  3. De acordo com a equipe de desenvolvimento do Node, os módulos locais carregam mais rapidamente. Não sei dizer por que isso ocorre, mas isso parece ser mais relevante para o uso do nó na produção (ou seja, dependências em tempo de execução) do que no desenvolvimento (ou seja, dependências de desenvolvimento). Suponho que esse seja um motivo legítimo, já que alguns podem se importar com a menor vantagem de velocidade obtida ao carregar módulos locais x globais, mas fique à vontade para levantar a sobrancelha por esse motivo.

Por que preciso instalar o gulp globalmente se já o instalei localmente?

  1. A lógica para instalar o gulp globalmente é realmente apenas a conveniência de ter o gulp executável encontrado automaticamente no caminho do sistema.

Para evitar a instalação local, você pode usar npm link [package], mas o comando link e o install --globalcomando parecem não suportar o--save-dev opção, o que significa que não parece haver uma maneira fácil de instalar o gulp globalmente e, em seguida, adicionar facilmente qualquer versão que seja seu arquivo package.json local.

Por fim, acredito que faz mais sentido ter a opção de usar módulos globais para evitar a duplicação da instalação de ferramentas comuns em todos os seus projetos, especialmente no caso de ferramentas de desenvolvimento como grunt, gulp, jshint etc. parece que você acaba lutando um pouco com as ferramentas quando vai contra a corrente.

Derek Greer
fonte
7
+1 por ser a primeira pessoa em toda a Internet a apontar que há dois pontos na pergunta. A maioria das pessoas em todos os lugares apenas responde "Por que preciso instalar o gulp globalmente se já o instalei localmente?" quando o que eu queria saber era "Por que preciso instalar o gulp localmente se já o instalei globalmente?".
Nathan JB
10
O fato de esta questão precisar de uma explicação tão elaborada significa que essa simplesmente não é uma maneira muito lógica de trabalhar. Instalar a mesma ferramenta repetidamente para cada projeto não deve ser necessário.
Kokodoko
4
Sua resposta é tão bonita, sem emoção. A minha teria 80% de palavrões, pois isso parece ser muito estúpido. Do ponto de vista das ferramentas, a teoria da instalação local provavelmente está certa, mas do ponto de vista do SO e do gerente de pacotes, isso é tão louco que não consigo encontrar palavras para isso. Quais drogas os caras da NPM / gulp tomam?!? Se alguém discordar, leia como o gerenciador de pacotes do sistema, como dpkg, yum, pacman e co. trabalhos.
JepZ
2
@JepZ é apenas engolir ser super estranho, porém, não há nada no nó ou npm forçando isso. E manter versões específicas do gulp no projeto só faz sentido se os caras do gulp quebram versões de patches regularmente ou algo assim, outras ferramentas de compilação geralmente são uma instalação global. Mas ah bem. Só aqui para jurar.
Stoffe
2
É realmente um não-problema agora como a comunidade se mudou para usando apenas fio :)
Derek Greer
8

Tecnicamente, você não precisa instalá-lo globalmente se a node_modulespasta na sua instalação local estiver no seuPATH . Geralmente isso não é uma boa ideia.

Alternativamente, se houver npm testreferências gulp, basta digitar npm teste ele executará o gole local.

Eu nunca instalei o gulp globalmente - acho que é uma forma ruim.

Robert
fonte
3
Melhor abordagem do que colocá-lo em seu caminho é usar scripts do MPN
Jay
2

Não tenho certeza se nosso problema estava diretamente relacionado à instalação do gulp apenas localmente. Mas tivemos que instalar um monte de dependências por conta própria. Isso levou a um pacote.json "enorme" e não temos certeza se é realmente uma ótima idéia instalar o gulp apenas localmente. Tivemos que fazer isso por causa do nosso ambiente de construção. Mas eu não recomendaria instalar o gulp não globalmente se não for absolutamente necessário. Enfrentamos problemas semelhantes aos descritos na seguinte postagem no blog

Nenhum desses problemas surge para nenhum de nossos desenvolvedores em suas máquinas locais, porque todos eles instalaram o gulp globalmente. No sistema de compilação, tivemos os problemas descritos. Se alguém estiver interessado, eu poderia mergulhar mais fundo nesta questão. Mas agora eu só queria mencionar que não é um caminho fácil instalar o gulp apenas localmente.

tschoartschi
fonte
Sim, por favor, mergulhe mais fundo nesta questão.
kenorb
1

Só porque eu não vi aqui, se você estiver no MacOS ou Linux, sugiro que você adicione isso ao seu PATH (no seu bashrc etc):

node_modules/.bin

Com essa entrada de caminho relativa, se você estiver sentado na pasta raiz de qualquer projeto de nó, poderá executar qualquer ferramenta de linha de comando (eslint, gulp, etc. etc.) sem se preocupar com "instalações globais" ou npm runetc.

Depois disso, nunca instalei um módulo globalmente.

Elliot Nelson
fonte