NPM: Depois que o módulo “npm link” não for encontrado


93

Estou desenvolvendo dois módulos para NodeJS, o primeiro nomeado aligatore o segundo aligator-methods. O segundo depende do primeiro para funcionar. Estou desenvolvendo esses dois módulos ao mesmo tempo e quero um link global aligatorpara que possa usá-lo como se estivesse no registro npm e acabei de instalá-lo globalmente. Para fazer isso, a documentação do NPM diz que preciso usar, npm linkmas não está funcionando.

Arquivo package.jsondo módulo aligator:

{
  "name": "aligator",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "private": true,
  "directories": {
    "doc": "docs",
    "example": "examples",
    "test": "spec"
  },
  "scripts": {
    "test": "gulp jasmine"
  },
  "license": "MIT",
  "devDependencies": {
    "gulp": "^3.6.2",
    "gulp-jasmine": "^0.2.0",
    "gulp-jshint": "^1.6.1",
    "gulp-rename": "^1.2.0",
    "jasmine-node": "^1.14.3"
  },
  "dependencies": {
    "bluebird": "^1.2.4",
    "lodash": "^2.4.1",
    "mathjs": "^0.22.0"
  }
}

Arquivo package.jsondo módulo aligator-methods:

{
 "name": "aligator-methods",
 "version": "0.0.1",
 "description": "",
 "main": "index.js",
 "private": true,
 "directories": {
   "doc": "docs",
   "example": "examples",
   "test": "jasmine"
 },
 "scripts": {
   "test": "gulp jasmine"
 },
 "author": "",
 "license": "MIT",
 "devDependencies": {
   "gulp": "^3.6.2",
   "gulp-jasmine": "^0.2.0",
   "gulp-jshint": "^1.6.1",
   "gulp-rename": "^1.2.0",
   "jasmine-node": "^1.14.3"
 },
 "dependencies": {
   "lodash": "^2.4.1",
   "mathjs": "^0.22.0",
   "aligator": "^0.0.1"
 }
}

Em primeiro lugar, vinculei o módulo globalmente:

$ cd ~/aligator
$ npm link
/usr/local/lib/node_modules/aligator -> /Users/roc/aligator

Isso se não me engano criou uma referência global do meu módulo aligatore agora posso usar este módulo de qualquer lugar que eu quiser no computador.

Em seguida, fui para o outro módulo e tentei instalar a dependência, mas me deu esta saída:

$ cd ~/aligator-methods
$ npm install
npm ERR! 404 404 Not Found: aligator
npm ERR! 404
npm ERR! 404 'aligator' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it
npm ERR! 404 It was specified as a dependency of 'aligator-methods'
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, or http url, or git url.

npm ERR! System Darwin 13.2.0
npm ERR! command "node" "/usr/local/bin/npm" "install"
npm ERR! cwd /Users/roc/aligator-methods
npm ERR! node -v v0.10.28
npm ERR! npm -v 1.4.16
npm ERR! code E404
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/roc/aligator-methods/npm-debug.log
npm ERR! not ok code 0

Eu até tentei vinculá-lo diretamente com:

$ cd ~/aligator-methods
$ npm link aligator
/Users/roc/aligator-methods/node_modules/aligator -> /usr/local/lib/node_modules/aligator -> /Users/roc/aligator

Mas também não funcionou.

Alguma ideia do que pode estar acontecendo? Eu li em algum lugar que talvez tenha algo a ver com a minha instalação de node e npm porque foi feito pelo Homebrew e então às vezes eu preciso usar sudo, parecia improvável, mas tentei o que eles propuseram e não funcionou também.


No código postado, o nome do primeiro módulo é escrito aligtore você tenta se referir a ele no segundo módulo como aligator. Isso também pode fazer com que sua dependência falhe.
Bruno Toffolo

@BrunoToffolo Sim, tem razão, mas, neste caso, foi apenas um erro de ortografia no post. Eu corrigi, obrigado.
Roc

perdi 4 horas da minha vida miserável enganando a configuração do webpack: / Você salvou minha vida! +1
Tom Sarduy,

8
Uau, tive o mesmo problema com o mainda minha package.json, obrigado por atualizar a resposta com sua correção!
mattyb de

se você encontrou a resposta, seria uma boa ideia postar como resposta e definir a questão como resolvida com aquela :)
Alberto S.

Respostas:


40

Encontrei esse problema por causa do NVM, estava executando uma versão do nó para a dependência e outra para o dependente.


1
Você ou qualquer outra pessoa pode conectar-se a um local onde resolver isso por acaso?
Kevin Danikowski

4
No meu caso, preciso executar 'nvm use <VERSION>' em ambos os pacotes, onde VERSION era o mesmo para ambos os pacotes.
linuxdan de

34

Excluir package-lock.jsone executar npm installnovamente resolveu o problema para mim.


3
Isso poderia resolver o problema atual, mas possivelmente criaria alguns problemas maiores. Os arquivos de bloqueio desempenham um papel muito importante e não devem ser excluídos. Resumindo: são os mecanismos que garantem que cada membro da equipe use exatamente as mesmas dependências. Você pode verificar esta resposta no estouro de pilha: stackoverflow.com/questions/54124033/… Mas ler o motivo pelo qual ela existe nos documentos também é um bom começo. docs.npmjs.com/files/package-lock.json
SKuijers

1
Eu estaria disposto a aumentar essa resposta se houvesse uma nota em negrito indicando que este deve ser totalmente um último recurso. Como @SKuijers aponta, os arquivos de bloqueio desempenham um papel essencial na manutenção de versões de dependência. Presumivelmente, as versões de dependência foram bloqueadas no package.jsontambém, mas na maioria das vezes vejo que package-lock.jsonou yarn.lockforam os guardiões para isso.
FrostyDog

33

O problema era que a mainpropriedade de package.jsonestava apontando para um arquivo não existente. Parece que o problema pode ocorrer por vários motivos, portanto, verifique as outras respostas.


1
omg, eu quero votar a favor 50 vezes e me cara uma vez para cada voto positivo.
Ben

Interessante saber o que o projeto exige main. Na maioria das vezes, eu vivia sem ele, mas acho que ele cria esses problemas menores.
cst1992

Belo achado! Eu vi sua resposta e imediatamente soube que esse era o meu problema :).
slashp

12

Ao executar npm linkpela primeira vez a partir do aligatordiretório, você cria um link do diretório global node_modules para aligator. Então, ao executar a npm link aligatorpartir do aligator-methodsdiretório, você vincula aligatorde seus node_modules instalados localmente à fonte original (como a saída mostra em seu exemplo acima). Feito isso, não haverá mais necessidade de instalar, pois já está "instalado". Que erros você vê depois de executar o npm link aligatorcomando?

Se você deseja apenas instalar uma dependência de um diretório local, pode apenas tentar usar npm install. Por exemplo:

$ cd ~ / aligator-methods
$ npm install ../aligator


6
Obrigado pelo seu esforço para resolver isso. Meu npm linknão mostrou nenhum erro. O problema no meu caso era que a propriedade mainestava apontando para um arquivo não existente. Quanto ao meu npm installvocê tem razão, não precisei instalar nada para npm linkfazer tudo. Obrigado por isso eu não sabia.
Roc

1
Estou tendo o mesmo problema, mas não encontrei uma solução ... se eu tentar solicitar individualmente cada pacote vinculado, todos menos um funciona ... o que não funciona apenas diz: "Erro: Não é possível encontrar módulo 'módulo -i-acabei de ligar '".
Michael

@Michael parece que eu tinha um módulo aninhado em um diretório mais profundo que estava tentando "dinamicamente" exigir o módulo que estava falhando (ou seja, o nome da string passada para require () foi passado para o módulo), portanto, eu tive que npm link para o diretório mais profundo.
Michael

4

Meu problema acabou sendo que o repo A estava usando npme o repo B estava usando yarn, então precisei executar yarn linkno repo B para puxá-lo via npm link package-namepara o repo A.


Você, senhor, fez o meu dia! Obrigado
Alec

3

O que funcionou para mim foi:

  1. Exclua o node_modulesna dependência e no módulo do consumidor.
  2. Corre npm unlink --no-save [dependency-module]
  3. reconecte com os comandos de 2 links de acordo com o npm-link

Agora posso testar totalmente meu módulo não publicado localmente.

Além disso, há um comando npm pack que pode ajudá-lo a testar seus módulos não publicados, embora não seja tão robusto.

npm-pack


2

Correção para minha versão desse problema; no npm v5.3.0, removi node_modulesdo repo que estava vinculando a outro projeto.

Eu descobri que depois do npm v3 eles tentam colocar todas as dependências de node_modules em um diretório node_modules (um em seu projeto) para nivelar a estrutura tanto quanto possível ( http://codetunnel.io/npm-5-changes-to-npm -link / ).


1

Para mim, isso aconteceu quando diminuí o número da versão do meu pacote local de 0.1.0 para 0.0.1. E nos projetos que vinculei a este pacote ainda estava usando o número de versão superior. Atualizar dependências em package.jsonconsertou.


0

Ao usar peerDependency

Estou desenvolvendo dois pacotes stejs, e stejs-loader. stejs-loadertem stejscomo um peerDependency. Quando eu executei npm link stejs-loadere npm link stejsem meu projeto estava recebendo um erro que stejs-loadernão consegui encontrar stejs. Consertei executando npm link stejsno diretório de stejs-loader.


0

Verifique tsconfig moduleResolution

Se, como eu, você mudou o tsconfig modulede es5para esnextou algo assim, então o moduleResolutionpadrão pode ter mudado.

Sem moduleResolutionser definido como "node", typescript não resolverá pacotes node_modules.

Você pode ler na página Opções do compilador sobre como o valor padrão depende do valor de module, cujo padrão, por sua vez, depende target- mas provavelmente defina-o como "nó" explicitamente.

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.