Локальная зависимость в 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(даже пустой) файл в корне вашего проекта.

С пряжей это можно сделать как

yarn add file:../somelocallib

Я знаю это 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/

Использование псевдонима модуля

  1. Установите пакет module-alias:

    npm i --save module-alias

  2. Добавьте пути к вашему package.json следующим образом:

    { "_moduleAliases": { "@lib": "app/lib", "@models": "app/models" } }

  3. В вашем файле точки входа перед любыми вызовами require():

    require('module-alias/register')

  4. Теперь вы можете потребовать такие файлы:

    const Article = require('@models/article');

Другие вопросы по тегам