Как я могу управлять зависимостями модуля Perl?

В настоящее время я работаю над проектом, в котором в качестве основы используется структура, разработанная другим отделом. В настоящее время мы внедряем стандарты качества (наконец-то, ура!) в нашем отделе, но пока невозможно внедрить их в другой отдел. Как следствие, мы работаем с постоянно меняющейся целью без стабильности API или стабильных выпусков, что как минимум напрягает.

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

  1. Использование только определенных диапазонов версий модулей фреймворка, определенных в коде.
  2. Использование проверки модульного тестирования, чтобы убедиться, что все необходимые версии по-прежнему доступны.
  3. Каждое расширение диапазона версий, требующее рецензирования кода фреймворка.

Пока такой план. Теперь вопросы:

  1. Это разумно? Если нет, какие еще идеи?
  2. Как это реализовать в Perl? Используя use Module, мы можем определить только самую низкую версию кода, с которой предполагается работать.

person Nikolai Prokoschenko    schedule 31.07.2009    source источник


Ответы (7)


Это очень разумный план, и я реализую его через частный репозиторий, похожий на CPAN, который я называю «DPAN». Вы выбираете нужные дистрибутивы и версии из реального CPAN (или BackPAN) и создаете из него свой собственный репозиторий. Ваши CPAN-клиенты указывают только на этот репозиторий, фактически замораживая версии именно так, как вам нужно. Вы только обновить, когда вы хотите.

Кроме того, DPAN позволяет вам легко добавлять не только свой собственный локальный частный код, но и модифицировать сторонние пакеты для устранения проблем с их установкой и т. д. У меня есть полное обоснование этой идеи в летнем выпуске журнала Обзор Perl. Вы также можете посмотреть мои слайды из моего доклада Создание собственного CPAN на YAPC. ::Россия.

Если вам интересно такое решение, ознакомьтесь с моим MyCPAN::App::DPAN модуль. Он берет каталог дистрибутивов и делает все остальное за вас. Вы указываете на него своему CPAN-клиенту (и гарантируете, что он не будет подключаться к Интернету), и все.

Как только вы сможете создать свой собственный репозиторий, вы сможете легко создать тестовый репозиторий. Сделайте дамп версий, которые, по вашему мнению, вы хотите обновить, разверните код на тестовом сервере и соберите результаты. Если вам не нравятся результаты, вы можете легко изменить репозиторий.

Следующий большой шаг в моей работе с DPAN — взять существующую установку Perl с любыми модулями, которые вы могли установить, и создать репозиторий, который даст вам это состояние установки. У меня есть все основные части, необходимые для работы, но я был немного занят, чтобы заставить пару клиентов работать с первыми частями.

Если вы хотите узнать больше об этом материале, просто дайте мне знать. :)

person brian d foy    schedule 31.07.2009
comment
ДПАН звучит отлично. Как только я проиндексирую свои модули, как мне указать на них мой CPAN-клиент? - person jeje; 31.07.2009
comment
Если вы используете CPAN.pm, вы можете изменить настройку urllist на file:///URL. Это то же самое, что вы сделали бы для miniCPAN. Сейчас я ухожу на работу, но если у вас возникнут проблемы, напишите мне по электронной почте ([email protected]). - person brian d foy; 31.07.2009

Взгляните на PAR. Он позволяет объединить набор зависимостей в один файл. Вы можете взять модули, которые они выпускают, добавить их в PAR-файл и обновить PAR-файл только тогда, когда захотите принять их изменения.

person Chas. Owens    schedule 31.07.2009
comment
Однако у этого есть проблема с переносимостью. У PAR есть проблемы с скомпилированным кодом и динамическими библиотеками. Возможно, в данном случае это не имеет значения, но для некоторых из m клиентов это имело значение. - person brian d foy; 31.07.2009
comment
Почему вы не сообщили об этих вещах как об ошибках? Не то чтобы ты не знал, как связаться со мной. Кроме того, как у него возникают проблемы с скомпилированным кодом? Насколько я знаю, это просто означает, что вам нужно будет создать .par для каждой целевой платформы: в конце концов, это двоичный формат. В принципе, он должен нормально работать с разделяемыми библиотеками. - person tsee; 01.08.2009

Хотя я надеюсь, что CPAN более стабилен, чем модули, на которые вы полагаетесь, позвольте мне задать аналогичный вопрос: как вы защитите себя от неожиданных изменений в модуле CPAN?

Один ответ: вы загрузите модуль и регрессируете свой код против него в тестовой среде.

Можно ли использовать здесь то же самое? Вы должны указать на «живые» копии их модулей, или вы могли бы указать на свои собственные копии?

person jimtut    schedule 31.07.2009
comment
CPAN нестабилен в том смысле, что вы не можете запретить никому что-либо делать. Конкретный модуль может быть полностью свободен от ошибок, но даже изменение интерфейса может привести к поломке кода, который от него зависит. Главный виновник — это дизайн цепочки инструментов CPAN, где самый последний выпуск — это тот, который клиенты пытаются установить. - person brian d foy; 31.07.2009

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

person Sinan Ünür    schedule 31.07.2009

Ну, я думаю, что Carton — это то, что вы ищу (сборщик для perl). В сочетании с plenv я считаю, что это поможет.

person sirfilip    schedule 11.02.2015

Кто-то уже указал на PAR. Позвольте мне упомянуть PAR::Repository и его сопутствующий модуль PAR::Repository::Client. Они реализуют инфраструктуру клиент/сервер, которая может автоматически загружать любые зависимости, которые не найдены локально (или которые могут даже предпочесть пакеты сервера). Как администратор, вы можете просто добавлять или удалять пакеты в свой репозиторий или из него. Фактическая доставка пакетов осуществляется с помощью совершенно обычных серверов: подойдет любой сервер http(s) или просто file://. Другие протоколы должны быть довольно простыми в реализации.

Он имеет вышеупомянутый волшебный механизм автозагрузки, установку пакетов и автоматическое обновление пакетов. Помимо документации модуля, вы можете ознакомиться с презентацией PAR с YAPC::Europe 2008, который до некоторой степени покрывает это.

Я должен признать, что автоматическое обновление — достаточно продвинутая технология, которая может съесть ребенка или двух, если у нее закончатся котята, которых можно грызть.

person tsee    schedule 01.08.2009

Если вы хотите проверить версию внешних модулей, вы можете (если они хотя бы правильно сообщают о своей $VERSION) использовать что-то вроде этого:

BEGIN {
    use foo;
    use bar;

    die "Ghaaaa" if $foo::VERSION < 2.1;
    die "Aaaargh" if $foo::VERSION > 3.12;
}
person wazoox    schedule 31.07.2009
comment
На практике это не работает, потому что вы должны делать это для каждого модуля. Возможно, вы можете ограничить foo, но это не защитит от обновлений зависимостей foo. - person brian d foy; 31.07.2009
comment
То же самое: используйте foo 2.1; (только минимум) - person Alexandr Ciornii; 01.08.2009