Почему запуск CPAN (Perl) в Windows 10 приводит к раздражающему сообщению об ошибке?

Вопрос или проблема

В Term::ReadLine есть надоедливый косметический дефект, который, похоже, возник из-за пренебрежения обновлением кода для новой Консоли Windows (оставляю вам, хороший читатель, возможность погуглить это самостоятельно).

Сообщение об ошибке выглядит следующим образом:

Не удается получить размер терминала. Вызов Win32 GetConsoleScreenBufferInfo не сработал. Переменные окружения COLUMNS и LINES не сработали. на C:\perl\perl\vendor\lib/Term/ReadLine/readline.pm, строка 410.

  • Точная версия Windows: 10.0.26100.3194
  • Версия Perl: v5.32.1 (StrawberryPerl)
  • Версия модуля readline: Term::ReadLine 1.17

Я знаю, что реализация readline в Perl раньше работала на старой “DOS Box” (CMD shell и так далее); я использовал ее в каком-то коде давным-давно. Здесь я цитирую, что указано в POD для модулей (как прочитано на metacpan.org):

Описание

Этот пакет – всего лишь интерфейс к некоторым другим пакетам. Это заглушка для установки общего интерфейса к различным реализациям ReadLine, найденным на CPAN (в пространстве имен Term::ReadLine::*).

Флориан Рагвиц виноват за Term::ReadLine (извините, Флориан), но кто поддерживает части, которые сломались на Windows? Да, это вопрос. Это не просто отчет об ошибке или жалоба. Второй вопрос: Видят ли другие пользователи эту ошибку?
Не стесняйтесь говорить мне, что я пишу не в то место. Я часто это слышу.

Вы можете насладиться этим сообщением об ошибке, запустив оболочку либо cpan, либо cpanplus.

Ответ или решение

Теория: Причины возникновения ошибки с Term::ReadLine в Windows 10

Проблема, которую вы описали, связана с несовместимостью некоторых библиотек Perl, в частности, модуля Term::ReadLine, с современной версией Windows Console. Windows Console в последнее время претерпела значительные изменения, и в результате некоторые старые методы взаимодействия с консолью стали устаревшими. В этом контексте ошибка “Unable to get Terminal Size” возникает тогда, когда Term::ReadLine не может получить размеры окна терминала, что вызвано несовместимостью вызова функции GetConsoleScreenBufferInfo из Win32 API.

Наиболее распространенной причиной данной ошибки является то, что Term::ReadLine и связанные с ним модули не были обновлены для работы с изменениями в Windows Console, особенно в версии Windows 10.0.26100.3194. Это приводит к тому, что модуль не может определить размеры окна с помощью привычных методов, таких как переменные окружения COLUMNS и LINES. В результате, это вызывает описанную ошибку при выполнении скриптов, использующих CPAN и связанные с ним инструменты.

Пример: Обзор технической документации

Документация к модулю Term::ReadLine на metacpan.org описывает его как "фронтенд" для различных реализаций ReadLine в CPAN. Это означает, что собственно Term::ReadLine выполняет роль обертки для других реализаций, например, Term::ReadLine::Perl или Term::ReadLine::Gnu. Проблема, с которой вы столкнулись, может быть связана именно с интерфейсом, который использует Term::ReadLine для вызова конкретной реализации.

Применение: Решение проблемы и пути устранения ошибки

  1. Обновление и изменение настроек Perl: Во-первых, убедитесь, что вы используете самую последнюю и совместимую с вашей версией Windows версию StrawberryPerl. Периодически обновления Perl содержат исправления таких несовместимостей. Запустите perl -v для проверки текущей версии.

  2. Замена модуля Term::ReadLine: Попробуйте установить альтернативные модули для реализации ReadLine, такие как Term::ReadLine::Gnu, который может иметь лучшее соответствие с вашей ОС. Для этого установите модуль через CPAN:

    cpan Term::ReadLine::Gnu
  3. Установка переменных окружения: Попробуйте вручную установить переменные COLUMNS и LINES. Пусть это не всегда решает проблему, но может служить временным обходным путем:

    set COLUMNS=80
    set LINES=24
  4. Проверка и изменение скриптов Perl: Просмотрите ваши Perl-скрипты и убедитесь, что в них не используется специфичная функциональность старой версии DOS Box, которая могла не поддерживаться в новой версии терминала Windows.

  5. Использование альтернатив эмуляторов терминала: Рассмотрите возможность использования других эмуляторов терминала, таких как Windows Terminal или Git Bash, которые могут иметь более современную поддержку функций, которые не вызывают эту ошибку.

  6. Обратная связь и поддержка сообщества: Рассмотрите возможность участия в обсуждении проблемы на форумах и репозиториях, таких как GitHub или CPAN. Там вы можете найти патчи или временные решения от других пользователей, столкнувшихся с той же проблемой.

Таким образом, данная ошибка связана с устареванием части способов обработки терминала в модулях Perl на Windows 10. Активное участие в обновлении используемых модулей и настройка окружения под ваши нужды поможет избежать подобных проблем в будущем.

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

Капча загружается...