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

Я разрабатываю два модуля для 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"
  },
  "author": "Roc Alayo Arnabat",
  "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казалось маловероятным, но я попробовал то, что они предложили, и это тоже не сработало.

Изменить: решение моей конкретной проблемы

В моем случае проблема заключалась в том, что main собственностью package.json указывал на несуществующий файл.

21 ответ

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

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

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

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

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

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

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

То, что работало для меня, было:

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

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

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

NPM-пак

Обязательно проверьте main в package.json.

Это служит входом в ваш пакет. Это небольшая деталь, на которую у меня ушло много времени.

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

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

Это может быть банально, но стоит упомянуть:

должен быть выполнен после (если необходимо) был выполнен в папке.

  • То есть, если связанный модуль уже не присутствует в <module-name> папки package.json, и в этом случае порядок не имеет значения, потому что это означает, что связанный модуль фактически установлен исключительно (как показано здесь), и нет необходимости связывать с помощью npm link - что не является предметом этого вопроса.

Причина в том, что npm link <module-name> просто создает символическую ссылку (или ярлык папки в Windows) на связанный пакет, так что выполнение npm install потом просто удаляет его.

Подводя итог, это порядок выполнения:

  • Замена ОП aligator с участием exporter а также aligator-methods с участием importer для облегчения понимания
      ⚡  cd exporter
⚡  npm install <-- if needed, execute here, though it can also be executed after `npm link`
⚡  npm link
⚡  cd importer
⚡  npm install <-- if needed, must be executed here
⚡  npm link exporter
  • Бонус: полный пример минимальных модулей ES для экспортера и импортера можно найти здесь.

Я знаю, что это старый пост, но в моем случае проблема заключалась в том, что я переименовал имя каталога своего пакета, но package.json«имя» по-прежнему было установлено на старое имя.

например, мое имя каталога было package-nameно фактическое «имя», найденное в package.json, было package-name-b".

Бег yarn linkсоздаст ссылку с именем «package-name-b».

Затем я попытался запустить yarn link package-nameтак как я использовал имя каталога. Когда я переключил его на yarn link package-name-b, это сработало.

У меня была аналогичная проблема, и мне пришлось выполнить следующие шаги для ее решения:

В библиотеке :

  1. Настройте библиотеки, которые создают проблемы, как peerDependencies вместо dependencies или же devDependencies, например, в моем случае react:
      "peerDependencies": {
  "react": "^16.8.6",
  ...
}
  1. запустить
  2. построить библиотеку (в моем случае с rollup -c сценарий npm)

В моем основном приложении :

  1. изменить версию моей библиотеки, чтобы она указывала на мой локальный проект с относительным путем, например
      "dependencies": {
  "my-library": "file:../../libraries/my-library",
  ...
}
  1. Добавлять resolve.symlinks = false в конфигурацию webpack моего основного приложения

  2. Добавлять --preserve-symlinks-main а также --preserve-symlinks к моему package.json сценарий запуска, например:

      "scripts": {
  "build": "set WEBPACK_CONFIG_FILE=all&& webpack",
  "start": "set WEBPACK_CONFIG_FILE=all&& webpack && node --preserve-symlinks-main --preserve-symlinks dist/server.js",
}
  1. запустить npm install
  2. запустить npm run start

Проверить tsconfig moduleResolution

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

Без moduleResolution если установлено значение "node", машинописный текст не будет разрешать пакеты node_modules.

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

я побежал npm run buildна локальном пакете (зависимости), и это сработало для меня

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

Для меня решение состояло в том, что в моем требовании было опечатка.

require('my_liberry')

Как только я набрал правильную вещь, это сработало.

Что решило мою проблему:

  1. В пакете: переименуйте пакет вpackage.json.
  2. В пакете: для сборки пакета.
  3. В упаковке:npm link.
  4. В основном клиенте:npm link @name-of-my-package-from-renamed-package-json
  5. Перезапустите VScode или что вы используете.
  6. Наслаждаться.

Как увидеть изменения:

  1. В упаковке:npm run build
  2. Наслаждаться

У меня была такая же проблема с проектом машинописного текста. main ссылался на папку lib, а не на папку пакета, которой не существовало. Мне просто нужно было запустить npm build внутри зависимого проекта, который создал папку lib, и решил эту проблему.

У меня была такая же проблема, и я обнаружилdist/cjs/index.jsфайл, на который ссылался main, отсутствует. Бегnpm run buildрешил проблему.

Я столкнулся с той же проблемой и попробовал все упомянутые выше решения, но, к сожалению, ни одно из них не помогло. После некоторого расследования я понял, что версия узла, на которой я запускалотличалась от версии узла, указанной в каталоге моего пакета при запуске. @_@ Итак, я убедился, что версии узлов совпадают, и это сработало! XD

Мне не удалось импортировать из моего связанного пакета, потому что я просто забыл добавить./в мой экспорт модуля на моем верхнем уровнеindex.tsфайл:

      export * from './utilities'

Потребовалось время, чтобы понять это.

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

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

Другие вопросы по тегам