Установка локального модуля с помощью npm?
У меня есть загруженный репозиторий модуля, я хочу установить его локально, а не глобально в другом каталоге?
Какой простой способ сделать это?
11 ответов
Вы просто предоставляете один <folder>
аргумент npm install
Аргумент должен указывать на локальную папку вместо имени пакета:
npm install /path
Из документации по npm-ссылке:
В каталоге локального модуля:
$ cd ./package-dir
$ npm link
В каталоге проекта использовать модуль:
$ cd ./project-dir
$ npm link package-name
Или за один раз, используя относительные пути:
$ cd ./project-dir
$ npm link ../package-dir
Это эквивалентно использованию двух команд выше под капотом.
Поскольку один и тот же человек спросил и ответил, я добавлю ссылку npm в качестве альтернативы.
из документов:
Это удобно для установки ваших собственных вещей, так что вы можете работать с ним и тестировать его итеративно, без необходимости постоянно перестраивать.
cd ~/projects/node-bloggy # go into the dir of your main project
npm link ../node-redis # link the dir of your dependency
[Edit] Начиная с NPM 2.0, вы можете объявить локальные зависимости в package.json
"dependencies": {
"bar": "file:../foo/bar"
}
npm pack
+ package.json
Вот что сработало для меня:
ШАГ 1: В module project
, выполнить npm pack
:
Это создаст <package-name>-<version>.tar.gz
файл.
ШАГ 2: Переместите файл в consumer project
В идеале вы можете поместить все такие файлы в tmp
папка в вашем consumer-project
корень:
ШАГ 3. Укажите это в своем package.json
:
"dependencies": {
"my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}
ШАГ 4: Install
пакеты:
npm install
или npm i
или yarn
Теперь ваш пакет будет доступен в вашем consumer-project's node_modules
папка.
Удачи...
Ни один из этих подходов (npm link
или же package.json
файловая зависимость) работает, если локальный модуль имеет одноранговые зависимости, которые вы хотите установить только в рамках проекта.
Например:
/local/mymodule/package.json:
"name": "mymodule",
"peerDependencies":
{
"foo": "^2.5"
}
/dev/myproject/package.json:
"dependencies":
{
"mymodule": "file:/local/mymodule",
"foo": "^2.5"
}
В этом случае npm устанавливает myproject
"s node_modules/
как это:
/dev/myproject/node_modules/
foo/
mymodule -> /local/mymodule
Когда узел загружается mymodule
и это делает require('foo')
узел разрешает mymodule
символическая ссылка, а потом только заглядывает в /local/mymodule/node_modules/
(и его предки) для foo
, которого он не нашел. Вместо этого мы хотим, чтобы узел смотрел в /local/myproject/node_modules/
, так как именно там запускали наш проект, и где foo
установлено.
Итак, нам либо нужен способ указать узлу не разрешать эту символическую ссылку при поиске foo
или нам нужен способ сообщить npm, чтобы установить копию mymodule
когда синтаксис файловой зависимости используется в package.json
, К сожалению, я не нашел способа сделать это:(
Отсутствует главное свойство?
Как ответили предыдущие люди npm --save ../location-of-your-packages-root-directory
. В../location-of-your-packages-root-directory
однако для работы необходимы две вещи.
1) package.json
в этом каталоге указал на
2) main
собственность в package.json
должен быть установлен и работает ig "main": "src/index.js",
если входной файл для ../location-of-your-packages-root-directory
является ../location-of-your-packages-root-directory/src/index.js
Так что у меня было много проблем со всеми упомянутыми до сих пор решениями...
У меня есть локальный пакет, на который я хочу всегда ссылаться (а не на ссылку npm), потому что он не будет использоваться вне этого проекта (на данный момент), а также не будет загружен в репозиторий npm для широкого использования.
Мне также нужно, чтобы он работал в Windows И Unix, поэтому символические ссылки не идеальны.
Указание на результат tar.gz (пакет npm) работает для зависимой папки пакета npm, однако это вызывает проблемы с кешем npm, если вы хотите обновить пакет. Он не всегда извлекает новый из указанного пакета npm при его обновлении, даже если вы удалите node_modules и повторно выполните установку npm-install для вашего основного проекта.
так.. Это то, что у меня сработало!
Фрагмент файла Package.json основного проекта:
"name": "main-project-name",
"version": "0.0.0",
"scripts": {
"ng": "ng",
...
"preinstall": "cd ../some-npm-package-angular && npm install && npm run build"
},
"private": true,
"dependencies": {
...
"@com/some-npm-package-angular": "file:../ome-npm-package-angular/dist",
...
}
Этим достигается 3 вещи:
- Избегает распространенной ошибки (по крайней мере, в проектах angular npm) "index.ts не является частью компиляции". - поскольку он указывает на созданную (dist) папку.
- Добавляет этап предварительной установки для создания указанного клиентского пакета npm, чтобы убедиться, что создана папка dist нашего зависимого пакета.
- Избегает проблем, когда ссылка на файл tar.gz локально может быть кэширована npm и не обновлена в основном проекте без тщательной очистки / устранения неполадок / перекомпоновки / переустановки.
Надеюсь, это понятно и кому-то поможет.
Подход tar.gz тоже вроде работает..
npm install (путь к файлу) тоже вроде работает.
Все это было основано на сгенерированном клиенте из спецификации openapi, который мы хотели сохранить в отдельном месте (вместо использования копировальной пасты для отдельных файлов).
Я столкнулся с другим решением, чем указано выше, при установке пользовательского пакета сборки для CKEditor5.
Итак, я загрузил пакет в корневой каталог приложения, чем:
npm add file:./ckeditor5
В моем пакете package.json указан файл:
"ckeditor5-custom-build": "file:ckeditor5",
Я думаю, что этот ответ может иметь отношение к теме о том, как добавить локальный пакет.
Как объяснено в принятом ответе @fancy, вы можете использовать эту команду:
npm install ...<path_to_your_local_package>
чтобы добавить ваши локальные пакеты.
вpackage.json
вашего проекта он создаст запись типа:
"dependencies": {
...
"your_package_name": "file:...<path_to_your_local_package>"
...
}
Если пакет, который вы включаете, находится в корне проекта, он выполнит установку всех зависимостей включенного вами локального пакета. В противном случае, то есть если он находится за пределами корня вашего проекта, он просто создаст символическую ссылку (как указал @frank-tan), и в этом случае, если по какой-то причине вы удалилиnode_modules
каталог в вашем проекте или вам нужно выполнить новую переустановку, которую вы должны запустить:
npm install --install-links
Параметр командной строкиinstall-links
гарантирует автоматическую установку всех зависимостей локальных пакетов. Это пригодится, если, например, вы используете Jenkins и вам нужно развернуть большой проект со множеством специально разработанных вложенных зависимостей.
Более подробную информацию см. в официальной документации по npm-install : https://docs.npmjs.com/cli/v9/commands/npm-install .
Для более свежих версий npm (я использую 8.1.3 под macOS Big Sur) последовательность команд еще проще...
cd /path-where-your-local-project-is/
npm init
Это запросит у вас некоторые данные, связанные с вашим проектом, и правильно инициализирует ваш
project.json
файл.
Как только это будет сделано, вы можете установить дополнительные модули с помощью:
cd /path-where-your-local-project-is/
npm install --save-dev some-npm-module .
Это все, что вам нужно!
Примечание. Я считаю, что точка в конце не нужна, если вы находитесь внутри каталога проекта, но я также думаю, что ее добавить не помешает :-)
(Интересно, почему официальные документы до сих пор этого не объясняют...)
Для установки локального модуля/пакета, которого еще нет в npm, или вы разрабатываете пакет npm и хотите протестировать его локально перед публикацией. Вы можете попробовать это -
npm i yalc -g
Перейдите в папку модуля/пакета, затем -
yalc publish
Ваш пакет готов к использованию, теперь перейдите к проекту, который вы хотите установить -
yalc add <Your package name>
Пакет будет установлен в ваш проект. Если вы хотите удалить его -
yalc remove <Your package name>