7

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

1

У меня есть следующая проблема: я хочу, чтобы команда npm install также устанавливала package.json из ../somelocallib и, что более важно, его зависимости. Я пробовал добавить ../somelocallib в секцию dependencies в моем package.json, как показано ниже:

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

Но это не работает так, как ожидалось. Как мне правильно организовать установку локальной библиотеки и её зависимостей с помощью npm install?

5 ответ(ов)

1

Это решает проблему для меня. Добавьте следующее в ваш файл package.json:

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

Чтобы добавить локальные зависимости, используйте следующую команду:

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"
....
0

Если вы хотите еще больше автоматизировать этот процесс, особенно если вы загружаете свой модуль в систему контроля версий и не хотите полагаться на память разработчиков, чтобы они не забывали выполнять команду npm link, вы можете добавить следующее в секцию "scripts" вашего package.json:

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

Хотя это может показаться немного хакерским решением, оно, похоже, "работает". Я получил этот совет из обсуждения по следующему вопросу в npm:
https://github.com/npm/npm/issues/1558#issuecomment-12444454

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

0

Ответ на вопрос о настройке проекта с зависимостями в Node.js

Вот пример конфигурации package.json, который вы можете использовать для основного проекта:

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

Обратите внимание, что ./somelocallib ссылается на папку с библиотекой относительно основного проекта package.json.

Ссылка: Документация npm


Подпроект

Обработайте зависимости вашей библиотеки.

Кроме команды npm install, вам также нужно будет выполнить следующую команду:

(cd node_modules/somelocallib && npm install)

Это известная проблема с NPM.

Ссылка: Проблема на GitHub (ждем более актуальной информации)


Заметки для Docker

Обязательно проверьте, чтобы в вашем репозитории были зафиксированы package-lock.json из основного проекта и somelocallib/package-lock.json.

Затем в вашем 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), чтобы сделать операции идемпотентными.

0

В 2020 году, работая на Windows 10, я пытался подключить локальную библиотеку с помощью следующей конфигурации в package.json:

"dependencies": {
    "some-local-lib": "file:../../folderY/some-local-lib" 
}

Но после выполнения команды npm install в node_modules создавался лишь ярлык на папку, а это, как оказалось, не работает. Для Windows требуется создать жёсткую ссылку, и хотя система это поддерживает, нужно сделать несколько дополнительных шагов.

Так как я не хотел использовать жёсткую ссылку, я решил попробовать указать путь в формате URL:

"dependencies": {
    "some-local-lib": "file:///D:/folderX/folderY/some-local-lib.tar" 
}

И это сработало отлично.

Тар-архив (нужно упаковать файлы из папки сборки или dist вашей библиотеки) извлекается в настоящую папку внутри node_modules, и импорировать библиотеку можно так же, как и любую другую.

Конечно, часть с архивацией немного неудобна, но так как 'some-local-lib' — это библиотека, которую всё равно нужно собирать, я предпочитаю это решение вместо создания жёсткой ссылки или установки локальной версии npm.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь