NPM: после «npm link» модуль не найден

89

Я разрабатываю два модуля для NodeJS, первый названный, aligatorа второй aligator-methods. Второй зависит от первого, чтобы работать. Я разрабатываю эти два модуля одновременно, и мне нужна глобальная ссылка, aligatorчтобы я мог использовать его, как в реестре npm, и я только что установил его глобально. Для этого в документации NPM говорится, что мне нужно использовать, npm linkно это не работает.

Файл package.jsonмодуля 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"
  }
}

Файл package.jsonмодуля 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"
 }
}

Первым делом я связал модуль глобально:

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

Это, если я не ошибаюсь, создало глобальную ссылку на мой модуль, aligatorи теперь я могу использовать этот модуль где угодно на компьютере.

Затем я перешел к другому модулю и попытался установить зависимость, но он дал мне следующий результат:

$ 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

Я даже пытался напрямую связать это с:

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

Но и это не сработало.

Есть мысли о том, что может происходить? Я где-то читал, что, возможно, это как-то связано с моей установкой node и npm, потому что это было сделано Homebrew, и поэтому иногда мне нужно использовать sudo, это казалось маловероятным, но я пробовал то, что они предлагали, и это тоже не сработало.

Roc
источник
В опубликованном коде имя первого модуля пишется по буквам, aligtorи вы пытаетесь ссылаться на него во втором модуле как aligator. Это также может привести к сбою вашей зависимости.
Бруно Тоффоло
@BrunoToffolo Да, вы правы, но в данном случае это была просто опечатка в сообщении. Я поправил, спасибо.
Roc
потерял 4 часа своей жалкой жизни, обманывая конфиг webpack: / Ты спас мне жизнь! +1
Tom
8
Вау, у меня была такая же проблема с mainмоим package.json, спасибо, что обновили ответ своим исправлением!
mattyb
если вы нашли ответ, было бы неплохо опубликовать его в качестве ответа и установить вопрос как решенный с этим :)
Альберто С.

Ответы:

39

Я столкнулся с этой проблемой из-за NVM, я использовал одну версию узла для зависимости, а другую для зависимого.

linuxdan
источник
1
Можете ли вы или кто-нибудь еще указать место, где можно решить эту проблему случайно?
Кевин Даниковски
4
В моем случае мне нужно запустить nvm use <VERSION> для обоих пакетов, где VERSION была одинаковой для обоих пакетов.
linuxdan
29

Удаление и повторный package-lock.jsonзапуск npm installрешили проблему для меня.

Шон Инге Асбьёрнсен
источник
2
Это может решить текущую проблему, но, возможно, приведет к возникновению более серьезных. файлы блокировки играют очень важную роль и не должны удаляться. Вкратце: это механизмы, которые гарантируют, что каждый член команды использует одни и те же зависимости. Вы можете проверить этот ответ при переполнении стека: stackoverflow.com/questions/54124033/. Но прочтение причины, по которой он существует в документации, также является хорошим началом. docs.npmjs.com/files/package-lock.json
SKuijers
Я был бы готов поднять этот ответ, если бы было выделено жирным шрифтом примечание, указывающее, что это должно быть последнее средство. Как отмечает @SKuijers, файлы блокировки играют важную роль в поддержании версий зависимостей. Предположительно, версии зависимостей также были заблокированы в package.json, но большую часть времени я вижу, что package-lock.jsonили yarn.lockбыли привратниками для этого.
FrostyDog
29

Проблема заключалась в том, что mainсвойство package.jsonуказывало на несуществующий файл. Кажется, что проблема может возникнуть по нескольким причинам, поэтому обязательно ознакомьтесь с другими ответами.

Roc
источник
Боже мой, я хочу проголосовать за это 50 раз и фейспалм по одному разу за каждый голос.
Бен
Интересно знать, что проект требует main. В основном я обходился без него, но думаю, это создает эти незначительные проблемы.
cst1992,
Хорошая находка! Я увидел ваш ответ и сразу понял, что это моя проблема :).
slashp
11

При первом запуске npm linkиз aligatorкаталога вы создаете ссылку из глобального каталога node_modules на aligator. Затем, когда вы запускаете npm link aligatorиз aligator-methodsкаталога, вы связываете aligatorсвои локально установленные node_modules с исходным источником (как показано в приведенном выше примере). Как только это будет сделано, больше не будет необходимости в установке, поскольку она уже «установлена». Какие ошибки вы видите после запуска npm link aligatorкоманды?

Если вы просто хотите установить зависимость из локального каталога, вы можете просто попробовать использовать npm installвместо этого. Например:

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

дилант
источник
5
Благодарим вас за попытку решить эту проблему. Моя npm linkне показывала ошибок. Проблема в моем случае заключалась в том, что свойство mainуказывало на несуществующий файл. Что до моего, npm installвы правы, мне не нужно было ничего устанавливать npm link, он все делает. Спасибо за то, что я этого не знал.
Roc
1
У меня та же проблема, но я не нашел решения ... если я попытаюсь индивидуально потребовать каждый связанный пакет, все, кроме одного, работают ... тот, который не работает, просто говорит: «Ошибка: не удается найти модуль модуля» -i-just-connected '".
Майкл
@Michael выглядит так, как будто у меня был модуль, вложенный в более глубокий каталог, который пытался «динамически» требовать модуль, в котором произошел сбой (т.е. имя строки, переданной в require (), было передано модулю), поэтому мне пришлось npm ссылку на более глубокий каталог.
Майкл
4

Моя проблема заключалась в том, что репо A использовалось, npmа репо B использовалось yarn, поэтому мне нужно было запустить yarn linkрепо B, чтобы вытащить его через npm link package-nameрепо A.

FrostyDog
источник
Вы, сэр, сделали мой день! Спасибо
Алек
2

Исправить мою версию этой проблемы; в npm v5.3.0 я удалил node_modulesрепо, которое связывал с другим проектом.

Я обнаружил, что после npm v3 они пытаются поместить все зависимости node_modules в один каталог node_modules (один в вашем проекте), чтобы максимально сгладить структуру ( http://codetunnel.io/npm-5-changes-to-npm -ссылка / ).

кролливуд
источник
2

Что сработало для меня, так это:

  1. Удалите node_modulesкак в зависимости, так и в модуле потребителя.
  2. Бегать npm unlink --no-save [dependency-module]
  3. повторно связать с помощью команд с двумя ссылками согласно npm-link

Теперь я могу полностью протестировать свой неопубликованный модуль локально.

Кроме того, существует команда npm pack, которая может помочь вам протестировать неопубликованные модули, хотя и не столь надежна.

npm-pack

SandeepJ
источник
1

Для меня это произошло, когда я уменьшил номер версии моего локального пакета с 0.1.0 до 0.0.1. И в проектах, где я связался с этим пакетом, я все еще использовал более высокий номер версии. package.jsonИсправлено обновление зависимостей .

Flion
источник
0

При использовании peerDependency

Я разрабатываю два пакета stejs, и stejs-loader. stejs-loaderимеет stejsв качестве peerDependency. Когда я побежал , npm link stejs-loaderи npm link stejsв моем проекте я получаю сообщение об ошибке , что stejs-loaderне смог найти stejs. Я исправил это, запустив npm link stejsв каталоге stejs-loader.

ItsaMeTuni
источник
0

Проверить tsconfig moduleResolution

Если вы, как и я, изменили tsconfig moduleс es5на esnextили что-то в этом роде, то moduleResolutionзначение по умолчанию могло быть изменено.

Без moduleResolutionзначения «node» машинописный текст не будет разрешать пакеты node_modules.

Вы можете прочитать на странице параметров компилятора о том, как значение по умолчанию зависит от значения, от moduleкоторого, в свою очередь, зависит значение по умолчанию, targetно, вероятно, явно установите его на «узел».

Матиас
источник