среда, 1 мая 2013 г.

Mojolicious и зависимости на mojo::*

Решая задачу по построению статического сайта я выбрал wget и mojo.

Отличный шаблонизатор, простота роутов, все радует.

Но, о том что "просто работает" писать скучно - мы этого просто не замечаем.

Напишу о неприятностях.

Так как сайт двуязычный, а подшаблоны хочется иметь общими - понадобился словарь локализации.

Ну для простеньких вещей типа
<%= l Contacts %>
Выведет "Контакты" и "Contacts" в зависимости от роута и/или url.

Задача простая, но велосипедов лучше не плодить, заглянул в CPAN.

Конечно же, там нужный модуль уже есть: Mojolicious-Plugin-I18N, ну кто б сомневался. Судя по описанию - то что нужно. Дата свежая. Отлично. Рабочего кода - 300 строчек вместе с документацией. Будем подключать.

Пару слов как выглядит мой проект.

Это взятый с github mojolicious , ну просто git clone ....
и сунутый туда подмодулем мое приложение git submodule add ....

Идеальное работающая вещь. Как ее разворачивать на других серверах?

git clone, git submodule update, раз и работает.

Метод это мне очень нравится, он много кем используется, ну например symfony.
Я использую такой же метод для vimfiles, когда .vim лежит в git и субмодулями прикручены всевозможные модули.

Обновление, разворачивание, централизованное управление через puppet, все эти задачи выполняются на раз. Легко и приятно.

Ок, пробую проецировать этот метод, на модуль mojo..-i18n. Ответим на вопрос, куда в дерево каталогов его нужно импортировать.

Ответ: эээ, ааа, мммм.....

Да никуда. В таком виде, его не подключить.

Связываюсь с автором, спрашиваю, он предлагает варианты
а) ставить через cpan
б) писать Makefile.pm
в) использовать carton (некая реинкарнация bundler)

Т.е. убить легкий деплой, получить проблемы с контролем совместимости версий,  вводить новые (абсолютно ненужные)  сущности.
И все ради чего? 200 строк кода?

А если таких модулей нужно будет 20 штук?

Для этой задачи обошелся собственным кодом в 50 строчек.

Но осадочек остался. Нужно обязательно к этой теме вернуться и решение найти.

Идеал - добится такого же легкого подключения как bundle в symfony .
git submodule add ...
echo "use mymodule" >> site.pm

Иначе, смысл перла без cpan? Переизобретать колесо?

Рад буду, советам, комментариям, размышлениям.


UPD:
Благодаря комменту Viacheslav Tykhanovskyi, решение найдено.

mkdir -p contrib
git submodule add git://github.com/sharifulin/mojolicious-plugin-i18n.git contrib/mojolicious-plugin-i18n

Добавляем в script/myapp
unshift @INC, "$_" for glob "$FindBin::Bin/../contrib/*/lib";
и в lib/myapp.pm
  $self->plugin('Mojolicious::Plugin::I18N');

Чтож, получилось неплохо.