Введение

Репозиторий программных модулей Perl

Комплексная сеть архивов Perl (Comprehensive Perl Archive Network, CPAN) — это хранилище более 250 000 программных модулей и сопутствующей документации для 39 000 дистрибутивов, написанных на языке программирования Perl более чем 12 000 разработчиков. CPAN может означать как саму архивную сеть, так и программу на Perl, которая служит интерфейсом к сети и автоматизированным установщиком программного обеспечения (в некоторой степени напоминающим менеджер пакетов). Большинство программ в CPAN распространяются под свободной и открытой лицензией.

История

CPAN был задуман в 1993 году и функционирует в сети с октября 1995 года. Он основан на модели CTAN и изначально создавался как платформа для объединения структуры разрозненных архивов Perl.

Роль

Как и многие языки программирования, Perl имеет механизмы для использования внешних библиотек кода, позволяющие одному файлу содержать общие подпрограммы, используемые несколькими программами. Perl называет их модулями. Модули Perl обычно устанавливаются в один из нескольких каталогов, пути к которым указываются интерпретатору Perl при его первой компиляции; в Unix-подобных операционных системах распространёнными путями являются /usr/lib/perl5, /usr/local/lib/perl5 и несколько их подкаталогов. Perl поставляется с небольшим набором базовых модулей. Некоторые из них выполняют задачи начальной настройки, такие как ExtUtils::MakeMaker, который используется для создания файлов Makefile для сборки и установки других расширений; другие, такие как List::Util, просто широко используются. Основная цель CPAN — помочь программистам находить модули и программы, не входящие в стандартный дистрибутив Perl. Его структура децентрализована. Авторы поддерживают и улучшают собственные модули. Разветвление и создание конкурирующих модулей для одной и той же задачи или цели — обычное явление. Существует сторонняя система отслеживания ошибок, которая автоматически настраивается для любого загруженного дистрибутива, но авторы могут выбрать другую систему отслеживания ошибок, например, GitHub. Аналогично, хотя GitHub является популярным местом для хранения исходного кода дистрибутивов, он может храниться в любом месте, предпочитаемом автором, или вообще не быть общедоступным. Разработчики могут предоставлять другим права на поддержку или перехват управления своими модулями, а администраторы могут предоставлять права желающим перехватить управление заброшенными модулями. Предыдущие версии обновлённых дистрибутивов сохраняются на CPAN до удаления загрузчиком, а вторичная зеркальная сеть под названием BackPAN сохраняет дистрибутивы, даже если они удалены из CPAN. Кроме того, полная история CPAN и всех его модулей доступна в виде проекта GitPAN, что позволяет легко просматривать полную историю каждого модуля и упрощает поддержку ответвлений. CPAN также используется для распространения новых версий Perl, а также связанных проектов, таких как Parrot и Raku.

Структура

Файлы в CPAN называются дистрибутивами. Дистрибутив может состоять из одного или нескольких модулей, файлов документации или программ, упакованных в общий формат архивации, такой как gzipped tar-архив или ZIP-файл. Дистрибутивы часто содержат скрипты установки (обычно называемые Makefile.PL или Build.PL) и тестовые скрипты, которые можно запустить для проверки правильности работы содержимого дистрибутива. Новые дистрибутивы загружаются на сервер загрузки авторов Perl, или PAUSE (см. раздел «Загрузка дистрибутивов с помощью PAUSE»). В 2003 году дистрибутивы начали включать файлы метаданных, называемые META.yml, которые указывают имя дистрибутива, версию, зависимости и другую полезную информацию; однако не все дистрибутивы содержат метаданные. Если метаданные отсутствуют в дистрибутиве, программное обеспечение PAUSE попытается проанализировать код в дистрибутиве, чтобы найти ту же информацию; это не всегда надежно. В 2010 году была создана версия 2 этой спецификации для использования через новый файл под названием META.json, а файл в формате YAML часто также включается для обратной совместимости. Учитывая тысячи дистрибутивов, CPAN должен быть структурирован для удобства использования. Авторы часто размещают свои модули в естественной иерархии имен модулей Perl (например, Apache::DBI или Lingua::EN::Inflect) в соответствии с назначением или областью применения, хотя это не является обязательным требованием. Дистрибутивы модулей CPAN обычно имеют названия в формате CGI Application 3.1 (где «::», используемые в имени модуля, заменены дефисом, а номер версии добавлен к имени), но это лишь соглашение; многие известные дистрибутивы нарушают это соглашение, особенно те, которые содержат несколько модулей. Соображения безопасности не позволяют заменить дистрибутив файлом с тем же именем, поэтому практически все имена дистрибутивов включают номер версии.

Компоненты

Распределительная инфраструктура CPAN состоит из её всемирной сети, включающей более 250 зеркал в более чем 60 странах. Каждое полное зеркало содержит около 31 гигабайта данных. Большинство зеркал обновляются ежечасно, ежедневно или раз в два дня с основного сайта CPAN. Некоторые сайты являются крупными FTP-серверами, зеркалирующими множество других программ, а другие – просто серверами, принадлежащими компаниям, активно использующим Perl. На каждом континенте, кроме Антарктиды, есть как минимум два зеркала. Для помощи программистам Perl в поиске по CPAN было разработано несколько поисковых систем. Официальный поисковик включает в себя текстовый поиск, просматриваемый индекс модулей и извлеченные копии всех дистрибутивов, находящихся в CPAN. 16 мая 2018 года Perl Foundation объявила о закрытии search.cpan.org 29 июня 2018 года (после 19 лет работы) из-за устаревшей кодовой базы и сложности обслуживания. Пользователи будут перенаправлены на стороннюю альтернативу MetaCPAN. CPAN Testers – это группа добровольцев, которые загружают и тестируют дистрибутивы сразу после их загрузки в CPAN. Это позволяет авторам тестировать свои модули на множестве платформ и в различных средах, к которым они в противном случае не имели бы доступа, что способствует переносимости и повышению качества. Smoke testers отправляют отчеты, которые затем собираются и используются для различных веб-сайтов, включая основной сайт отчетов, статистику и информацию о зависимостях. Авторы могут загружать новые дистрибутивы в CPAN через Perl Authors Upload Server (PAUSE). Для этого им необходимо запросить учетную запись PAUSE. После регистрации они могут использовать веб-интерфейс на pause.perl.org или FTP-интерфейс для загрузки файлов в свой каталог и их удаления. Модули будут индексироваться как канонические только в том случае, если имя модуля ещё не использовалось (предоставляя приоритет первому загрузившему), или если у загружающего есть разрешение на использование этого имени, и если версия модуля выше, чем любая существующая запись. Это можно указать через веб-интерфейс PAUSE.

CPAN.pm, CPANPLUS и cpanminus

Существует также модуль Perl core с именем CPAN; он обычно отличается от самого репозитория использованием имени CPAN.pm. CPAN.pm – это в основном интерактивная оболочка, которая может использоваться для поиска, загрузки и установки дистрибутивов. В ядре Perl также предусмотрена интерактивная оболочка, которая является обычным способом запуска CPAN.pm. После короткого процесса настройки и выбора зеркала, она использует инструменты, доступные на компьютере пользователя, для автоматической загрузки, распаковки, компиляции, тестирования и установки модулей. Она также способна к самообновлению. Попытка заменить CPAN.pm на более чистое и современное решение привела к созданию набора модулей CPANPLUS (или CPAN++). CPANPLUS разделяет операции загрузки, компиляции и установки модулей от интерактивной оболочки, используемой для ввода команд. Он также поддерживает несколько расширенных функций, таких как проверка криптографических подписей и отчетность о результатах тестирования. Наконец, CPANPLUS может удалять дистрибутивы. CPANPLUS был добавлен в ядро Perl в версии 5.10.0 и удален из него в версии 5.20.0. Более компактная и современная альтернатива этим установщикам CPAN была разработана под названием cpanminus. cpanminus был разработан для минимального потребления памяти, что часто необходимо в средах с ограниченными ресурсами, и для использования в качестве автономного скрипта, способного даже к самоустановке, требуя лишь наличие ожидаемого набора основных модулей Perl. Он также доступен в CPAN как модуль App::cpanminus, который устанавливает скрипт. Он не поддерживает и не полагается на постоянную конфигурацию, а настраивается только через переменные окружения и параметры командной строки. cpanminus не имеет компонента интерактивной оболочки. Он распознает формат cpanfile для указания зависимостей, что полезно в ad hoc Perl-проектах, которые могут быть не предназначены для установки через CPAN. cpanminus также обладает возможностью удаления дистрибутивов. Каждый из этих модулей может проверять зависимости дистрибутива и рекурсивно устанавливать любые необходимые зависимости, либо автоматически, либо с подтверждением пользователя. Все они поддерживают протоколы FTP и HTTP и могут работать через брандмауэры и прокси-серверы.

Влияние

Опытные программисты часто отмечают, что половина мощности Perl заключена в CPAN. Его называют главным преимуществом Perl. Он примерно эквивалентен Composer для PHP; PyPI (Python Package Index) – репозиторий для Python; RubyGems для Ruby; CRAN для R; npm для Node.js; LuaRocks для Lua; Maven для Java; и Hackage для Haskell. Использование CPAN структурированных пространств имен, системы тестирования и чёткого стиля документации делает его уникальным. Учитывая его важность для сообщества разработчиков Perl, CPAN как формирует, так и формируется культурой Perl. Его "самопровозглашенный главный библиотекарь", Яркко Хиетаниеми, часто участвует в шутках в День дураков; 1 апреля 2002 года сайт был временно переименован в CJAN, где "J" обозначало "Java". В 2003 году доменное имя www.cpan.org было перенаправлено на Matt's Script Archive, сайт, печально известный в сообществе Perl из-за плохо написанного кода. Некоторые дистрибутивы в CPAN распространяются в виде шуток. Иерархия Acme:: зарезервирована для шуточных модулей; например, Acme::Don't добавляет функцию don't, которая не выполняет переданный ей код (в дополнение к встроенной функции do, которая выполняет). Даже за пределами иерархии Acme:: некоторые модули пишутся в основном ради развлечения; одним из примеров является Lingua::Romana::Perligata, который позволяет писать программы на Perl на подмножестве латинского языка. В 2005 году группа разработчиков Perl, также интересующихся JavaScript, объединилась для создания JSAN – сети архивов JavaScript. JSAN является почти прямой пересадкой инфраструктуры CPAN для использования с языком JavaScript, который на протяжении большей части своего существования не имел единого "сообщества". В 2008 году, после случайной встречи с администратором CPAN Адамом Кеннеди на конференции разработчиков Open Source, разработчик ядра Linux Расти Расселл создал CCAN – Comprehensive C Archive Network. CCAN является прямой пересадкой архитектуры CPAN для использования с языком C. CRAN, Comprehensive R Archive Network, представляет собой набор зеркал, размещающих дистрибутивы языка программирования R, документацию и дополнительные пакеты.