FastNetMon

Показаны сообщения с ярлыком Catalyst. Показать все сообщения
Показаны сообщения с ярлыком Catalyst. Показать все сообщения

суббота, 30 января 2010 г.

Catalyst: конфигурация модели

Сабж довольно частый -- очень удобно иметь единый конфиг, а не размазаный по десятку модулей. Сходя найти решение "как передать конфигу в модель" не нашёл, но спас Гугл: http://blog.jrock.us/articles/Catalyst%20Tips:%20Part%201.pod

О $c->model

В документации по Каталисту на Цпане сказано:
If the name is omitted, it will look for - a model object in $c->stash->{current_model_instance}, then - a model name in $c->stash->{current_model}, then - a config setting 'default_model', or - check if there is only one model, and return it if that's the case.


Обращаем внимание на последний пункт по причине, что он нифига не работает, т.е. чтобы обращаться по $c->model() (вместо $c->model('MyModelName')) надо ОБЯЗАТЕЛЬНО вписать в конфиг параметр default_model: VashModel и только после этого оно заработает. Так понимаю, это бага.

Список почти всех расширений для Каталиста

http://search.cpan.org/~hkclark/Catalyst-Manual-5.7020/lib/Catalyst/Manual/Plugins.pod

Как создать объект, конструируемый на этапе старта Каталиста

Как создать объект конструируемый на этапе старта Каталиста, который потом использовался всеми контроллерами до окончания работы Каталиста ? А вот так: http://community.livejournal.com/ru_catalyst/9867.html

И вопрос и ссылка заимствованы с вышеуказанного урла.

Перенос PAR пэкаджа с 32 битной на 64 битную платформу

Я уже говорил, что PAR кроме pm модулей на чистом Перле складывает в свой архив .so расширения, и обещался провести эксперимент переноса рабочего приложения с 32 битной на 64 битную платформу.

Внимание, рабочая машинка имеет конфу (сервер, никаких спец модулей для Perl нету):
2.6.18-ovz-smp-alt14 #1 SMP Wed May 2 15:41:34 MSD 2007 x86_64 x86_64 x86_64 GNU/Linux
девелоперская:
Linux nrg-desktop 2.6.24-22-generic #1 SMP Mon Nov 24 18:32:42 UTC 2008 i686 GNU/Linux

Как собрать PAR пэкадж я уже говорил в http://perlaround.blogspot.com/2009/03/par-catalyst.html, сейчас обсудим комплекс мер по подготовке второй системы к приёму пэкадажа :)

Ставим PAR: sudo cpan PAR PAR::Packer (возможно, PAR::Packer придётся ставить через cpan force).
Переливаем пэкадж на новую машину каким-то образом (я предпочитаю sftp, т.к. он сходу работает в Гноме).

Запускаем и обламываемся:

Can't load '/tmp/par-nrg/cache-e463425e9fd4743fd99b42ffc3b1f2aee266f2aa/2b152795.so' for module HTML::Parser: /tmp/par-nrg/cache-e463425e9fd4743fd99b42ffc3b1f2aee266f2aa/2b152795.so: неправильный класс ELF: ELFCLASS32 at /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/DynaLoader.pm line 230.
at /usr/lib/perl5/site_perl/5.8.8/PAR/Heavy.pm line 109
Compilation failed in require at HTML/Entities.pm line 147.
Compilation failed in require at Catalyst/Engine.pm line 8.
BEGIN failed--compilation aborted at Catalyst/Engine.pm line 8.
Compilation failed in require at (eval 19) line 3.
...propagated at /usr/lib/perl5/5.8.8/base.pm line 85.
BEGIN failed--compilation aborted at Catalyst/Engine/CGI.pm line 4.
Compilation failed in require at (eval 18) line 3.
...propagated at /usr/lib/perl5/5.8.8/base.pm line 85.
BEGIN failed--compilation aborted at Catalyst/Engine/HTTP.pm line 4.
Compilation failed in require at ./script/catapp_server.pl line 9.
BEGIN failed--compilation aborted at ./script/catapp_server.pl line 10.


Как вариант, можно попробовать собрать в Пэкадж ещё и сам Перл интерпретатор (дада, вы не ослышались!), делается это так pp -o имя_нового_пэкаджа_с_перлом catapp_server.par, но в моём случае это тоже не помогло.

Что же, пока принимаю поражение, но не сдаюсь.

Добавление: вообще, вариант проблему решить посредством виртулизации, например, на qemu -- т.е. собрать дистрибутив, в котором будет 1) ядро ОС 2) Перл 3) Всё необходимое для пуска Перла и в таком виде его раздавать :) Но тут возникает ещё большая куча проблем -- как быть с диском для виртулки, как работать с сетью и проч. Так что тоже для мелочи не вариант.

Часть инфы взята из: http://catalyst.infogami.com/cookbook/par

Сборка PAR пэкаджа для Catalyst приложения

Как известно, Каталист имеет туеву кучу зависимостей и развернуть его на системе, где разработка на перле производится впервые довольно проблематично и может вылиться часа в 3 времени, решение задачи довольно очевидно -- собрать все нужные модули и засунуть в архив вместе с аппликацией. Впрочем, так и поступает PAR (Perl Archive Toolkit), их офсайт тут: http://par.perl.org

Но, как многие могли догадаться, проблем мы огребём по полной в случае завязывания приложения на XS модули, которые, во-первых, не так легко перетащить, а во-вторых, не так легко заставить работать под разными платформами (у меня, например, рабочая машинка 32 битная, а почти все на работе -- 64 битные). Но на наше счастье, Каталист не требует XS расширений (разве что опциональное XS Stash для Template Toolkit). Ладно, давайте проверим PAR в деле, а там разберемся, какие проблемы вылезут.

Ставим сам PAR: sudo cpan PAR PAR::Packer
Собираем пэкадж: переходим в папку с нашим Каталист проектом и вызываем: perl Makefile.PL после этого запускаем make catalyst_par и ждём, пока Пэкадж соберётся.

Следовало бы заметить, что PAR пэкадж запустится далеко не на любой системе, по крайней мере нам будет нужен Perl и сам PAR (в идеале, конечно же, было бы заиметь его в менеджере пакетов, тогда развертывание Перл приложений вообще превратилось в нечто сверх банальное).

Не знаю как у вас, но у меня PAR пэкадж собрался и весит 1,7 мегабайта, что же, попробуем его запустить! Для запуска используется программа "parl" (отличие от "perl" во второй букве), ну что пускаем!

После запуска видим нечто вот такое:

parl catalystapp.par
Usage:
[parl] catalystapp[.par] [script] [arguments]

Examples:
parl catalystapp.par catalystapp_server.pl -r
myapp catalystapp_cgi.pl

Available scripts:
catalystapp_cgi.pl
catalystapp_create.pl
catalystapp_fastcgi.pl
catalystapp_server.pl
catalystapp_test.pl


Как подсказывает хелп, пускать надо вот так: parl catalystapp.par catalystapp_server.pl -p 80, делаем это и вуаля! Каталист аппликация пустилась и отлично работает! =)

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

Да, кстати, по поводу огребания от XS -- PAR складывает .so модули в папочку по имени /lib/auto/ (папочку?! да, вы угадали, PAR -- это обычный архив). Вот интересный вопрос будет, что произойдёт при запуске на платформе другой архитектуры, что же, это мы попробуем прямо сейчас, но опишу в другом посте.

Создание и запуск простейшего Catalyst приложения

Ну тут всё банально донельзя:

catalyst.pl my_test_catalyst_app
cd my_test_catalyst_app/
script/my_test_catalyst_app_server.pl -reload -p 80


И после этого встроенный сервер Каталиста будет запущен, в чём можно убедиться, открыв в браузере страницу: http://127.0.0.1

Установка Perl фреймворка Catalyst на Debian 5 Lenny с Perl 5.10

Сначала ставим сам CPAN:

apt-get install perl


Теперь поставим всё необходимое для сборки XS модулей (написанных на С) и в т.ч.команду make:
apt-get install gcc make



Обновим сам CPAN:
cpan YAML Bundle::CPAN


Теперь обновим все Perl модули, имеющиеся в системе:

cpan
cpan_shell: upgrade


У меня не обновились лишь следующие модули, но т.к. я их не использую, мне это не интересно:

DB_File 1.816_1 1.819 PMQS/DB_File-1.819.tar.gz
B 1.17 1.19 NWCLARK/perl-5.8.9.tar.gz



Ну и, наконец, поставим сам Catalyst:
cpan Task::Catalyst Catalyst::Devel


Не знаю, как у Вас, но у меня не встал лишь модуль: Catalyst::Plugin::Session::State::URI

Который придётся поставить насильно:

cpan
cpan_shell: force install Catalyst::Plugin::Session::State::URI


После этого надо повторить команды, которые мы использовали для установки Каталиста.

В итоге нас должна встретить вот такая прелестная надпись:

Task::Catalyst is up to date (3.0000).
Catalyst::Devel is up to date (1.10)


Попутно возникла идея сделать свой аналог http://search.cpan.org/~mramberg/Task-Catalyst-3.0000/lib/Task/Catalyst.pm куда включить наиболее часто используемые, на мой взгляд, модули. Причем, как и ожидалось, пакетная инсталляция там решаться через толстый Makefile.PL :)