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
в репо А.
То, что работало для меня, было:
- Удалить
node_modules
как в зависимом, так и в потребительском модуле. - Бежать
npm unlink --no-save [dependency-module]
- повторно связать с командами с 2 связями согласно ссылке npm
Теперь я могу полностью проверить мой неопубликованный модуль локально.
Кроме того, есть команда npm pack, которая может помочь вам протестировать неопубликованные модули, хотя и не такие надежные.
Обязательно проверьте
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
, это сработало.
У меня была аналогичная проблема, и мне пришлось выполнить следующие шаги для ее решения:
В библиотеке :
- Настройте библиотеки, которые создают проблемы, как
peerDependencies
вместоdependencies
или жеdevDependencies
, например, в моем случаеreact
:
"peerDependencies": {
"react": "^16.8.6",
...
}
- запустить
- построить библиотеку (в моем случае с
rollup -c
сценарий npm)
В моем основном приложении :
- изменить версию моей библиотеки, чтобы она указывала на мой локальный проект с относительным путем, например
"dependencies": {
"my-library": "file:../../libraries/my-library",
...
}
Добавлять
resolve.symlinks = false
в конфигурацию webpack моего основного приложенияДобавлять
--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",
}
- запустить
npm install
- запустить
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')
Как только я набрал правильную вещь, это сработало.
Что решило мою проблему:
- В пакете: переименуйте пакет в
package.json
. - В пакете: для сборки пакета.
- В упаковке:
npm link
. - В основном клиенте:
npm link @name-of-my-package-from-renamed-package-json
- Перезапустите VScode или что вы используете.
- Наслаждаться.
Как увидеть изменения:
- В упаковке:
npm run build
- Наслаждаться
У меня была такая же проблема с проектом машинописного текста. main ссылался на папку lib, а не на папку пакета, которой не существовало. Мне просто нужно было запустить npm build внутри зависимого проекта, который создал папку lib, и решил эту проблему.
У меня была такая же проблема, и я обнаружилdist/cjs/index.js
файл, на который ссылался main, отсутствует. Бегnpm run build
решил проблему.
Я столкнулся с той же проблемой и попробовал все упомянутые выше решения, но, к сожалению, ни одно из них не помогло. После некоторого расследования я понял, что версия узла, на которой я запускал
Мне не удалось импортировать из моего связанного пакета, потому что я просто забыл добавить./
в мой экспорт модуля на моем верхнем уровне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
.