Я Марсель Ардуанов, руководитель команды разработки VK и по совместительству Go-разработчик. После перехода в другое бизнес-подразделение я столкнулся с сервисами на языке Perl. Если вы посмотрите рейтинг языков программирования в 2023 году на Хабре, то увидите, что он не входит в этот список.
В компаниях до сих пор существуют сервисы на Perl, логику работы которых нужно понять и перенести на другой язык. Обычно в этом очень помогает отладчик. Но походив по интернету, я понял, что лёгкого решения для запуска отладчика нет, нужно разбираться. В этой статье я расскажу, как работать с зависимостями и отлаживать Perl-приложения с использованием современных технологий.
Введение
Для наглядности я создал тестовый сервис на Perl. Можете клонировать его и пройтись по этой статье вместе с ним. Репозиторий содержит примеры конфигураций для запуска Docker-контейнера с Perl-сервисом и настройкой отладчика.
Директории проекта:
docker-app
— пример отладки на чистом Perl, который содержит Docker-контейнерыperl
иnginx
.docker-uwsgi
— пример отладки с помощью сервера uWSGI для запуска Perl, который содержит Docker-контейнерыuwsgi
иnginx
.lib
— код запускаемого сервиса.
Работа с зависимостями
Для удобной работы с зависимостями (модулями) нам потребуется:
Шаг 1:
Прописать зависимости в
Dockerfile
иdocker-compose.yml
.Собрать и запустить Docker-контейнеры.
Шаг 2. Отобразить зависимости в IDE с помощью запущенных Docker-контейнеров.
Запуск сервиса через docker compose
Создайте и наполните файл
Dockerfile
для запуска сервиса.Создайте и наполните файл
docker-compose.yml
для запуска сервиса.Соберите и запустите Docker-контейнеры из директории с файлом
docker-compose.yml
:
cd docker-app
docker compose up --build
Запущенный сервис будет доступен по адресу http://localhost.
Настройка отображения зависимостей в IDE
Я знаю только одну компанию, которая разрабатывает IDE и позволяет отлаживать Perl-код — Jetbrains. Чтобы отобразить зависимости Docker-контейнеров, которые уже запущены, выполните основную и дополнительную настройку.
Основная настройка
Установите любую Jetbrains IDE. Например, IntelliJ IDEA (Community Edition).
Откройте Jetbrains IDE.
Установите плагин Perl:
В контекстном меню выберите Settings. Откроется окно настроек.
Перейдите к разделу Plugins.
Найдите и установите плагин Perl.
Примените настройки.
Примечание. Чтобы ознакомиться детальнее с плагином Perl, используйте документацию.
Настройте интерпретатор Perl:
В контекстном меню выберите Settings. Откроется окно настроек.
Перейдите к разделу Languages & Frameworks.
Перейдите к разделу Perl5.
Справа от поля Perl5 Interpreter нажмите на значок шестерёнки.
В выпадающем меню выберите Add System Perl > Docker. Откроется окно выбора Docker-контейнера.
Выберите Docker-контейнер сервиса.
Нажмите на кнопку OK. Откроется окно выбора исполняемого файла Perl.
Выберите путь к исполняемому файлу Perl.
Нажмите на кнопку OK.
Примечание. Если вы используете Docker-контейнер на основе официального образа Perl, выберите директорию
/usr/local/bin/perl
. Если вы хотите использовать системный Perl, выберите директорию/usr/bin/perl
.
Дополнительная настройка
После выполнения основной настройки:
В Jetbrains IDE перенесутся все Perl-модули, которые прописаны в Dockerfile.
Jetbrains IDE начнёт индексировать Perl-модули в Docker-контейнерах.
Если вы обновляете зависимости в Docker-контейнерах, необходимо переиндексировать Perl-модули в Jetbrains IDE:
Откройте Jetbrains IDE.
В контекстном меню выберите Tools → Perl5 → Refresh Interpreter Information.
Настройка и запуск отладчика
Сервис может запускаться разными способами. Рассмотрим наиболее популярные серверы: PSGI и uWSGI.
PSGI
PSGI-сервер — программа на Perl, предоставляющая среду для запуска в ней PSGI-приложения. Принцип действия: запускается единственный экземпляр Perl-сервиса, который слушает порт и обрабатывает запросы по протоколу PSGI
. Есть несколько модулей для реализации PSGI-сервера. Рассмотрим для примера HTTP::Server::PSGI
и Plack
.
Пример PSGI-сервера HTTP::Server::PSGI
#!/usr/bin/env perl
use strict;
use warnings;
use App::Base;
use HTTP::Server::PSGI;
my
host => "0.0.0.0",
port => 3000,
timeout => 120,
);
$server->run(&App::Base::app);
Пример PSGI-сервера с Plack
#!/usr/bin/env perl
use strict;
use warnings;
use Plack::Builder;
use App::Base;
builder {
\&App::Base::app;
};
Настройка Docker для отладки
Для отладки Perl-приложений требуется установить модуль отладчика Camelcadedb.
Добавьте в
Dockerfile
команду установки модуля отладчикаCamelcadedb
:
RUN \
cpanm Devel::Camelcadedb \
&& rm -rf /root/.cpanm
Добавьте загрузку модуля
Camelcadedb
в параметре command вdocker-compose.yml
:
Для
HTTP::Server::PSGI
:
[ "perl", "-d:Camelcadedb", "/opt/app/docker-app/app/app.pl" ]
Для
Plack
:
[ "plackup", "-p", "3000", "-M","Devel::Camelcadedb" , "/opt/app/docker-app/app/app-plack.pl"]
Пропишите переменные окружения в
docker-compose.yml
:
environment:
PERL5LIB: /opt/app/lib
PERL5_DEBUG_AUTOSTART: ${DEBUG-0}
PERL5_DEBUG_ROLE: client
PERL5_DEBUG_HOST: host.docker.internal
PERL5_DEBUG_PORT: 40000
Настройка Jetbrains IDE для отладки
На GitHub есть готовые конфигурационные файлы с настройками отладчика.
Откройте Jetbrains IDE.
Настройте Jetbrains IDE для отладки:
Создайте конфигурацию отладчика для перезапуска Docker-контейнеров:
Создайте файл docker restart app.run.xml.
Наполните файл. Пример. После открытия файла Jetbrains IDE предложит открыть конфигурацию отладки.
Нажмите на кнопку Open Run/Debug Configurations. Откроется окно конфигурации отладки.
Нажмите на кнопку OK.
Создайте конфигурацию отладчика для Perl:
Создайте файл Perl debug app.run.xml.
Наполните файл. Пример. После открытия файла Jetbrains IDE предложит открыть конфигурацию отладки.
Нажмите на кнопку Open Run/Debug Configurations. Откроется окно конфигурации отладки.
Нажмите на кнопку OK.
Из существующих конфигураций отладки выберите Perl debug app.
Запустите Docker-контейнеры из директории с файлом
docker-compose.yml
:
cd docker-app
docker compose up
В панели инструментов Jetbrains IDE нажмите на кнопку запуска отладки.
uWSGI
uWSGI — веб-сервер и сервер веб-приложений, первоначально реализованный для запуска приложений на Python через протокол WSGI, но есть плагин и для запуска приложений на Perl.
Добавьте в
Dockerfile
команду установки модулей отладчикаCamelcadedb
иPlack::Middleware::Camelcadedb
:
RUN cpanm Devel::Camelcadedb \
Plack::Middleware::Camelcadedb \
&& rm -rf /root/.cpanm
Пропишите переменные окружения в
docker-compose.yml
:
environment:
PERL5LIB: /opt/app/lib
PERL5_DEBUG_HOST: "host.docker.internal"
PERL5_DEBUG_PORT: 40000
Настройте Jetbrains IDE для отладки:
Создайте файл Perl
debug uwsgi.run.xml
.Наполните файл. Пример. После открытия файла Jetbrains IDE предложит открыть конфигурацию отладки.
Нажмите на кнопку Open Run/Debug Configurations. Откроется окно конфигурации отладки.
Нажмите на кнопку OK.
Из существующих конфигураций отладки выберите Perl debug uwsgi.
Запустите Docker-контейнеры из директории с файлом
docker-compose.yml
:
cd docker-uwsgi
docker compose up
В панели инструментов Jetbrains IDE нажмите на кнопку запуска отладки.
Работа с отладчиком
Выполните настройку отладчика.
Поставьте точку прерывания. В данном примере — в файле Base.pm.
Откройте в браузере адрес http://localhost. Окно Jetbrains IDE станет активным, и выполнение кода остановится на точке прерывания.
Чтобы продолжить работу, выберите один из вариантов:
Resume Program — перейти к следующей точке прерывания.
Step Over — перейти к следующей строке.
Step Into — перейти к коду вызываемой функции.
Заключение
В компаниях все Perl-приложения, которые переносятся на более современные языки программирования, всё равно нужно поддерживать. Если сервис большой, то это может затянуться, что приводит к доработке приложения. При этом дорабатывать без отладки довольно сложно – это замедляет скорость разработки и затрудняет поиск ошибок.
С такими инструментами, как Docker и Jetbrains IDE можно применять наиболее актуальные подходы к разработке на Perl.