Я Марсель Ардуанов, руководитель команды разработки 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.
ссылка на оригинал статьи https://habr.com/ru/companies/vk/articles/746558/

















Добавить комментарий