Instalando um módulo local usando o npm?

419

Tenho um repositório de módulo baixado, quero instalá-lo localmente, não globalmente em outro diretório?

Qual é uma maneira fácil de fazer isso?

chique
fonte

Respostas:

481

Na documentação do npm-link :

No diretório do módulo local:

$ cd ./package-dir
$ npm link

No diretório do projeto para usar o módulo:

$ cd ./project-dir
$ npm link package-name

Ou de uma só vez, usando caminhos relativos:

$ cd ./project-dir
$ npm link ../package-dir

Isso é equivalente a usar dois comandos acima, sob o capô.

Rich Apodaca
fonte
14
Esta é a única abordagem de aparência sã que eu vi até agora - por que o npm tem que ser tão obscuro / obtuso w. No que diz respeito à criação de um pacote local, instalação e depois uso, não sei ... o link funciona (e é ótimo), mas a terminologia é bastante confusa.
smaudet
6
@ Rich Apodaca, obrigado pelo link do documento. Não menciona desfazer o processo. Parece que tudo o que faz é criar links simbólicos, para que eu possa removê-los normalmente?
Tyler Collier
1
@TylerCollier npm unlink parece ser a operação de espelhamento stackoverflow.com/a/24940024/54426
rico Apodaca
1
Apenas uma observação, se você usa o Angular2 (ou talvez outros aplicativos?), Há algum burburinho em torno da vinculação npm sendo a causa raiz de um tipo específico de problema. Exemplo aqui e aqui
The Red Pea
4
No entanto, lembre-se de que npm linkisso criará uma segunda instância de dependências externas. Então, se você tem um pacote A necessidade B e C, B necessidade C. ligando B fará com que a aplicação A ter duas instâncias do C.
user2167582
422

você apenas fornece um <folder>argumento para npm install, o argumento deve apontar para a pasta local em vez do nome do pacote:

npm install /path
chique
fonte
5
Ao contrário do link, ele usa .npmignore.
Camille Wintz
30
@bithavoc Pelo menos a partir do npm 5, a instalação de uma pasta agora cria um link simbólico, não uma cópia. Veja docs.npmjs.com/cli/install
Frank Tan
3
Tentei usar dessa maneira, mas meu módulo não consegue encontrar suas dependências peer.
Witalo Benicio
1
é bom rm -rf node_modulesantes e npm installdepois de executar o script da resposta.
Renato Back
3
@FrankTan Sim, mas como obter o comportamento antigo? Eu quero a cópia!
Michael
151

Como solicitado e respondido pela mesma pessoa, adicionarei um link npm como alternativa.

dos documentos:

Isso é útil para instalar seu próprio material, para que você possa trabalhar nele e testá-lo iterativamente sem precisar reconstruir continuamente.

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency

[Editar] A partir do NPM 2.0, você pode declarar dependências locais no pacote.json

"dependencies": {
    "bar": "file:../foo/bar"
  }
Luke W
fonte
11
Pode não ser a intenção original da pergunta, mas é provavelmente o que a maioria das pessoas que encontra isso no Google deseja.
Dusty J
1
Essa resposta parece incompleta; você precisa executar npm linka pasta uma vez (para criar um link simbólico global) e depois executar npm link package-namedentro da pasta do projeto (para usar o link simbólico global no seu projeto). A resposta abaixo é a resposta certa.
Thomas Potaire
8
@ThomasPotaire as duas respostas estão corretas. Se você olhar para a documentação do link npm, ela apresenta os dois métodos, com essa abordagem de diretório relativo como uma abreviação.
MJ
1
O segundo método (usando a file:abordagem) permitiu que meu aplicativo e o módulo local compartilhassem uma dependência. Meu teste npm linkresultou em uma dependência duplicada, que quebra as coisas se a dependência precisar ser usada como um singleton.
Daniel Waltrip
Eu tinha um pacote local (digamos package1), package2 tem uma dependência mencionada no caminho relativo do package1. npm eu não instalo o pacote quando o caminho relativo começa com "file: ../../ package1", trabalhando quando é '' ../../package1 ", adicionar arquivo no início significa mais alguma coisa?
Dip686
17

npm pack + package.json

Isto é o que funcionou para mim:

PASSO 1: Em module project, execute npm pack:

Isso criará um <package-name>-<version>.tar.gzarquivo.

PASSO 2: Mova o arquivo para o consumer project

Idealmente, você pode colocar todos esses arquivos em uma tmppasta na sua consumer-projectraiz:

PASSO 3: Consulte-o em package.json:

"dependencies": {
  "my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}

PASSO 4: Installos pacotes:

npm installou npm iouyarn

Agora, seu pacote estará disponível em sua consumer-project's node_modulespasta.

Boa sorte...

Akash
fonte
10

Nenhuma dessas abordagens ( npm linkoupackage.json dependência de arquivos) funciona se o módulo local tiver dependências de pares que você deseja instalar apenas no escopo do seu projeto.

Por exemplo:

/local/mymodule/package.json:
  "name": "mymodule",
  "peerDependencies":
  {
    "foo": "^2.5"
  }

/dev/myproject/package.json:
  "dependencies":
  {
    "mymodule": "file:/local/mymodule",
    "foo": "^2.5"
  }

Neste cenário, conjuntos NPM até myprojectde node_modules/como isto:

/dev/myproject/node_modules/
  foo/
  mymodule -> /local/mymodule

Quando as cargas de nó mymodulee ele faz require('foo'), nó resolve o mymodulelink simbólico, e apenas olha no /local/mymodule/node_modules/(e seus antepassados) para fooque ele doe não encontrar. Em vez disso, queremos que o nó procure /local/myproject/node_modules/, pois é para onde o nosso projeto está sendo executado e onde fooestá instalado.

Portanto, precisamos de uma maneira de informar o nó para não resolver esse link simbólico ao procurar foo, ou de que o npm instale uma cópia de mymodulequando a sintaxe de dependência do arquivo é usada package.json. Não encontrei uma maneira de fazer isso, infelizmente :(

Paul Medynski
fonte
Encontrei uma solução alternativa, que deve ser definida NODE_PATHpara apontar para o local node_modules/onde fooestá instalado. Assim, para o caso acima, seria o seguinte: NODE_PATH=/dev/myproject/node_modules/ Isso permite mymoduleencontrar foo.
Paul Medynski 8/11
Existe uma solução para. Coloque os módulos de dependência na pasta raiz do projeto . Defina suas dependências no package.json com o prefixo 'file:' usual . Do npm i Isso criará um link simbólico nos node_modules do projeto, e suas dependências poderão ser içadas para os node_modules de nível superior, como seriam para outros tipos de dependências. Minha versão do npm é a v6.14.4. Depois de passar algumas horas em como corrigir isso, localize esta solução aqui: ( atmos.washington.edu/~nbren12/reports/journal/… ). Obrigado nbren12.
sasebot 22/04
Eu estava tendo o mesmo problema. Encontrei esta resposta: stackoverflow.com/questions/50807329/… , isso resolve meu problema com dependências entre pares e bibliotecas locais.
theawless 26/04
0

Faltando a propriedade principal?

Como as pessoas anteriores responderam npm --save ../location-of-your-packages-root-directory. O ../location-of-your-packages-root-directoryporém deve ter duas coisas para que funcione.

1) package.jsonnesse diretório apontado para

2) a mainpropriedade no package.jsondeve estar configurada e funcionando ig "main": "src/index.js",se o arquivo de entrada ../location-of-your-packages-root-directoryfor../location-of-your-packages-root-directory/src/index.js

K - A toxicidade no SO está crescendo.
fonte