автоматически устанавливать недостающие модули из CPAN - PullRequest
3 голосов
/ 18 ноября 2011

Если я хочу распространять сценарий Perl, каков наилучший способ безболезненной установки любых необходимых модулей, которые отсутствуют в системе пользователя?Дополнительный кредит, если есть возможность даже установить / обновить сам Perl, если он отсутствует или «слишком старый».

Ответы [ 5 ]

6 голосов
/ 18 ноября 2011

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

Вы можете просто отправить все свои зависимости в дистрибутив вашего приложения, каталог inc является обычным.

3 голосов
/ 18 ноября 2011

Обычно это заканчивается созданием CPAN-подобного пакета. Итак, когда вам нужно установить все зависимости, вы набираете make installdeps

См. perldoc perlmodlib Также вам может пригодиться Module::Install и некоторые Makefile.PL пример

Makefile.PL позволяет вам определить deps и требуемую версию perl. Также вы можете добавить

use 5.010;

К вашему сценарию для запуска минимальной версии perl. См. perldoc -f для получения подробной информации .

2 голосов
/ 18 ноября 2011

Если вы посмотрите на cpanminus, это можно установить, просто выполнив один файл:

curl -L http://cpanmin.us | perl - --self-upgrade

Это может быть поведение, которое вы ищете; это делается с помощью App :: Fatpacker. Проверьте это:

https://metacpan.org/module/App::FatPacker

2 голосов
/ 18 ноября 2011

Почему бы не использовать pp (PAR Packager), который создает исполняемый файл. Нет необходимости в Perl или чем-либо еще на целевой машине.

0 голосов
/ 02 декабря 2017

Полуавтоматический скрипт, взятый из здесь , который должен работать для людей со средними навыками bash и почти 0 уровнями perl:

#!/usr/bin/env perl
use strict ; use warnings ;
use 5.10.0 ;
use ExtUtils::Installed;

    #  quick and dirty check for prerequisites perl modules:
    #  courtesy of:http://stackoverflow.com/a/9340304/65706
    #  if you have a calling bash script call by :
    #  perl "/path/to/isg_pub_preq_checker.pl"
    #  export ret=$?
    #  test $ret -ne 0 && doExit 1 "[FATAL] perl modules not found!!!"

    my $PrintOkCheck = 1 ;

    # check that all the required modules are installed
    my ( $ret , $msg ) = doCheckRequiredModules();

    unless ( $ret == 0 ) {
            print "$msg" ;
            # give some time for the user to react
            print "printing all installed modules :" ;
            my $c = 9 ;
            for ( my $i=0;$i<=$c;$i++){
                    print ( ( $c-$i) . '.') ;
                    sleep 1 ;
            }
            print "\n" ;
            doListAllInstalledModules();
            print "\n" ;
    }

    exit(0);

    sub doListAllInstalledModules {
            my $instmod = ExtUtils::Installed->new();
             foreach my $module ($instmod->modules()) {
                    my $version = $instmod->version($module) || "???";
                     print "found module:$module -- v$version\n";
                    }

    }
    #eof sub

    sub doCheckRequiredModules {

            my @modules = qw(
                    YAML::Any
                    Test::More
                    Spreadsheet::XLSX
                    Test::Deep
                    File::Copy::Recursive
                    IO::HTML
                    Test::More
                    Filter::Util::Call
                    Algorithm::Diff
                    Text::Diff
                    Test::Base
                    Test::CPAN::Meta::YAML
                    Test::YAML::Valid
                    Test::YAML::Meta
                    Test::YAML
                    Data::Printer
                    ExtUtils::Installed
                    Sub::StrictDecl
                    Spreadsheet::WriteExcel
                    Mojolicious::Plugin::RenderFile
                    JSON
                    Carp::Always
                    Mojolicious::Plugin::PDFRenderer
     Redis::Client
                    );

            for(@modules) {
                     eval "use $_";
                     if ($@) {

                            #flush the screen
                            print "\033[2J";
                            print "\033[0;0H";

                            my $msg = "\n\n\n [FATAL] did not found the following prerequisite perl module: $_ \n\n" ;
                            $msg .= "\n # == START copy paste == " ;
                            $msg .= "\n#you must install it otherwise the application will not work" ;
                            $msg .= "\n#the module could be installef by running the following commands:" ;
                            # if the user knows already the difference between the running the cmd
                            # with sudo or he / she probably knows already how-to install perl modules
                            $msg .= "\n# as a start configure the cpan to install dependancies first \n" ;
                            $msg .= "\n" . 'perl -MCPAN -e \'my $c = "CPAN::HandleConfig"; $c->load(doit => 1, autoconfig => 1); $c->edit(prerequisites_policy => "follow"); $c->edit(build_requires_install_policy => "yes"); $c->commit\'' . "\n" ;
                            $msg .= "\n#than install the $_ module by running: \n" ;
                            $msg .= "\nsudo perl -MCPAN -e 'install $_'\n\n\n" ;
                            $msg .= "\n # == STOP  copy paste == \n\n\n" ;
                            $msg .= "\n # == START copy paste == " ;
                            $msg .= "\n# if you seem to be stuck in circular reference kind of loop try even :\n" ;
                            $msg .= "\nsudo perl -MCPAN -e 'CPAN::Shell->force(qw( install $_));'\n" ;
                            $msg .= "\n # == STOP  copy paste == " ;
                            $msg .= "\n# You may end-up now with Ctrl + C \n\n\n" ;

                            return ( 1, "$msg")  if $@;
                     } else {
                              say "[INFO ] == ok == check for prerequisite perl module : $_" if $PrintOkCheck == 1 ;
                     }
            }
            #eof foreach module

            return ( 0 , "all required modules found" ) ;
    }
    #eof sub
    # ??!!
    #perl -MCPAN -e 'install Module::Signature'
    # the following modules have been or might be part of the installable modules
    #PDF::WebKit
    #HTML::TreeBuilder
    #HTML::TreeBuilder::XPath
    #HTML::TableExtract
    #HTML::ElementTable
...