Как указать локальные модули как зависимости пакета npm
У меня есть приложение, которое имеет обычный набор зависимостей от сторонних модулей (например, 'express'), указанный в файле package.json под зависимостями. Например
"express" : "3.1.1"
Я хотел бы структурировать свой собственный код по модульному принципу и установить пакет local.json для набора локальных (то есть в файловой системе, в которой я сейчас работаю) модулей. Я знаю, что могу установить локальный модуль, запустив:
npm install path/to/mymodule
Однако я не знаю, как это сделать с помощью структуры зависимостей package.json. С использованием --save
опция в этой команде просто ставит "mymodule": "0.0.0"
в мой package.json (не ссылается на путь к файлу). Если я затем удаляю установленную версию из node_modules и пытаюсь переустановить ее из package.json, он завершается неудачно (потому что он ищет "mymodule" в центральном реестре и не смотрит локально).
Я уверен, что это способ рассказать "dependencies": {}
структура, которую я хочу, чтобы она была установлена из пути файловой системы, но не знаю как.
У кого-нибудь еще была эта проблема? Благодарю.
9 ответов
Начиная с NPM 2.0.0, импорт локальных зависимостей поддерживается изначально. Это было задокументировано danilopopeye в ответ на аналогичный вопрос. Я скопировал его ответ здесь, чтобы помочь любому, кому нужно найти правильный ответ, так как этот вопрос занимает очень высокое место в результатах поиска Google.
Эта функция была реализована в версии 2.0.0 npm. Например:
{ "name": "baz", "dependencies": { "bar": "file:../foo/bar" } }
Любой из следующих путей также допустим:
../foo/bar ~/foo/bar ./foo/bar /foo/bar
Смотрите: Локальная зависимость в package.json
Похоже, ответ npm link
: https://docs.npmjs.com/cli/link
Я не мог найти аккуратный путь в конце концов, поэтому я пошел на создание каталога под названием local_modules
а затем добавил этот bashscript в package.json в scripts->preinstall
#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
packageJson="${i}/package.json"
if [ -f "${packageJson}" ]; then
echo "installing ${i}..."
npm install "${i}"
fi
done
Следующее должно помочь (при условии, что библиотека и приложение используют одну и ту же родительскую папку)
В библиотеке :
npm pack // this will pack the library in a .tgz file
В приложении , которому нужна библиотека
npm i ../mylibrary/../library-package-X.X.tgz
Это внесет следующие изменения в ваше приложение .
package.json
теперь будет иметь
"@mylibrary": "file:../mylibrary/library-package-X.X.tgz",
Вы можете просто добавить в свой файл package.json в свой проект
"package-name" : "path/to/package"
а затем запустить
npm i
в вашем проекте
После много борьбы с npm link
Команда (предлагаем решение для разработки локальных модулей без публикации их в реестре или сохранения отдельной копии в папке node_modules), я создал небольшой модуль npm, чтобы помочь с этой проблемой.
Исправление требует двух простых шагов.
Первый:
npm install lib-manager --save-dev
Во-вторых, добавьте это к вашему package.json
:
{
"name": "yourModuleName",
// ...
"scripts": {
"postinstall": "./node_modules/.bin/local-link"
}
}
Более подробная информация на https://www.npmjs.com/package/lib-manager. Надеюсь, это поможет кому-то.
На работе у нас есть общая библиотека, которая используется несколькими разными проектами в одном репозитории. Первоначально мы использовали опубликованную (частную) версию (npm install --save rp-utils), но это привело к множеству ненужных обновлений версий по мере разработки. Библиотека находится в дочернем каталоге приложений, и мы можем использовать относительный путь вместо версии. Вместо "rp-utils": "^1.3.34" в package.json теперь это:
{
"dependencies": { ...
"rp-utils": "../rp-utils",
...
каталог rp-utils содержит публикуемый пакет npm
использовать локальную установку
У меня были проблемы с конфликтующими установками реакции из локальной зависимости. Я решил ошибку, используя
local-install
нпм-пакет. Этот пакет не создает символические ссылки, что решило мою проблему.
Шаги:
- бежать
npm i -g local-install
- бежать
npx local-install --save <local-path>
внутри целевого репозитория для установки локальной зависимости
Дальнейшее чтение: https://www.npmjs.com/package/install-local
Ошибка, которую я получил при попытке установить локальный пакет с
npm install --save <local-directory>
:
Ошибка: Неверный вызов ловушки. Хуки можно вызывать только внутри тела функционального компонента. Это может произойти по одной из следующих причин:
- У вас могут быть несоответствующие версии React и рендерера (например, React DOM).
- Возможно, вы нарушаете правила хуков.
- У вас может быть более одной копии React в одном приложении.
Если допустимо просто опубликовать свои модули, предустановленные в node_modules вместе с другими файлами, вы можете сделать это следующим образом:
// ./node_modules/foo/package.json
{
"name":"foo",
"version":"0.0.1",
"main":"index.js"
}
// ./package.json
...
"dependencies": {
"foo":"0.0.1",
"bar":"*"
}
// ./app.js
var foo = require('foo');
Вы также можете сохранить свой модуль в git и указать вашему родительскому package.json установить зависимость от git: https://npmjs.org/doc/json.html