Локальная зависимость в package.json
Я хочу сделать что-то вроде этого, так npm install
также устанавливает package.json
из ../somelocallib
или, что более важно, его зависимости.
"dependencies": {
"express": "*",
"../somelocallib": "*"
}
20 ответов
2014-сентябрь обновление
Эта функция была реализована в версии 2.0.0 npm. Пример:
{
"name": "baz",
"dependencies": {
"bar": "file:../foo/bar"
}
}
Любой из следующих путей также допустим:
../foo/bar
~/foo/bar
./foo/bar
/foo/bar
Локальный пакет будет скопирован в префикс (./node-modules
).
Старый ответ
Положил 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)
Теперь можно указать локальные пути установки модуля 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, когда вы не хотите подключаться к внешнему серверу, но не должны использоваться при публикации пакетов в публичном реестре.
Это работает для меня.
Поместите следующее в ваш файл package.json
"scripts": {
"preinstall": "npm install ../my-own-module/"
}
Вот как вы будете добавлять локальные зависимости:
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"
....
Если вы хотите еще больше автоматизировать это, потому что вы проверяете свой модуль на управление версиями и не хотите полагаться на разработчиков, запомнивших ссылку на npm, вы можете добавить это в свой раздел "scripts" package.json:
"scripts": {
"postinstall": "npm link ../somelocallib",
"postupdate": "npm link ../somelocallib"
}
Это чувствует себя за пределами хакерской, но, похоже, "работает". Получил совет от этой проблемы npm: https://github.com/isaacs/npm/issues/1558
Мастер-проект
Вот файл package.json, который вы будете использовать для главного проекта:
"dependencies": {
"express": "*",
"somelocallib": "file:./somelocallib"
}
Там, ./somelocallib
- это ссылка на папку библиотеки относительно главного проекта package.json.
Ссылка: https://docs.npmjs.com/files/package.json
Подпроект
Управляйте зависимостями вашей библиотеки.
Помимо бега npm install
, вам нужно будет запустить (cd node_modules/somelocallib && npm install)
.
Это известная ошибка NPM.
Ссылка: https://github.com/npm/npm/issues/1341 (ищите более свежую ссылку)
Примечания для Docker
Проверьте своего хозяина 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)
конструкции, чтобы сделать операцию идемпотентной.
Два шага для полного локального развития:
Здесь, в 2020 году, работая над Windows 10, я попробовал
"dependencies": {
"some-local-lib": "file:../../folderY/some-local-lib"
...
}
Затем делаем
npm
установить. В результате ярлык для папки создается в
node-modules
. Это не работает. Вам нужна жесткая ссылка - которая поддерживается Windows, но вы должны сделать что-то дополнительное в Windows, чтобы создать жесткую символическую ссылку.
Поскольку мне действительно не нужна жесткая ссылка, я попытался использовать вместо этого URL-адрес:
"dependencies": {
"some-local-lib": "file:///D:\\folderX\\folderY\\some-local-lib.tar"
....
}
И это прекрасно работает.
Tar (вы должны поместить tar в папку build / dist библиотеки) извлекается в настоящую папку в node-modules, и вы можете импортировать, как и все остальное.
Очевидно, что часть tar немного раздражает, но, поскольку some-local-lib - это библиотека (которую в любом случае нужно создать), я предпочитаю это решение созданию жесткой ссылки или установке локального npm.
использовать рабочие пространства
недостатком использованияfile:../path/to/your-library
это то, что вы либо должныnpm install
или используяnpm link
чтобы изменения вступили в силу в пакетах, которые импортируют ваш пакет.
если вы используете pnpm: лучшим решением является использованиеworkspace:
протокол :workspace:../path/to/your-library
. он будет символически связывать каталог с вашими node_modules, а не копировать его, поэтому любые изменения в источнике немедленно вступят в силу.
например:
...
"dependencies": {
...
"my-package": "workspace:../../dist"
},
примечание: это решение предназначено для использования в рабочей области, поэтому вам может потребоваться создатьpnpm-workspace.yaml
(даже пустой) файл в корне вашего проекта.
Я знаю это npm install ../somelocallib
работает.
Однако я не знаю, будет ли работать синтаксис, который вы показываете в вопросе, package.json
...
К сожалению, doc, кажется, упоминает только URL как зависимость.
Пытаться file:///.../...tar.gz
, указывая на архивную локальную библиотеку... и скажите нам, работает ли она.
Любопытно..... по крайней мере на 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) находятся на одном уровне.......
Я хотел использовать набор локальных зависимостей, написанных на TypeScript, и ни один из приведенных здесь ответов мне не помог.
npm install
просто отказался бы строить зависимости.
Мне пришлось прибегнуть к использованию
tsconfig.json
чтобы добавить пакеты в мой проект, не помечая их как зависимости. Мой вариант использования усложняется еще и тем, что некоторые зависимости зависят друг от друга, и я хотел, чтобы все они шли из локальной папки.
Вот мое решение:
// tsconfig.json
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@tiptap/*": [
"tiptap/packages/*/src"
]
}
}
}
В приведенном выше примере у меня есть локальная подпапка проекта с именем, и в ней много пакетов.
tiptap/packages/*
.
"paths"
опция перепишет все
@tiptap/foo
импортирует в
./tiptap/packages/foo/src
, как в моих собственных файлах, так и в файлах в
tiptap/
.
Это не очень хорошее решение, но это единственное, что сработало для меня.
Это сработало для меня: во-первых, убедитесь, что каталоги 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" : "*"
}
На самом деле, начиная с npm 2.0, теперь есть поддержка локальных путей (см. Здесь).
Есть отличный yalc, который помогает управлять локальными пакетами. Это помогло мне с локальной библиотекой, которую я позже разверну. Просто упакуйте проект в каталог .yalc (с / node_modules или без него). Так что просто сделай:
npm install -g yalc
in directory lib/$ yalc publish
в проекте:
project/$ yalc add lib
project/$ npm install
это оно.
Когда вы хотите что-то обновить:
lib/$ yalc push //this will updated all projects that use your "lib"
project/$ npm install
Упакуйте и разверните с помощью Docker
tar -czvf <compresedFile> <directories and files...>
tar -czvf app.tar .yalc/ build/ src/ package.json package-lock.json
Примечание: Не забудьте добавить каталог .yalc .
inDocker:
FROM node:lts-alpine3.9
ADD app.tar /app
WORKDIR /app
RUN npm install
CMD [ "node", "src/index.js" ]
В 2021 году вам нужно использовать его как:
npm i my-pkg@file:./path-to-my-pkg.js
# To remove it later
npm un my-pkg
Использовать
.js
в конце концов, если его файл ИЛИ путь к папке, если его полный пакет с
package.json
.
Применение
const myPkg = require('my-pkg')
Это работает как шарм!
file:
напрямую связывает локальную папку с пакетом. Если локальная папка содержитdevDependencies
это приведет к коллизиям версий.
link:
также связывает локальную папку как пакет, но также игнорирует связанные devDepedency, ведя себя точно так же, как пакет, потребляемый из NPM, но локально.
TLDR: используйтеlink
избегатьdevDependency
конфликты :)
Полное руководство по локальной разработке для пользователей пряжи :
Сначала добавьте зависимость к вашему основному проекту:
cd main-project
yarn add file:../path/to/your-library
Далее, если вы хотите избежать повторной сборки этой зависимости каждый раз, когда вы меняете ее источник:
cd your-library
yarn link
Это зарегистрирует ссылку на вашу библиотеку. Затем используйте ссылку, которую вы только что создали в своем основном проекте.
cd main-project
yarn link your-library
Теперь каждый раз, когда вы меняете код в своей библиотеке, вам не нужно его пересобирать, и он будет автоматически включаться в ваш основной проект. Ссылка на пряжу работает путем создания символических ссылок в вашей папке node_modules, подробнее об этом читайте здесь: https://classic.yarnpkg.com/lang/en/docs/cli/link/
Использование псевдонима модуля
Установите пакет module-alias:
npm i --save module-alias
Добавьте пути к вашему package.json следующим образом:
{ "_moduleAliases": { "@lib": "app/lib", "@models": "app/models" } }
В вашем файле точки входа перед любыми вызовами require():
require('module-alias/register')
Теперь вы можете потребовать такие файлы:
const Article = require('@models/article');