Pragmatic Perl 10
pragmaticperl.com
Выпуск 10. Декабрь 2013
Другие выпуски и форматы журнала всегда
можно загрузить с http://pragmaticperl.
com. С вопросами и предложениями пишите
Комментарии к каждой статье есть в htmlверсии. Подписаться на новые выпуски можно
по ссылке pragmaticperl.com/subscribe.
Авторы статей: Сергей Романов, Сергей Можайский, Владимир Леттиев
Корректор: Андрей Шитов
Выпускающий редактор: Вячеслав Тихановский (vti) Ревизия: 2013-12-04 07:37 © «Pragmatic Perl»
Оглавление 1 От редактора.......... 1 2 Воркшоп Saint Perl 5...... 3 3 Что такое cpanle?....... 6 4 Обзор CPAN за ноябрь 2013 г. 22 5 Интервью с Marc Lehmann.
Часть 2.............. 31 6 Морской бой на Perl — решение Perl Golf 09......... 7 Perl Golf............. 1 От редактора 21 декабря в Санкт-Петербурге пройдет пятый воркшоп, посвященный языку Perl и его сообществу. Приезжайте пообщаться, послушать доклады и просто хорошо провести время! Анонс мероприятия читайте в этом номере.
С начала декабря и до католического рождества некоторые популярные Perlпроекты запускают так называемый Advent Calender (Рождественский календарь), где каждый день публикуется новая статья. В этом году ведутся следующие календари:
Perl, Perl 6, Futures.
В предыдущие годы подобные календари были у Catalyst, Dancer, Plack.
Сложно предположить, когда именно выйдет следующий номер, поэтому всех читателей поздравляем с наступающими праздниками и желаем интересных проектов в новом году!
Мы продолжаем искать авторов для следующих номеров. Если у вас есть идеи или желание помочь, пожалуйста, свяжитесь с нами.
Приятного чтения.
Вячеслав Тихановский 2 Воркшоп Saint Perl 18 декабря 2013 года исполнится 26 лет с момента выхода первой версии языка программирования Perl. А уже через два дня, 21 декабря, в Санкт-Петербурге пройдёт ежегодный воркшоп Saint Perl. В этот раз Saint Perl пройдёт уже в пятый раз, отмечая таким образом своеобразный юбилей. (Первые три воркшопа нам удалось провести прямо 18 декабря!) В этом году площадку для воркшопа любезно согласилась предоставить компания JetBrains — её основной центр разработок и исследований находится практически в самом центре Санкт-Петербурга, на Василиевском острове, в 10 минутах ходьбы от Университетской набережной.
В течение дня участники прослушают ряд докладов (прием докладов все ещё открыт!), получат возможность задать вопросы выступающим специалистам и пообщаться на тему современного состояния дел в разработке на одном из самых заслуженных скриптовых языков современности. Традиционная секция блиц-докладов завершит официальную часть мероприятия.
Организаторы выражают благодарность всем, кто помогает подготовиться к мероприятию и оказывает медийную поддержку.
Мы также рады сотрудничеству со спонсорами, которые обеспечат возможность проведения конференции на ещё более высоком уровне.
Сайт конференции: event.yapcrussia.org/saintpe Электронная почта: [email protected] Увидимся в Петербурге!
Сергей Романов 3 Что такое cpanle?
От создателя cpanminus и Plack, революционная инновация в процессе подготовки Perl-приложения для распространения — cpanfile. Начните использование сегодня, и установка ваших модулей будет мягкой и шелковистой даже из git.
cpanle cpanfile — это название файла, а также формата, который описывает CPANзависимости для Perl-приложений. Идея cpanfile пришла из мира Ruby, где для описания зависимостей используется Gemfile. На сам формат сильно повлиял DSL, используемый в системе сборки Module::Install, и, кстати, cpanfile обратно-совместим с ним. Кроме того, описание зависимостей использует терминологию спецификации META при описании зависимостей: те же типы и фазы зависимостей.
Рассмотрим пример:
1 # требуется Perl 5.8.5 или старше 2 requires 'perl', 5.008_ 4 # рекомендуется Foo::Bar версии 5 # но меньше версии 2. 6 recommends 'Foo::Bar', '>= 1.0, < 8 # Зависимости фазы тестирования 10 # Test::More версии 0.88 или 11 requires 'Test::More', '0.88' Зачем нужен cpanle?
Все существующие системы сборки, такие как ExtUtils::MakeMaker, Module::
Build, Module::Install и другие имеют средства для описания зависимостей.
1 use ExtUtils::MakeMaker;
2 WriteMakefile( 3 NAME => "Foo::Bar", Как правило, утилиты для установки CPANмодулей используют файл META.yml, который автоматически формируется средствами сборки и содержит информацию о зависимостях. Таким образом, типичный CPANмодуль содержит всё необходимое для корректной сборки и установки в систему. Зачем нужно что-то ещё?
Прежде всего, cpanfile предлагает универсальный формат описания зависимостей, не перегруженный избыточным многословием, который может использоваться различными утилитами, начиная от инсталляторов, заканчивая статическими анализаторами или сервисами непрерывной интеграции.
На данный момент уже созданы плагины для многих систем сборок, которые позволяют использовать cpanle для извлечения списка зависимостей. Например, для ExtUtils::MakeMaker есть модуль ExtUtils::MakeMaker::CPANle, который позволяет переписать указанный выше пример так:
1 # Makefile.PL 2 use ExtUtils::MakeMaker::CPANfile 3 WriteMakefile( 4 NAME => "Foo::Bar", 7 # cpanfile 8 requires 'JSON::XS', '3. Для других систем сборки соответственно есть Module::Install::CPANle, Dist::Zilla::Plugin::Prereqs::FromCPANle, Module::Build::Pluggable::CPANle. Таким образом, можно использовать cpanfile совместно с существующими системами сборки и избежать дублирования информации о зависимостях.
Кроме того, существует несколько ситуаций, когда применение cpanfile имеет явные преимущества. Рассмотрим такие примеры.
Веб-приложение или скрипт Разрабатывается приложение, которое использует модули CPAN, но при этом нет задачи по выкладыванию самого приложения на CPAN. В этом случае для нормальной установки приложения требуется удобный способ описания зависимостей без необходимости создания полноценного CPAN-дистрибутива с Makefile.PL (выбора системы сборки и формальное следование всем её требованиям).
В такой ситуации после создания cpanfile все необходимые CPAN-модули можно установить с помощью команд:
1 $ carton install или $ cpanm installdeps.
Установка модуля из git-репозитория Всё больше авторов используют git в качестве системы контроля версий и github как публичный хостинг проектов. В этом отношении всё большее значение приобретает возможность брать и использовать код непосредственно из git (или любой другой VCS).
Как правило, при разработке модуля в gitрепозитории отсутствуют автоматически генерируемые файлы. В случае использования Dist::Zilla это означает отсутствие Makefile.PL или Build.PL вообще, что требует от пользователя необходимость установки dzil и множества модулей этой среды разработки, которые не имеют никакого отношения к работе модуля, всё только ради возможности выяснить, какие он требует зависимости. В случае Module::Install потребуется знать, какие нужны модули в каталоге inc только для бутстрапа самого Makefile.PL.
В подобных ситуациях наличие cpanfile позволяет быстро и просто установить необходимые зависимости с помощью cpanm или carton, что существенно повышает доступность кода для использования непосредственно из git-репозитория.
Фиксация зависимостей Существующие средства описания зависимостей фиксируют саму зависимость и минимальную необходимую версию. Таким образом, не исключена возможность установки более новой версии зависимого модуля, с которой работа приложения не тестировалась. С помощью cpanfile существует возможность точно указать требуемые версии модулей или диапазоны таких версий, а также явно указывать версии, которые использовать нельзя.
Например, 1 # зафиксировать версию 2 requires 'JSON::XS', '== 3.01' 4 # диапазон версий с исключениями 5 requires 'Plack', 6 '> 1.0000, != 1.0020, != 4 recommends 'JSON::XS', '2.0';
5 conflicts 'JSON', '< 1.0';
7 on 'test' => sub { 8 requires 'Test::More', '>= 9 recommends 'Test::TCP', '1.12';
12 on 'develop' => sub { 13 recommends 'Devel::NYTProf';
16 feature 'sqlite', 'SQLite support 17 recommends 'DBD::SQLite';
Ключевые слова requires, recommends, conflicts, а также suggests описывают зависимости модуля соответственно как обязательные, рекомендуемые, конфликтующие и опциональные. После ключевого слова идёт название модуля, затем через запятую указывается строка с диапазоном версий, формат которой соответствует спецификации CPAN::Meta::Spec Version Range:
• undef, '', 0 — любая версия • '1.00' или '>= 1.00' — минимальная версия (1.00 или старше) • '> 1.00' — любая версия старше 1.