Встановлення локального модуля за допомогою npm?


418

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

Який простий спосіб це зробити?

Відповіді:


479

З документації npm-link :

У каталозі локального модуля:

$ cd ./package-dir
$ npm link

У каталозі проекту використовувати модуль:

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

Або за один раз, використовуючи відносні шляхи:

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

Це еквівалентно використанню двох команд вище під кришкою.


14
Це єдиний здоровий підхід, який я бачив досі - чому npm має бути таким незрозумілим / тупим w. що стосується створення локального пакету, його встановлення та використання, я не знаю ... посилання працює (і його чудово), але термінологія досить заплутана.
smaudet

6
@Rich Apodaca, дякую за посилання на doc. Це не згадує про скасування процесу. Схоже, що все, що він робить, це створювати символьні посилання, тож я можу видалити їх як звичайні?
Тайлер Коллієр

1
@TylerCollier npm відключенням видається дзеркальним зображенням stackoverflow.com/a/24940024/54426
Rich Apodaca

1
Лише зауваження, якщо ви використовуєте Angular2 (або, можливо, інші програми?), Навколо npm виникає певна помилка, яка є першопричиною конкретного виду проблеми. Приклад тут і тут
The Red Pea

4
Однак майте на увазі, що npm linkце створить другий примірник зовнішніх залежностей. Отже, якщо у вас є пакет A, потрібні B і C, B потрібен C. Пов’язання B призведе до того, що додаток A має два екземпляри C.
user2167582

421

ви просто надаєте один <folder>аргумент npm install, аргумент повинен вказувати на локальну папку замість імені пакета:

npm install /path

5
На відміну від посилання, для цього використовується .npmignore.
Каміл Вінц

30
@bithavoc Принаймні станом на npm 5, встановлення папки тепер створює симпосилання, а не копію. Дивіться docs.npmjs.com/cli/install
Франк Тан

3
Я намагався використовувати цей спосіб, але мій модуль не може знайти його peerDependitions.
Вітало Бенісіо

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

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

150

Оскільки одна і та сама особа запитала і відповіла, я додаю посилання npm як альтернативу.

від документів:

Це зручно для встановлення власних речей, так що ви можете працювати над ним та ітеративно перевіряти його без необхідності постійно відновлювати.

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency

[Редагувати] Станом на NPM 2.0 ви можете оголосити локальні залежності в package.json

"dependencies": {
    "bar": "file:../foo/bar"
  }

11
Це може бути не оригінальним наміром питання, але, мабуть, цього хочуть більшість людей, які виявляють це через Google.
Dusty J

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

8
@ThomasPotaire обидві відповіді правильні. Якщо ви подивитесь на документацію посилання npm, вона представляє обидва способи, з таким відносним підходом до каталогів.
MJ

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

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

16

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папці.

Щасти...


9

Жоден із цих підходів ( 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:' . Виконайте npm i Це створить символьне посилання в node_модулях проекту, а також його залежності можуть бути прикріплені до node_модулів верхнього рівня, як і для інших типів залежностей. Моя версія npm - v6.14.4. Витративши кілька годин на те, як це виправити, знайшов таке рішення тут: ( Atlants.washington.edu/~nbren12/reports/journal/… ). Дякую nbren12.
sasebot

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

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.