як вказати локальні модулі як npm пакетних залежностей


267

У мене є додаток, який має звичайний набір залежностей від сторонніх модулів (наприклад, 'express'), вказаний у файлі package.json в залежності від залежності. Напр

"express"     : "3.1.1"

Я хотів би структурувати власний код модульно і мати набір локальних (мається на увазі файлової системи, в якій я зараз перебуваю) модулів, встановлених пакетом.json. Я знаю, що я можу встановити локальний модуль, запустивши:

npm install path/to/mymodule

Однак я не знаю, як це зробити через структуру залежностей package.json. Використовуючи --saveпараметр у цій команді, просто введіть "mymodule": "0.0.0"у мій package.json (не посилається на розташування файлового шляху). Якщо я потім видаляю встановлену версію з node_modules, і намагаюся перевстановити з package.json, вона не вдається (тому що вона шукає "mymodule" в центральному реєстрі, і не виглядає локально).

Я впевнений, що це спосіб сказати "dependencies": {}структурі, що я хочу, щоб вона була встановлена ​​з шляху до файлової системи, але не знаю як.

Хтось ще мав цю проблему? Дякую.


1
Справді гарне запитання. Сумно зрозуміти, що немає функції, еквівалентної package.jsonтому, що ми маємо в Gemfiles.
Jarl

Відповіді:


405

npm install тепер це підтримує

npm install --save ../path/to/mymodule

Для цього mymoduleповинен бути налаштований модуль зі своїм власним package.json. Див. Створення модулів NodeJS .

Станом на npm 2.0, локальні залежності підтримуються на нашому рівні. Дивіться відповідь данилопопея на подібне запитання . Тут я скопіював його відповідь, оскільки це питання займає дуже високі результати в пошуку в Інтернеті.

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

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

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

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

синхронізація оновлень

Оскільки npm installкопії mymoduleв node_modules, зміни в mymoduleджерелі не будуть автоматично помічені залежним проектом.

Є два способи оновити залежний проект

  • Оновіть версію mymoduleта використовуйтеnpm update : Як ви бачите вище, package.jsonзапис "залежності" не містить специфікатора версії, як це було б показано для звичайних залежностей. Натомість для локальних залежностей npm updateпросто намагається переконатися, що встановлена остання версія, що визначається mymodules package.json. Дивіться відповідь Кріскеллі на цю конкретну проблему .

  • Перевстановіть за допомогою npm install. Це дозволить встановити все, що знаходиться у mymoduleвихідному шляху, навіть якщо воно старше, або інша гілка перевірена.


2
Це працювало для мене. (Я щойно робив місцевий відносний шлях на кшталт"mymodule":"file:mymoduledir"
Дон Роммі

72
npm install --save ../my-local-repo
Іван Рейв

15
І як це використовувати в проекті? Я намагаюся назвати це так import { HelloWorld } from "my-test-lib";, але я отримую помилку "Неможливо знайти модуль". Погляньте, будь ласка, на stackoverflow.com/questions/46818083/…
Віталій Василенко

6
@LucioMollinedo Ви можете поділитися синтаксисом того, як ви імпортували локальний модуль? Як і у Віталія, я отримую помилку "Не можу нормально"import { HelloWorld } from "my-test-lib";
Стен Джеймс

7
Це не працює як посилання на пакет, оскільки залежності до проекту не будуть встановлені
Glass Cannon

44

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

Схоже, відповідь така npm link: https://docs.npmjs.com/cli/link


5
насправді npm-посилання створить лише посилання, і не змінить package.json, щоб додати локальну залежність
Sebastien H.

1
Але якщо це не так, symlinkяк батьківський проект буде знати, щоб відновити, коли залежність закінчиться?
Джеймі Хатбер

11

Зрештою, я не міг знайти акуратний спосіб, тому я пішов створити каталог, який називається, local_modulesа потім додав цей bashscript до package.json у scriptpts>> попередньо встановити

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done

5

Після великої боротьби з npm linkкомандою (запропоноване рішення для розробки локальних модулів без публікації їх у реєстрі чи збереження окремої копії в папці node_modules), я створив невеликий модуль npm, щоб допомогти з цим питанням.

Для виправлення потрібні два простих кроки .

Перший:

npm install lib-manager --save-dev

По-друге, додайте це до своїх package.json:

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

Детальніше на https://www.npmjs.com/package/lib-manager . Сподіваюся, це комусь допоможе.


0

Якщо ви можете просто публікувати свої модулі, попередньо встановлені в node_modules поряд з іншими файлами, ви можете це зробити так:

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

Ви також можете зберегти свій модуль на git та сказати своєму батьківському пакету.json встановити залежність від git: https://npmjs.org/doc/json.html#Git-URLs-as-Dependitions


5
На жаль, це передбачало б node_modules, які мають мої локальні модулі та модулі, внесені сторонніми розробниками / внесеними модулями, встановлені з реєстру (наприклад, підключення) в одному каталозі. Крім того, що плутати з точки зору Git / VCS (тобто доведеться ігнорувати все в node_modules, крім тих, що я створив), це також погана практика (ті, що я написав і які не публікуються, слід зберігати окремо від тих, що написали та опублікували інші ).
Сем Адамс

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