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

У меня есть приложение, которое имеет обычный набор зависимостей от сторонних модулей (например, "экспресс" ), указанных в файле 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

Начиная с 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

Ответ 3

В конце концов, я не мог найти опрятный способ, поэтому я пошел на создание каталога под названием 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

Ответ 4

Если вы можете просто публиковать свои модули, предварительно установленные в 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-Dependencies

Ответ 5

После многого с командой npm link (предлагаемое решение для разработки локальных модулей, не публикуя их в реестре или поддерживая отдельную копию в папке node_modules), я построил небольшой модуль npm, чтобы помочь с этой проблемой: https://www.npmjs.com/package/lib-manager

Надеюсь, что это поможет кому-то.