image

У меня на работе, в одном из проектов, используется модуль XML::WBXML. Это модуль для работы с бинарным XML — WAP Binary XML.

К сожалению, модуль обновлялся последний раз в 2006 году, т.е. 9 лет назад. С тех пор от Дэвида Глессера (David Glasser), автора модуля, не было ни слуху, ни духу, багрепорты висели неотвеченными, баги, соответственно, неисправленными. Модуль был забыл и заброшен.

Нужно было что-то с этим делать. Ниже я хочу поделиться своим опытом получения контроля над заброшенным модулем Perl.

В частности, один из багов модуля заключался в том, что при установке не проходили тесты (make test выдавал ошибку) и установка прерывалась. Ошибка же проистекала из того, что за последние 9 лет произошли изменения в библиотеке libwbxml2, которая используется в самом модуле. Библиотека стала выдавать ответы немного в другом виде и тест из-за этого сломался.

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

В связи с этим я решил попробовать сделать свой модуль для CPAN, с блэкджеком и шлюхами.

Форкнул исходный модуль и выложил новый модуль на CPAN под немного видоизмененным названием XML::WB. Ну и, конечно, исправил ошибку в тестах. Теперь модуль можно было поставить стандартным образом прямо из CPAN'а, без ручных манипуляций с исходниками. Пришлось, однако, исправить остальной код в проекте, который использовал этот модуль, так как название изменилось.

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

В это время, по какому-то совпадению, я прочитал новоcть на perlnews.ru, в которой мимоходом упоминалось о возможности получения контроля над заброшенным модулем. В комментариях к новости мне подсказали, что для этого есть более-менее стандартизированная процедура, которая описана тут. В основном всё сводится к «попытайтесь связаться с автором всеми возможными способами, а уж если не получится, тогда, может быть, модуль будет передан вам».

И вот, для начала, я написал автору письмо на все его емейлы, какие нашел, и приготовился ждать ответа. Но перспективы мне казались сомнительными (уж если чувак 9 лет не появлялся).

Через несколько дней я опубликовал пост у себя в блоге, где написал, что вот, мол, сделал форк модуля, если вдруг кому надо. В комментариях к посту мне тут же подкинули ссылку на сайт человека, очень похожего на автора оригинального модуля. Я посмотрел его сайт, посмотрел его Гитхаб… Вроде похоже, но уверенности не было. Этот человек пишет на JS, про Perl никаких упоминаний. Но — чем чёрт не шутит:)

Написал ему письмо. В копию, как полагается, добавил modules@perl.org. И, о чудо! — этот человек мне ответил и он действительно оказался Дэвидом Глессером, автором модуля. Мы обменялись с ним парой писем, оказалось, что он давно уже не занимается Перлом, вместо этого он сейчас пилит на JS фреймворк Meteor, а про Перловый модуль уже почти забыл. Он был бы рад передать мне модуль, но совершенно не помнит пароля к своему аккаунту на CPAN, а емейлы, к которым был привязан аккаунт, тоже давно уже все устарели. Например, там использовался его емейл на mit.edu, который у него был 10 лет назад, когда он там учился.

Я уж думал — всё, тупик. Но тут, вдруг, пришло письмо от Нейла Бауерса (Neil Bowers), одного из администраторов CPAN. Он прочитал нашу переписку с Дэвидом и решил нашу проблему — просто взял и назначил меня мейнтейнером модуля.

Ну, а поскольку у меня уже был готовый исправленный модуль, мне осталось только переименовать его обратно в оригинальный и загрузить на CPAN обновленную версию.

Вдобавок, я разместил модуль на Гитхабе (оригинальный модуль был написан, когда Гитхаба еще не существовало) и явно указал лицензию — perl_5 — что означает, что модуль распространяется на тех же условиях, что и сам Перл.

Надеюсь, я не единственный человек, который пользуется этим модулем, и кому-то от этого будет польза.

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


  1. KOS_MOS
    22.05.2015 21:37
    -7

    Хорошая история, но на перле сейчас пишут единицы


    1. pansa
      23.05.2015 00:21
      +4

      Я знаю как минимум трёх. Но очень нужен еще один =)


      1. FisHlaBsoMAN
        23.05.2015 08:03

        Теперь вы знаете четырёх :)


        1. kloppspb
          23.05.2015 23:13
          +1

          Я с собой ещё двоих действующих приведу :)


          1. PavelKuptsov
            26.05.2015 15:20
            +1

            присоединяюсь к компании :)
            статья очень приятная и правильная. вместо генерации кучу однотипных модулей — лучше меньше, да лучше


      1. dimas
        28.05.2015 16:28

        Я знаю не только перл, а где до сих пор используют целиком перловую систему биллинга :)


  1. SDSWanderer
    23.05.2015 00:57

    Не так давно была проблема с Lingua::RU::Number, написал автору, он был очень удивлен, но все порешал.
    На проблему с использованием последней версии Moose в модуле Net::Amazon::S3 долго никто не реагировал, форкнул себе на гитхаб и ставил оттуда через dev версию Carton'a пока ее все таки не решили.


    1. ivanych Автор
      23.05.2015 09:59

      У Moose ведь есть репозиторий на гитхабе, можно хотя бы пулл-реквест отправить. А в моем случае репозитория не было, так что только через письма:)


  1. Envek
    23.05.2015 11:32
    +1

    Надо сказать, что такая проблема актуальна для любого долгоживущего (больше, скажем, лет пяти) сообщества. В гораздо более молодом мире Ruby уже сейчас есть очень заметное количество совсем заброшенных библиотек (гемов), вокруг которых кучкуется несколько форков с какими-то единичными исправлениями. Какие-то проекты изредка меняют сопровождающего, какие-то возрождаются усилиями сообщества (показательный пример — гем cancan, после исчезновения разработчика возрождённый сообществом под именем cancancan ввиду ну просто бешеной его популярности).