Les modules Perl question

  • may
  • Proficient
  • Proficient
  • Avatar de l’utilisateur
  • Inscription: Déc 25, 2004
  • Messages: 328
  • Loc: Holland [NL]
  • Status: Offline

Message Décembre 2nd, 2009, 3:16 am

Salut à tous,

Je ne sais pas comment expliquer cela, mais im écriture d'un daemon perl dans lequel je utiliser le Config:: Inifiles module. Malheureusement, ce module n'est pas livré par défaut et qu'il faudrait peut être téléchargé et compilé lors disparus. En ce moment, il s'agit d'un "manuel" tâche à l'aide> »CPAN-i Config:: Inifiles» et travaille uptil il n'ya pas de CPAN config disponible ou l'absence de toute connexion Internet.

Non, je me demandais, est-il une approche programmatiques propres où le script vérifie la disponibilité des modules requis et si manquants seront les compiler à partir de la source livré avec le script?

-Rgrds, Chris

(Comment sa fait maintenant)
Code: [ Select ]
#!/usr/bin/perl

my $cfgFile = './etc/amis.ini';
my $logFile = './etc/amis.log';
my $start;
my $stop;
my $restart;
my $status;
my $script;
my $state;
my $return;
my @structure;
my $sec;
my $min;
my $hour;
my $mday;
my $mon;
my $year;
my $line;
my $cif;
my $E_exit;
my $E_msg;
my $E_type;
my $getopt;
my $failure;


use strict;
if( ModCheck("Getopt::Long") and ModCheck("Config::IniFiles") ){
    use warnings;
    use Getopt::Long;
    #use Config::IniFiles;
    use Config::IniFiles;
}else{
    warn "Required modules not available, trying to install them on the fly\n
       if this fails try manually using 'cpan -i Config::IniFiles Getopt::Long'\n";
    $getopt = `cpan -i Getopt::Long`;
    $cif  = `cpan -i Config::IniFiles`;
    exit 1;
}

#...
#...
#...

sub ModCheck{
    my $module = $_[0];
    eval "use $module";
    if($@){
        return 0;
    }else{
        return 1;
    }
}
  1. #!/usr/bin/perl
  2. my $cfgFile = './etc/amis.ini';
  3. my $logFile = './etc/amis.log';
  4. my $start;
  5. my $stop;
  6. my $restart;
  7. my $status;
  8. my $script;
  9. my $state;
  10. my $return;
  11. my @structure;
  12. my $sec;
  13. my $min;
  14. my $hour;
  15. my $mday;
  16. my $mon;
  17. my $year;
  18. my $line;
  19. my $cif;
  20. my $E_exit;
  21. my $E_msg;
  22. my $E_type;
  23. my $getopt;
  24. my $failure;
  25. use strict;
  26. if( ModCheck("Getopt::Long") and ModCheck("Config::IniFiles") ){
  27.     use warnings;
  28.     use Getopt::Long;
  29.     #use Config::IniFiles;
  30.     use Config::IniFiles;
  31. }else{
  32.     warn "Required modules not available, trying to install them on the fly\n
  33.        if this fails try manually using 'cpan -i Config::IniFiles Getopt::Long'\n";
  34.     $getopt = `cpan -i Getopt::Long`;
  35.     $cif  = `cpan -i Config::IniFiles`;
  36.     exit 1;
  37. }
  38. #...
  39. #...
  40. #...
  41. sub ModCheck{
  42.     my $module = $_[0];
  43.     eval "use $module";
  44.     if($@){
  45.         return 0;
  46.     }else{
  47.         return 1;
  48.     }
  49. }
1 + 1 = 10 + 1 = 11 + 11 = 110
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Décembre 2nd, 2009, 3:16 am

  • may
  • Proficient
  • Proficient
  • Avatar de l’utilisateur
  • Inscription: Déc 25, 2004
  • Messages: 328
  • Loc: Holland [NL]
  • Status: Offline

Message Décembre 2nd, 2009, 6:29 am

J'ai trouvé une solution.

Vous pouvez ajouter vos propres modules en faisant quelque chose comme ça. Vous devez créer une arborescence de dossiers dans votre dossier d'application qui ressemble à ceci.

/ Application (conteneur app principal)
/ Application / Lib / modulename /

Au coeur de ce modulename vous copiez le fichier. Pm que vous essayez de charger. ie

/ Application / Lib / modulename / Module.pm

Dans mon cas, en utilisant les Config:: IniFiles il ressemblera à quelque chose comme ça.

/ Application / Lib / Config / IniFiles. pm

Ensuite, vous devez faire Perl ajouter cet endroit sur le @ Global inc. Le i méthode utilisée et bien d'être le plus propre est

Code: [ Select ]

use lib "./lib";
  1. use lib "./lib";


Après cette Perl va charger les modules dans votre propre arbre Lib quand ils sont introuvables.

Afin de surmonter les erreurs de compilation qui se produisent pendant BEGIN () vous pouvez créer un fichier. Supplémentaire pl dans lequel vous charger les modules. Ainsi, la structure pourrait ressembler à ceci.

L'application principale.
Code: [ Select ]
if(ModCheck("Getopt::Long") and ModCheck("Config::IniFiles") ){
    require "./lib/modules.pl";
}else{
    print "Some required modules are not present!";
}

## ModCheck subroutine ##
sub ModCheck{
    my $module = $_[0];
    eval "use $module";
    if($@){
        return 0;
    }else{
        return 1;
    }
}
  1. if(ModCheck("Getopt::Long") and ModCheck("Config::IniFiles") ){
  2.     require "./lib/modules.pl";
  3. }else{
  4.     print "Some required modules are not present!";
  5. }
  6. ## ModCheck subroutine ##
  7. sub ModCheck{
  8.     my $module = $_[0];
  9.     eval "use $module";
  10.     if($@){
  11.         return 0;
  12.     }else{
  13.         return 1;
  14.     }
  15. }


modules. pl
Code: [ Select ]
use Getopt::Long;
use Config::IniFiles;
return 1;
  1. use Getopt::Long;
  2. use Config::IniFiles;
  3. return 1;


Eh bien, je espérons que cela aidera quelqu'un d'autre :)

-Chris Rgrds
1 + 1 = 10 + 1 = 11 + 11 = 110

Afficher de l'information

  • Total des messages de ce sujet: 2 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 181 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC