Могу ли я повторно протестировать все установленные модули CPAN?

Если модуль A опирается на модуль B и модуль B обновляется, A может сломаться из-за изменений. Моя идея состоит в том, чтобы повторно протестировать оба A а также B после обновления B,

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

Есть ли способ скачать и протестировать?

Если нет никакого способа, есть ли какие-нибудь помощники /API, чтобы я мог реализовать такой инструмент?

Мне в основном нужно

  • запросить, что установлено (включая номера версий)
  • скачать и распаковать точные версии
  • выполнять тесты

2 ответа

cpan инструмент, который поставляется с ядром Perl включает в себя -l опция, которая направляет его, чтобы предоставить список установленных модулей. Например, последние 10 элементов в списке в моей системе:

$ cpan -l 2>/dev/null |tail -10
Test2::Event::Encoding  1.302073
Test2::Event::Bail  1.302073
Test2::Event::Exception 1.302073
Test2::Event::Subtest   1.302073
Test2::Event::Skip  1.302073
Test2::Event::Info  1.302073
Test2::Event::Diag  1.302073
Test2::Event::TAP::Version  1.302073
JSON::PP    2.27400_02
JSON::PP::Boolean   undef

Как показано здесь, вы получите список модулей и номеров версий. Иногда инструмент не находит версию в META и поэтому возвращает undef для номеров версий. Авторы CPAN должны быть в поиске таких ошибок, поскольку они усложняют инструменты, которые хотят идентифицировать версию без компиляции самого модуля.

Когда у вас есть модули и номера версий, вы можете использовать cpanm инструмент (предоставляемый App::cpanm) с его --test-only возможность вытащить модуль определенной версии и протестировать его. Вы можете запросить конкретную версию, как это:

cpanm Some::Module@0.9990

(Сносит только версию 0.9990 целевого модуля).

Сложности заключаются в следующем: Perl поставляется с кучей модулей, и некоторые из них также получают обновления через CPAN. cpan -l Инструмент выведет список всех установленных модулей, включая те, которые поставляются с Perl.

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

Еще один полезный инструмент, который входит в состав Perl начиная с 5.8.9, это corelist, Если вы запустите это:

corelist File::Temp

Ты получишь: "File::Temp was first released with perl v5.6.1"

Если вы делаете это:

corelist JSON

Ты получишь: "JSON was not in CORE (or so I think)"

Поэтому довольно просто определить, является ли модуль, который вы просматриваете в своем списке, тем, который поставляется с Perl, или нет. Используйте эту информацию по своему усмотрению.

Еще одна вещь, которую вы должны решить, это что делать с общими зависимостями. Если первое, что вы протестируете, - это обновление Moose, вы добавите половину CPAN (это преувеличение), и это испортит вашу среду для тестирования других модулей. Чтобы смягчить этот эффект, у вас есть несколько вариантов. Один заключается в том, чтобы использовать App::perlbrew И его lib возможность настроить одноразовое пространство библиотеки. Таким образом, вы можете установить модуль и его зависимости в месте назначения, обозначенном perlbrew lib а также perlbrew useи затем выбросите его, когда закончите, чтобы перейти к следующей библиотеке для тестирования.

Тем не менее, может быть лучшее решение, о котором я недостаточно знаком, чтобы документировать здесь: Набор инструментов, используемый CPAN-тестерами дыма. Смотрите CPAN::Testers, если вы хотите следовать этой стратегии. Тестеры дыма разработали относительно легкие подходы к автоматическому демонтажу и тестированию модулей с их зависимостями.

Наконец, еще одна проблема, с которой вы столкнетесь, заключается в том, что авторы CPAN - это те, кто решает, какие версии их модулей находятся на CPAN, а какие удаляются. Несколько лет назад авторам CPAN было предложено поддерживать чистоту своих репозиториев CPAN, удаляя старые версии. Я не знаю, поощряется ли эта практика, но это означает, что вы не можете рассчитывать на конкретный номер версии, который все еще существует. Чтобы решить эту проблему, вы, вероятно, должны поддерживать свой собственный репозиторий tar-архивов для всех версий, которые вы установили в данный момент времени. Каркас модуля CPAN Pinto помогает хранить версии модуля, закреплять некоторые из них, чтобы они не обновлялись, и другие полезные приемы.

Если вы загружаете и распаковываете дистрибутив B а также cd в этот каталог, вы можете использовать двоичный файл brewbuild из моего Test:: BrewBuild (ПРИМЕЧАНИЕ: требуется Perlbrew или Berrybrew) с -R ака --revdep флаг для проверки B а также все дистрибутивы, которые требуют B:

~/repos/Mock-Sub $ brewbuild -R

reverse dependencies: Test::Module::CheckDep::Version, App::RPi::EnvUI, RPi::DigiPot::MCP4XXXX, Devel::Examine::Subs, PSGI::Hector, File::Edit::Portable, Devel::Trace::Subs

Test::Module::CheckDep::Version
5.26.1 :: PASS

App::RPi::EnvUI
5.26.1 :: FAIL

RPi::DigiPot::MCP4XXXX
5.26.1 :: FAIL

Devel::Examine::Subs
5.26.1 :: PASS

PSGI::Hector
5.26.1 :: PASS

File::Edit::Portable
5.26.1 :: PASS

Devel::Trace::Subs
5.26.1 :: PASS

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

Другие вопросы по тегам