J'ai fait un petit script (check_installed_mod.pl ci-dessous) qui est destiné à la machine cible et qui combine l'usage de Module::CoreList et de ExtUtils::Installed et de version.pm (qui permet de normaliser les numéros de version Perl et les comparer - ce module est également dans core depuis 2008 avec Perl v5.8.9) pour traiter la sortie de ton oneliner.
Donc, on peut faire, sur la machine d'origine :
perl -MExtUtils::Installed -e '$inst = ExtUtils::Installed->new(); print qq{Module $_ [} . $inst->version($_) . qq{]\n} foreach sort $inst->modules();' > installed_mod.txt
puis, on peut utiliser le fichier installed_mod.txt sur la machine cible avec un script comme celui-ci
check_installed_mod.pl :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #!/usr/bin/perl
use strict;
use warnings;
use Module::CoreList;
use ExtUtils::Installed;
use version;
my $inst = ExtUtils::Installed->new();
my @mods = $inst->modules();
print "Cette machine dispose de Perl $^V\n";
while (<>)
{
if (/^Module ([^ ]+) \[([^\]]+)/) {
my ($mod, $ver) = ($1, $2);
if (exists $Module::CoreList::version{$]}{$mod}) {
print "[OK]\t$mod [$Module::CoreList::version{$]}{$mod}] est un core module\n";
print "Warning : sur l'autre machine la version est $ver\n" if ( version->parse($Module::CoreList::version{$]}{$mod}) < version->parse($ver) );
} elsif (/$mod/ ~~ @mods) {
print "[OK]\t$mod [" . $inst->version($mod). "] est déjà installé\n";
print "Warning : sur l'autre machine la version est $ver\n" if ( version->parse($inst->version($mod)) < version->parse($ver) );
} else {
print "[NOK]\t--> $mod [$ver] manquant\n";
}
} else {
print "Erreur de format sur la ligne : $_";
}
} |
que l'on passe comme cela :
cat installed_mod.txt | ./check_installed_mod.pl
Cela donne une sortie du type :
1 2 3 4 5 6 7 8 9 10
| Cette machine dispose de Perl v5.14.2
[OK] Carp [1.20] est un core module
Warning : sur l'autre machine la version est 1.3301
[OK] HTTP::Server::Simple [0.44] est déjà installé
[NOK] --> Markdown::Foswiki [0.04] manquant
[OK] MIME::Lite [3.030] est déjà installé
[OK] Perl [5.14.2] est déjà installé
[OK] Sub::Uplevel [0.24] est déjà installé
[OK] Test::Warn [0.30] est déjà installé
[OK] WWW::Mechanize [1.73] est déjà installé |
Sous Windows, il faut utiliser des guillemets pour ton oneliner et j'imagine qu'il faut utiliser type au lieu de cat et retirer ./ devant le nom du fichier check_installed_mod.pl
A tester :-)
Eks
Partager