Установка локального модуля с помощью npm?


419

У меня есть загруженный репозиторий модуля, я хочу установить его локально, а не глобально в другой каталог?

Какой простой способ сделать это?

Ответы:


481

Из документации по npm-ссылке :

В каталоге локального модуля:

$ cd ./package-dir
$ npm link

В каталоге проекта используется модуль:

$ cd ./project-dir
$ npm link package-name

Или за один раз, используя относительные пути:

$ cd ./project-dir
$ npm link ../package-dir

Это эквивалентно использованию двух команд выше под капотом.


14
Это единственный здравомыслящий подход, который я видел до сих пор - почему npm должен быть таким неясным / тупым w. Что касается создания локального пакета, его установки и последующего использования, я не знаю ... ссылка работает (и это здорово), но терминология довольно запутанная.
Смодеть

6
@Rich Apodaca, спасибо за ссылку на документ. Это не упоминает отмены процесса. Похоже, все, что он делает, это создает символические ссылки, так что я могу удалить их как обычно?
Тайлер Кольер

1
@TylerCollier npm unlink выглядит как операция зеркального отображения stackoverflow.com/a/24940024/54426
Богатая Аподака

1
Просто обратите внимание, что если вы используете Angular2 (или, может быть, другие приложения?), Вокруг npm-ссылок есть некоторое жужжание, являющееся основной причиной специфической проблемы. Пример здесь и здесь
The Red Pea

4
Однако имейте в виду, что npm linkэто создаст второй экземпляр внешних зависимостей. Таким образом, если у вас есть пакет A, требующий B и C, B, требующий C. Соединение B приведет к тому, что у приложения A будет два экземпляра C.
user2167582

422

Вы просто указываете один <folder>аргумент npm install, аргумент должен указывать на локальную папку, а не на имя пакета:

npm install /path

5
В отличие от ссылки, здесь используется .npmignore.
Камилла Винц

30
@bithavoc По крайней мере, начиная с npm 5, установка папки теперь создает символическую ссылку, а не копию. См. Docs.npmjs.com/cli/install
Фрэнк Тан

3
Я пытался использовать этот способ, но мой модуль не может найти его peerDependencies.
Витало Бенисио

1
приятно rm -rf node_modulesдо и npm installпосле запуска скрипта ответа.
Ренато Назад

3
@FrankTan Да, но как получить старое поведение? Я хочу копию!
Майкл

151

Поскольку один и тот же человек спросил и ответил, я добавлю ссылку 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"
  }

11
Возможно, это не изначальная цель вопроса, но, вероятно, именно этого хочет большинство людей, которые находят это через Google.
Пыльный J

1
Этот ответ кажется неполным, вам нужно запустить npm linkодин раз для папки (чтобы создать глобальную символическую ссылку), а затем запустить npm link package-nameв папке проекта (чтобы использовать глобальную символическую ссылку в вашем проекте). Ответ ниже является правильным ответом.
Томас Потэр,

8
@ThomasPotaire оба ответа верны. Если вы посмотрите на документацию по ссылке на npm, она представляет оба метода с этим относительным подходом к каталогам в качестве сокращения.
MJ

1
Второй метод (с использованием file:подхода) позволил моему приложению и локальному модулю разделить зависимость. Мой тест npm linkпривел к дублирующейся зависимости, которая ломает вещи, если зависимость должна использоваться как одиночка.
Даниэль Уолтрип

У меня был локальный пакет (скажем, package1), package2 имеет зависимость, упомянутую с относительным путем package1. npm я не устанавливаю пакет, когда относительный путь начинается с "file: ../../ package1", работает, когда он '' ../../package1 ", означает ли добавление файла в начале еще что-нибудь?
Dip686

17

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папке.

Удачи...


10

Ни один из этих подходов ( 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"
  }

В этом случае, НПМ устанавливает 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, или нам нужен способ , чтобы сказать НПМ установить копию из mymoduleкогда синтаксис файла зависимостей используется в package.json. К сожалению, я не нашел способа сделать это :(


Я нашел обходной путь, который должен NODE_PATHуказать, node_modules/где fooустановлен. Так что для приведенного выше случая, это было бы так: NODE_PATH=/dev/myproject/node_modules/ Это позволяет mymoduleнайти foo.
Павел Медынский

Есть решение для. Поместите модули зависимостей в корневую папку проекта . Определите ваши зависимости в package.json с обычным префиксом file: Do npm i Это создаст символическую ссылку в node_modules проекта, а также его зависимости могут быть подняты на верхний уровень node_modules, как и для других типов зависимостей. Моя версия npm v6.14.4. Потратив пару часов на то, как это исправить, нашел это решение здесь: ( atmos.washington.edu/~nbren12/reports/journal/… ). Спасибо nbren12.
sasebot

У меня была такая же проблема. Я нашел этот ответ: stackoverflow.com/questions/50807329/… , это решает мою проблему с одноранговыми зависимостями и локальными библиотеками.
theawless

0

Отсутствует главное свойство?

Как и предыдущие люди ответили npm --save ../location-of-your-packages-root-directory. ../location-of-your-packages-root-directoryОднако необходимо иметь две вещи для того , чтобы работать.

1) package.jsonв этом каталоге указано

2) mainимущество в package.jsonдолжен быть установлен и работает И.Г. , "main": "src/index.js",если файл записи для ../location-of-your-packages-root-directoryIS../location-of-your-packages-root-directory/src/index.js

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.