Назад | Перейти на главную страницу

Тихая установка модулей CPAN и Perl по сценарию?

Мне нужно установить CPAN и некоторые модули Perl автоматически в установочном скрипте Scientific Linux (RHEL). К сожалению, конкретные модули, которые мне нужны (по крайней мере, один из них), не могут быть найдены как RPM: s, насколько я видел.

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

Это не кажется очень необычным требованием, но я не видел по этому поводу действительно хорошей документации. Проблема в том, что всякий раз, когда CPAN запускается впервые, запускается интерактивная конфигурация. Можно это как-то пропустить? А как запустить установку модуля прямо из командной строки?

Попробуйте установить эту переменную среды перед запуском CPAN:

export PERL_MM_USE_DEFAULT=1

Это заставляет perl автоматически отвечать «да», когда CPAN спрашивает «Вы хотите настроить как можно больше автоматически? [Да]»

Источник

«А как мне запустить установку модуля прямо из командной строки?»

Это должно делать:

perl -MCPAN -e 'install Your::Package'

Если это повторяющаяся задача, можно потратить несколько часов на cpan2rpm и превратить их в RPM. По моему опыту, запуск CPAN (даже интерактивный) слишком страдает от неожиданных событий (причуды версии, проблемы с сетью, сбои фиктивных тестов), чтобы на них можно было положиться при (полу) автоматической установке.

Вы можете посмотреть на cpanm для этого; он легкий, поддерживает сценарии оболочки и намного проще, чем классический CPAN.

Это должно творить чудеса:

get_cpanm(){
    if [ \! -f /usr/local/bin/cpanm ]; then
            cd $TMP_DIR && curl --insecure -L http://cpanmin.us | perl - App::cpanminus
            if [ \! -f /usr/local/bin/cpanm ]; then
                    echo "Downloading from cpanmin.us failed, downloading from xrl.us"
                    curl -LO http://xrl.us/cpanm &&
            chmod +x cpanm &&
            mv cpanm /usr/local/bin/cpanm
            fi
    fi
    CPANM=$(which cpanm);
    if [ \! -f "$CPANM" ]; then
            echo "ERROR: Unable to find cpanm"
            return 1;
    fi
    return 0
}
cpanm Time::HiRes CGI Moose Config::JSON other::cpanmodules