Установка локального модуля с помощью 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>
Другие вопросы по тегам