Локальная зависимость в package.json

454

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

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}
user1680104
источник

Ответы:

585

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).

нпм <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)

danilopopeye
источник
3
Как мы можем отсоединить это?
AtaurRehman Asad
13
Недостатком установки локальных пакетов с «npm link» является то, что вы получаете много дублирования модулей. Когда вы перечисляете свои зависимости с помощью «module: version» или «module: git-repo», алгоритм установки npm избегает установки пакета, который уже установлен в родительском пакете. Таким образом, с помощью «ссылки npm», если ваше основное приложение зависит от «async@0.8.0», а все ваши локальные пакеты также зависят от «async@0.8.0», все локальные пакеты будут установлены с установкой «async@0.8». 0 "вместо использования той же самой установленной" асинхронной "версии основного приложения. Этого не происходит, используя «папку установки npm».
Педро Баллестерос
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> description содержит описание Установить пакет в каталоге как символическую ссылку в текущем проекте.
Герман Дж. Радтке 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, хотя я так устанавливаю пакет верхнего уровня.
Michael
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, вы можете добавить это в свой раздел "scripts" package.json:

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

Это чувствует себя за пределами хакерской, но, похоже, «работает». Получил совет от этой проблемы npm: https://github.com/npm/npm/issues/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

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

Вот пакет.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/issues/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, указав на zip локальную библиотеку ... и скажите нам, работает ли она.

ПРИВЕТ
источник
1
Я добавляю «зависимости»: {«somemodule»: «file: ///./internal_modules/somemodule»} в package.json. Не работает Код ошибки: «npm ERR! Код E404».
Джеффри
2

Это сработало для меня: во-первых, убедитесь, что каталоги npm имеют правильного пользователя

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

Тогда ваш в вашем package.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, теперь есть поддержка локальных путей (см. Здесь ).

damirv
источник
8
Майкл Троу уже дал этот ответ несколько недель назад, так зачем дублировать?
Дан Даскалеску
2

Любопытно ..... по крайней мере на Windows (мой npm - 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

В package.json для module1 есть зависимость "module2": "../module2"; модуль2 не имеет локальной зависимости; nodeApp имеет зависимости "module1": "../module1" и "module2": "../module2".

Не уверен, что это работает только для меня, так как все 3 папки (module1, module2 и nodeApp) находятся на одном уровне .......

Пол Дункан
источник