Как указать локальные модули как зависимости пакета npm

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

"express"     : "3.1.1"

Я хотел бы структурировать свой собственный код по модульному принципу и установить пакет local.json для набора локальных (то есть в файловой системе, в которой я сейчас работаю) модулей. Я знаю, что могу установить локальный модуль, запустив:

npm install path/to/mymodule

Однако я не знаю, как это сделать с помощью структуры зависимостей package.json. С использованием --save опция в этой команде просто ставит "mymodule": "0.0.0" в мой package.json (не ссылается на путь к файлу). Если я затем удаляю установленную версию из node_modules и пытаюсь переустановить ее из package.json, он завершается неудачно (потому что он ищет "mymodule" в центральном реестре и не смотрит локально).

Я уверен, что это способ рассказать "dependencies": {} структура, которую я хочу, чтобы она была установлена ​​из пути файловой системы, но не знаю как.

У кого-нибудь еще была эта проблема? Благодарю.

9 ответов

Решение

Начиная с NPM 2.0.0, импорт локальных зависимостей поддерживается изначально. Это было задокументировано danilopopeye в ответ на аналогичный вопрос. Я скопировал его ответ здесь, чтобы помочь любому, кому нужно найти правильный ответ, так как этот вопрос занимает очень высокое место в результатах поиска Google.

Эта функция была реализована в версии 2.0.0 npm. Например:

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

Любой из следующих путей также допустим:

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

Я не мог найти аккуратный путь в конце концов, поэтому я пошел на создание каталога под названием local_modules а затем добавил этот bashscript в package.json в scripts->preinstall

#!/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

Следующее должно помочь (при условии, что библиотека и приложение используют одну и ту же родительскую папку)

В библиотеке :

      npm pack // this will pack the library in a .tgz file

В приложении , которому нужна библиотека

      npm i ../mylibrary/../library-package-X.X.tgz

Это внесет следующие изменения в ваше приложение .

package.jsonтеперь будет иметь

       "@mylibrary": "file:../mylibrary/library-package-X.X.tgz",

Вы можете просто добавить в свой файл package.json в свой проект

      "package-name" : "path/to/package"

а затем запустить npm i в вашем проекте

После много борьбы с 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. Надеюсь, это поможет кому-то.

На работе у нас есть общая библиотека, которая используется несколькими разными проектами в одном репозитории. Первоначально мы использовали опубликованную (частную) версию (npm install --save rp-utils), но это привело к множеству ненужных обновлений версий по мере разработки. Библиотека находится в дочернем каталоге приложений, и мы можем использовать относительный путь вместо версии. Вместо "rp-utils": "^1.3.34" в package.json теперь это:

{ 
  "dependencies": { ...
    "rp-utils": "../rp-utils",
   ...

каталог rp-utils содержит публикуемый пакет npm

использовать локальную установку

У меня были проблемы с конфликтующими установками реакции из локальной зависимости. Я решил ошибку, используя local-installнпм-пакет. Этот пакет не создает символические ссылки, что решило мою проблему.

Шаги:

  1. бежать npm i -g local-install
  2. бежать npx local-install --save <local-path>внутри целевого репозитория для установки локальной зависимости

Дальнейшее чтение: https://www.npmjs.com/package/install-local

Ошибка, которую я получил при попытке установить локальный пакет с npm install --save <local-directory>:

Ошибка: Неверный вызов ловушки. Хуки можно вызывать только внутри тела функционального компонента. Это может произойти по одной из следующих причин:

  1. У вас могут быть несоответствующие версии React и рендерера (например, React DOM).
  2. Возможно, вы нарушаете правила хуков.
  3. У вас может быть более одной копии React в одном приложении.

Если допустимо просто опубликовать свои модули, предустановленные в 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 и указать вашему родительскому package.json установить зависимость от git: https://npmjs.org/doc/json.html

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