LINUX.ORG.RU

Управление библиотеками внутри проекта

 ,


0

0

Не смог придумать более адекватного заглавия, в общем суть такова:
Есть проект на nodejs. В нем есть некоторые модули, которые выполняют различные служебные функции и используются всеми остальными модулями. Своего рода библиотеки, но не сторонние, а внутренние, специфичные для проекта. Пусть все они лежат в поддиректории ./lib.

Хотелось бы иметь доступ к таким библиотекам из любого другого модуля проекта без указания относительного пути, т.е. чтобы вместо require('../../../lib/cool') можно было сделать что-то в стиле require('lib/cool') или require('cool').

Решения, которые я вижу (беглый поиск в интернете других не дал):
1. Использовать $NODE_PATH. Не хочется, т.к. нужно либо писать скрипт-обертку, который будет выставлять нужный $NODE_PATH и запускать проект, либо еще хуже, добавлять в каждой системе в .bashrc или куда-то еще.
2. Использовать require.paths. Тут приходит на помощь официальная документация, которая как бы говорит нам: «**Note:** Please Avoid Modifying `require.paths`».
3. Сделать симлинк директории проекта с библиотеками в node_modules, типа ln -sr ./lib ./node_modules. Естественно, делать это в установочном скрипте. Не самое очевидное решение, разработчику, который придет в этот проект с улицы не сразу станет понятно, откуда именно берется lib/cool. Плюс платформоспецифичное, для оффтопика - свои костыли.
4. Использовать костыль типа определения globals.LIB_PATH или process.LIB_PATH и делать require(path.join(LIB_PATH, 'cool')). И некрасиво, и в случае чего нужно искать, кто и где создает LIB_PATH. Да и вообще я как-то против глобальных переменных в принципе.
5. Сделать в ./lib npm-пакет и добавить его основному модулю в зависимости. И на каждое изменение в lib запускать npm install, нет спасибо.
6. Один раз при старте проекта сделать global.Lib = require('./lib') и везде использовать этот global. Очень плохое решение, из-за опасности конфликта имен.

Какой бы способ выбрали вы (или может уже используете)?
Пока склоняюсь к третьему, мне он кажется наиболее прозрачным и беспроблемным.

★★★

Сделать симлинк директории проекта с библиотеками в node_modules
Сделать в ./lib npm-пакет и добавить его основному модулю в зависимости

npm link

dib2 ★★★★★
()

У меня ядро явно выделено в отдельный пакет, поэтому инклюды оттуда не требуют относительных путей. А чтобы при разработке подкладывать репозиторий и он не херился npm, пакет указан как bundledDependency.

Vit ★★★★★
()

которые выполняют различные служебные функции и используются всеми остальными модулями

Какой бы способ выбрали вы

var locator = require("service-locator");
var cool = locator.get('cool');

Как-то так. Вот к примеру быстро нагугливается нечто подходящее https://www.npmjs.com/package/node-service-locator

no-such-file ★★★★★
()

А всякие grunt, pulp и webpack а этом не помогут?

EmgrtE ★★★★
()
Ответ на: комментарий от no-such-file

IMHO как-то это слишком интырпрайзно получится в яваскрипте. С таким же успехом можно рекваерить {} и расширять его пропертями. Ну и сервислокатор для управления библиотеками выглядит как гаубица.

Vit ★★★★★
()
Ответ на: комментарий от Vit

выглядит как гаубица

Зато какой будет код... Пушка, а не код!

no-such-file ★★★★★
()
Ответ на: комментарий от Vit

А чтобы при разработке подкладывать репозиторий и он не херился npm, пакет указан как bundledDependency

Вот этот момент не совсем понял. npm же все равно создает у меня в node_modules копию директории с библиотеками, а не ссылку. Соответственно, на каждое изменение в библиотеках нужно запускать npm install, чтобы он доставлял копию в node_modules, либо править прямо там.
Или я что-то сделал не так?
Если да, то прошу минимально-работающий пример.

unikoid ★★★
() автор топика
Последнее исправление: unikoid (всего исправлений: 1)
Ответ на: комментарий от unikoid

Ты кладешь туда гитовскую папку и работаешь с ней. Хочешь ее засимлинкать - на твое усмотрение, но это не обязательно.

Проблемы будут, если ты захочешь обновить или переставить другие модули. Чтобы твою папку не задело, надо ее указать в bundledDependency, иначе ее перезапишет.

Vit ★★★★★
()
Ответ на: комментарий от Vit

Понятно, сначала не дошло, что репозиторий прям в node_modules кладется.
В общем, пока обойдусь симлинком, всем спасибо.

unikoid ★★★
() автор топика
Ответ на: комментарий от unikoid

Если да, то прошу минимально-работающий пример.

https://github.com/nodeca/nodeca/blob/master/package.json#L85-L90
https://github.com/nodeca/nodeca/blob/master/package.json#L54-L57

Репы естественно ставятся отдельным скриптом https://github.com/nodeca/nodeca/blob/master/Makefile#L122-L127 . А то что в конфиге прописано - это чтобы он был корректным и репы не портил. После клонирования репов npm install нормально работает.

НО! У меня достаточно сложный проект, где разбивка на компоненты действительно имеет смысл. По своим решай сам.

Vit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.