Локальна залежність у package.json


453

Я хочу зробити що - щось подібне, так що установки npm installтакож встановлює package.jsonз ../somelocallibабо що ще більш важливо його залежностей.

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}

Відповіді:


583

npm> = 2.0.0

Ця функція була реалізована у версії 2.0.0 npm. Приклад:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Будь-який із наступних шляхів також дійсний:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

Локальний пакет буде скопійовано у префікс ( ./node-modules).

npm <2.0.0

Покладіть somelocallibяк свою залежність package.jsonяк звичайну:

"dependencies": {
  "somelocallib": "0.0.x"
}

Потім запустіть npm link ../somelocallibі npm встановить версію, над якою ви працюєте як символьну посилання .

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

Довідка: посилання (1)


3
Як ми можемо від’єднати це?
AtaurRehman Asad

13
Недоліком установки локальних пакетів з "npm посиланням" є те, що ви отримуєте багато дублювання модулів. Коли ви перераховуєте свої залежності за допомогою "module: version" або "module: git-repo", алгоритм npm install не дозволяє встановлювати пакет, який вже встановлений у батьківському пакеті. Тож із "npm link", якщо ваша основна програма залежить від "async@0.8.0", а всі ваші локальні пакети також залежать від "async@0.8.0", ви закінчите всі локальні пакети, які встановлюють "async@0.8. 0 "замість того, щоб використовувати ту ж встановлену" async "версію основного додатку. Це не відбувається за допомогою папки "npm install".
Педро Баллестерос

3
@PedroBallesteros ви можете скористатися npm dedupдля вирішення цієї проблеми. npmjs.org/doc/cli/npm-dedupe.html
danilopopeye

4
"Локальний пакет буде скопійовано ...", мабуть, це не так з більш новою версією npm. Тепер створено символьне посилання.
tsauerwein

2
@danilopopeye Per docs.npmjs.com/cli/install npm install <folder> описує: Встановити пакунок у каталог у вигляді символьної посилання в поточному проекті.
Герман Дж. Радтке III

211

Тепер можна безпосередньо вказати шляхи установки локального модуля Node у вашому package.json. З документів:

Місцеві шляхи

З версії 2.0.0 ви можете надати шлях до локального каталогу, який містить пакет. Локальні шляхи можна зберегти, використовуючи npm install -Sабо npm install --saveвикористовуючи будь-яку з цих форм:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

у такому випадку вони будуть нормалізовані до відносного шляху та додані до вашого package.json. Наприклад:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Ця функція корисна для локальної розробки в режимі офлайн та створення тестів, які потребують встановлення npm там, де ви не хочете потрапляти на зовнішній сервер, але не слід використовувати при публікації пакетів у державному реєстрі.


23
У npm v.3 + нормалізація абсолютна, не відносна , тому ви побачите щось на кшталт"bar": "file:///home/user/src/foo/bar"
Ron Wertlen

27
Як оновити залежність локального шляху без збільшення версії?
Богдан Лизанець,

3
До речі, це спричиняє всілякі неприємності, коли та / або якщо ви намагаєтесь докерізувати свою програму для вузлів, оскільки стандартні node:onbuildзображення копіюють лише поточний каталог, і, таким чином, не залишають нічого в ../foo.
donmartin

4
Чи є якийсь спосіб інтегрувати це з git + ssh, щоб можна було мати локальну копію git сховища, що вони, npm installабо інше сховище git у локальній мережі? Коли я намагаюся встановити вище і npm встановити з git + ssh, схоже, він виглядає в каталозі node_modules і не намагається перейти через git + ssh, хоча саме так я встановлюю пакет верхнього рівня.
Михайло

1
Встановлення роботи. Але таким чином я отримаю "ERR not found" при спробі імпорту модуля в мій проект.
C4d

87

Це працює для мене.

Помістіть наступне у вашому файлі package.json

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}

4
Дякуємо за пропозицію, що не потребує використання "npm-посилання"
ItalyPaleAle

Він видалений .gitignoreу папці модулів, створений, .npmignoreі коли я його запустив, застосував 777 рекурсивно на всіх папках, крім node_modules. Але так, він встановив залежності. Використання npm версії 1.4.14.
L0LN1NJ4

використовував це, але замість того, щоб возитися з node_modules, я використав app_modules
catalint

1
Чому ні "dependencies": { "my-own-module": "file:../my-own-module" }?
Богдан Лизанець

1
Я згоден з @Bohdan тут. локальні залежності будуть робити те саме. Перевага використання npm linkполягає в тому, що вам не потрібно робити npm installщоразу, щоб актуалізувати свої залежності.
froginvasion

30

Якщо ви хочете додатково автоматизувати це, оскільки ви перевіряєте свій модуль в контролі версій, і не хочете покладатися на розробники, що запам'ятовують npm-посилання, ви можете додати це до розділу "сценарії" свого пакета.json:

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

Це відчувається поза хакі, але, здається, "працює". Отримайте підказку з цього випуску npm: https://github.com/npm/npm/isissue/1558#issuecomment-12444454


15
Чому postinstallі postupdateзамість preinstallі preupdate?
праворуч

1
Чи можете ви пояснити трохи більше, що це робить. тобто якщо я встановлю проект vscode з декількома кореневими папками (тобто "багатокоренева робоча область"), чи зможе він негайно відображати зміни в папці модуля для споживчих проектів? - Це те, про що цей хак?
bvdb

26

Ось як ви додасте локальні залежності:

npm install file:src/assets/js/FILE_NAME

Додайте його до package.json з NPM:

npm install --save file:src/assets/js/FILE_NAME

Безпосередньо додайте в package.json так:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....

6

Мастер-проект

Ось package.json, який ви будете використовувати для головного проекту:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

Там ./somelocallibє посилання на папку бібліотеки відносно основного проекту package.json .

Довідка: https://docs.npmjs.com/files/package.json#local-paths


Підпроект

Обробіть залежність від вашої бібліотеки.

Крім бігу npm install , вам потрібно буде бігати (cd node_modules/somelocallib && npm install).

Це відома помилка з NPM.

Довідка: https://github.com/npm/npm/isissue/1341 (пошук більш актуальної посилання)


Примітки для Докера

Перевірте свого господаря package.lockта свогоsomelocallib/package.lock керівника вихідного коду.

Потім у своєму Dockerfile використовуйте:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

Я використовую дужки у своїх (cd A && B)конструкціях, щоб зробити операцію ідентичною.


3

Я знаю, що npm install ../somelocallibпрацює.

Однак я не знаю, чи працюватиме синтаксис, показаний у запитанні, від package.json

На жаль, здається , doc згадує лише URL як залежність.

Спробуйте file:///.../...tar.gz, вказуючи на локальну блискавку ... і скажіть, чи працює вона.


1
Я додаю "залежності": {"somemodule": "файл: ///./internal_modules/somemodule"} до пакета.json. Це не працює. Код помилки - "npm ERR! Code E404".
Джеффрі

2

Це працювало для мене: спочатку переконайтесь, що npm-каталоги мають потрібного користувача

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

Тоді ваш у пакунку.json посилається на каталог

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}

2
Символічні посилання на Windows можливі з XP en.wikipedia.org/wiki/NTFS_symbolic_link . Відкрийте командний рядок як адміністратор, а потім запустіть npm install.
дер

2

Насправді, станом на npm 2.0, існує підтримка локальних шляхів (див. Тут ).


8
Майкл Труу вже дав цю відповідь за кілька тижнів до цього, то чому б дублювати?
Дан Даскалеску

2

Цікаво ..... принаймні, у Windows (мій нмм - 3.що), що мені потрібно було зробити:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

Коли я це робив, npm install ../module1 --saveце призводило до абсолютних шляхів, а не відносних у відповідності з документацією.

Я розібрався навколо трохи більше і визначив, що ../xxxце достатньо.

Зокрема, у мене перевірені модулі локальних вузлів, щоб сказати d: \ build \ module1, d: \ build \ module2 та мій проект вузла (додаток) у d: \ build \ nodeApp.

Щоб "встановити", я:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

module1's package.json має залежність "module2": "../module2"; module2 не має локальної залежності; nodeApp має залежності "module1": "../module1" та "module2": "../module2".

Не впевнений, чи працює це лише для мене, оскільки всі 3 папки (module1, module2 та nodeApp) знаходяться на одному рівні .......


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.