Я Марсель Ардуанов, руководитель команды разработки VK и по совместительству Go-разработчик. После перехода в другое бизнес-подразделение я столкнулся с сервисами на языке Perl. Если вы посмотрите рейтинг языков программирования в 2023 году на Хабре, то увидите, что он не входит в этот список.

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

Введение

Для наглядности я создал тестовый сервис на Perl. Можете клонировать его и пройтись по этой статье вместе с ним. Репозиторий содержит примеры конфигураций для запуска Docker-контейнера с Perl-сервисом и настройкой отладчика.

Директории проекта:

  • docker-app — пример отладки на чистом Perl, который содержит Docker-контейнеры perl и nginx.

  • docker-uwsgi — пример отладки с помощью сервера uWSGI для запуска Perl, который содержит Docker-контейнеры uwsgi и nginx.

  • lib — код запускаемого сервиса.

Работа с зависимостями

Для удобной работы с зависимостями (модулями) нам потребуется:

  1. Шаг 1:

    1. Прописать зависимости в Dockerfile и docker-compose.yml.

    2. Собрать и запустить Docker-контейнеры.

  2. Шаг 2. Отобразить зависимости в IDE с помощью запущенных Docker-контейнеров.

Запуск сервиса через docker compose

  1. Создайте и наполните файл Dockerfile для запуска сервиса.

  2. Создайте и наполните файл docker-compose.yml для запуска сервиса.

  3. Соберите и запустите Docker-контейнеры из директории с файлом docker-compose.yml:

cd docker-app
docker compose up --build

Запущенный сервис будет доступен по адресу http://localhost.

Настройка отображения зависимостей в IDE

Я знаю только одну компанию, которая разрабатывает IDE и позволяет отлаживать Perl-код — Jetbrains. Чтобы отобразить зависимости Docker-контейнеров, которые уже запущены, выполните основную и дополнительную настройку.

Основная настройка

  1. Установите любую Jetbrains IDE. Например, IntelliJ IDEA (Community Edition).

  2. Откройте Jetbrains IDE.

  3. Установите плагин Perl:

    1. В контекстном меню выберите Settings. Откроется окно настроек.

    2. Перейдите к разделу Plugins.

    3. Найдите и установите плагин Perl.

    4. Примените настройки.

    Примечание. Чтобы ознакомиться детальнее с плагином Perl, используйте документацию.

  4. Настройте интерпретатор Perl:

    1. В контекстном меню выберите Settings. Откроется окно настроек.

    2. Перейдите к разделу Languages & Frameworks.

    3. Перейдите к разделу Perl5.

    4. Справа от поля Perl5 Interpreter нажмите на значок шестерёнки.

    5. В выпадающем меню выберите Add System Perl > Docker. Откроется окно выбора Docker-контейнера.

    6. Выберите Docker-контейнер сервиса.

    7. Нажмите на кнопку OK. Откроется окно выбора исполняемого файла Perl.

    8. Выберите путь к исполняемому файлу Perl.

    9. Нажмите на кнопку OK.

      Примечание. Если вы используете Docker-контейнер на основе официального образа Perl, выберите директорию /usr/local/bin/perl. Если вы хотите использовать системный Perl, выберите директорию /usr/bin/perl.

Дополнительная настройка

После выполнения основной настройки:

  • В Jetbrains IDE перенесутся все Perl-модули, которые прописаны в Dockerfile.

  • Jetbrains IDE начнёт индексировать Perl-модули в Docker-контейнерах.

Если вы обновляете зависимости в Docker-контейнерах, необходимо переиндексировать Perl-модули в Jetbrains IDE:

  1. Откройте Jetbrains IDE.

  2. В контекстном меню выберите 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.

  1. Добавьте в Dockerfile команду установки модуля отладчика Camelcadedb:

RUN \
  cpanm Devel::Camelcadedb \
  && rm -rf /root/.cpanm
  1. Добавьте загрузку модуля 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"]
  1. Пропишите переменные окружения в 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 есть готовые конфигурационные файлы с настройками отладчика.

  1. Откройте Jetbrains IDE.

  2. Настройте Jetbrains IDE для отладки:

    1. Создайте конфигурацию отладчика для перезапуска Docker-контейнеров:

      1. Создайте файл docker restart app.run.xml.

      2. Наполните файл. Пример. После открытия файла Jetbrains IDE предложит открыть конфигурацию отладки.

      3. Нажмите на кнопку Open Run/Debug Configurations. Откроется окно конфигурации отладки.

      4. Нажмите на кнопку OK.

    2. Создайте конфигурацию отладчика для Perl:

      1. Создайте файл Perl debug app.run.xml.

      2. Наполните файл. Пример. После открытия файла Jetbrains IDE предложит открыть конфигурацию отладки.

      3. Нажмите на кнопку Open Run/Debug Configurations. Откроется окно конфигурации отладки.

      4. Нажмите на кнопку OK.

  1. Из существующих конфигураций отладки выберите Perl debug app.

  1. Запустите Docker-контейнеры из директории с файлом docker-compose.yml:

cd docker-app
docker compose up
  1. В панели инструментов Jetbrains IDE нажмите на кнопку запуска отладки.

uWSGI

uWSGI — веб-сервер и сервер веб-приложений, первоначально реализованный для запуска приложений на Python через протокол WSGI, но есть плагин и для запуска приложений на Perl.

  1. Добавьте в Dockerfile команду установки модулей отладчика Camelcadedb и Plack::Middleware::Camelcadedb:

RUN cpanm Devel::Camelcadedb \
  Plack::Middleware::Camelcadedb \
  && rm -rf /root/.cpanm
  1. Пропишите переменные окружения в docker-compose.yml:

environment:
  PERL5LIB: /opt/app/lib
  PERL5_DEBUG_HOST: "host.docker.internal"
  PERL5_DEBUG_PORT: 40000
  1. Настройте Jetbrains IDE для отладки:

    1. Создайте файл Perl debug uwsgi.run.xml.

    2. Наполните файл. Пример. После открытия файла Jetbrains IDE предложит открыть конфигурацию отладки.

    3. Нажмите на кнопку Open Run/Debug Configurations. Откроется окно конфигурации отладки.

    4. Нажмите на кнопку OK.

  1. Из существующих конфигураций отладки выберите Perl debug uwsgi.

  2. Запустите Docker-контейнеры из директории с файлом docker-compose.yml:

cd docker-uwsgi
docker compose up
  1. В панели инструментов Jetbrains IDE нажмите на кнопку запуска отладки.

Работа с отладчиком

  1. Выполните настройку отладчика.

  2. Поставьте точку прерывания. В данном примере — в файле Base.pm.

  1. Откройте в браузере адрес http://localhost. Окно Jetbrains IDE станет активным, и выполнение кода остановится на точке прерывания.

  1. Чтобы продолжить работу, выберите один из вариантов:

    • Resume Program — перейти к следующей точке прерывания.

    • Step Over — перейти к следующей строке.

    • Step Into — перейти к коду вызываемой функции.

Заключение

В компаниях все Perl-приложения, которые переносятся на более современные языки программирования, всё равно нужно поддерживать. Если сервис большой, то это может затянуться, что приводит к доработке приложения. При этом дорабатывать без отладки довольно сложно – это замедляет скорость разработки и затрудняет поиск ошибок.

С такими инструментами, как Docker и Jetbrains IDE можно применять наиболее актуальные подходы к разработке на Perl.

Комментарии (4)


  1. PavelKuptsov
    12.07.2023 17:00
    +1

    Только что несовременного в Perl? Регулярные релизы уже говорят об актуальности, как минимум.
    Другое дело что немодный и дорого ( один разраб стОит как пачка похапистов ), это да.
    Статья хорошая ????


    1. m_arduanov Автор
      12.07.2023 17:00

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


  1. nuclight
    12.07.2023 17:00

    Кроме Jetbrains IDE под скриптовые языки делает еще ActvieState, Komodo называется. А вообще всё этой описание выглядит крайне переусложненным.


    1. m_arduanov Автор
      12.07.2023 17:00

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