2013-07-23 4 views
0

En cours d'exécution du serveur interne Catalyst, situé au scripts/MyApp_server.pm, l'erreur suivante s'affiche. Y a-t-il quelqu'un qui peut m'aider à cet égard? Je n'ai pas modifié l'un des fichiers créés par catalyst.pl. Je viens d'exécuter le fichier catalyst.pl MyApp, puis d'exécuter scripts/MyApp_server.pl -r pour tester si Catalyst fonctionne ou pas. C'est la seule chose que j'ai faite! J'ai réinstallé plusieurs fois Catalyst et ses modules dépendants en utilisant yum et cpan. Mais ça ne marche plus.Erreur lors de la tentative de démarrage d'un serveur Catalyst

Merci!

le message d'erreur:

Can't use an undefined value as a HASH reference at /usr/local/share/perl5/Catalyst.pm line 2681. 
BEGIN failed--compilation aborted at /home/Ali/Lab/WEB/catalyst/MyApp3/script/../lib/MyApp3.pm line 20. 
Compilation failed in require at /usr/local/lib/perl5/Class/MOP/Method/Wrapped.pm line 50 

Les codes autour de la ligne 2681 dans /usr/local/share/perl5/Catalyst.pm sont tels que ci-dessous:

sub setup_home { 

     my ($class, $home) = @_; 

     if (my $env = Catalyst::Utils::env_value($class, 'HOME')) { 
      $home = $env; 
     } 

     $home ||= Catalyst::Utils::home($class); 
     if ($home) { 
      #I remember recently being scolded for assigning config values like this 
      $class->config->{home} ||= $home; # THIS IS LINE 2681 
      $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root'); 
     } 
    } 

Le contenu de la lib/MyApp.pm est comme ci-dessous:

package MyApp; 
use Moose; 
use namespace::autoclean; 

use Catalyst::Runtime 5.80; 

# Set flags and add plugins for the application 
# 
#   -Debug: activates the debug mode for very useful log messages 
# ConfigLoader: will load the configuration from a Config::General file in the 
#     application's home directory 
# Static::Simple: will serve static files from the application's root 
#     directory 

use Catalyst qw/ 
    -Debug 
    ConfigLoader 
    Static::Simple 
/; 

extends 'Catalyst'; 

our $VERSION = '0.01'; 
$VERSION = eval $VERSION; 

# Configure the application. 
# 
# Note that settings in myapp.conf (or other external 
# configuration file that you set up manually) take precedence 
# over this when using ConfigLoader. Thus configuration 
# details given here can function as a default configuration, 
# with an external configuration file acting as an override for 
# local deployment. 

__PACKAGE__->config(
    name => 'MyApp', 
    # Disable deprecated behavior needed by old applications 
    disable_component_resolution_regex_fallback => 1, 
); 

# Start the application 
__PACKAGE__->setup(); 


=head1 NAME 

MyApp - Catalyst based application 

=head1 SYNOPSIS 

    script/myapp_server.pl 

=head1 DESCRIPTION 

[enter your description here] 

=head1 SEE ALSO 

L<MyApp::Controller::Root>, L<Catalyst> 

=head1 AUTHOR 

Ali Basirat 

=head1 LICENSE 

This library is free software. You can redistribute it and/or modify 
it under the same terms as Perl itself. 

=cut 

1; 
+1

Vous aurez probablement besoin de publier les quelques lignes de code autour de la ligne 2681 dans Catalyst.pm afin que quelqu'un de familier avec lui puisse faire une suggestion. Essayez les lignes de 2670 à 2690, et peut-être le nom du sous-marin. –

+0

Les lignes de code autour de la ligne 2681 sont les suivantes: sub setup_home { my ($ class, $ home) = @_; if (mon $ env = Catalyst :: Utils :: env_value ($ class, 'ACCUEIL')) { $ home = $ env; } $ home || = Catalyst :: Utils :: home ($ class); if ($ home) { #Je me souviens d'avoir été récemment réprimandé pour avoir assigné des valeurs de configuration comme ceci ===== CECI EST LIGNE 2681 ==== $ class-> config -> {home} || = $ home ; $ class-> config -> {root} || = Chemin d'accès :: Class :: Dir-> new ($ home) -> sous-répertoire ('root'); } } –

+0

Devinez, nous serons en mesure de trouver les sources de Catalyst en ligne. Cependant, puisque le framework fonctionne habituellement, je parie que MyApp.pm fait quelque chose de méchant. Aussi: il n'y a généralement pas de fichier 'scripts/MyApp_server.pm'. – innaM

Répondre

3

Ce n'est pas une réponse définitive, mais j'espère que cela aidera un peu.

Vous avez soit un $class non défini ou $class->config (plus probable), bien que je ne puisse pas dire. Peut-être que le ConfigLoader n'a pas fonctionné.

La réinstallation de choses aveugles aide rarement et le problème peut être dû à n'importe quel module de la liste des dépendances. S'il y avait un problème spécifique lors de l'installation d'un module, il y aurait eu une erreur et nous aurions pu travailler dessus. Donc, en utilisant yum install cpanm et local::lib - Je ne suis pas sûr que les paquets sont appelés sur Red Hat, mais il devrait être assez facile à trouver. OK - créez maintenant un nouveau répertoire dans un endroit approprié.

mkdir /home/Devt/catalyst_test 
cd /home/Devt/catalyst_test 
eval $(perl -Mlocal::lib=./perllib) 
echo $PERL5LIB 
# You should see your current directory mentioned in PERL5LIB 
cpanm Catalyst 
cpanm Catalyst::Helper 
catalyst.pl MyApp 
cd MyApp/ 
perl Makefile.PL 
./script/myapp_server.pl 
# Opens up a server on port 3000 

Qu'est-locale :: lib fait est mise en place des chemins pour tout installer localement (dans perllib) - vous pouvez voir les variables d'environnement, il met en place en exécutant sans le eval.

perl -Mlocal::lib=./perllib 

Voir les documents pour l'ajouter à un script de connexion bash. Je redirige simplement la sortie vers un fichier et je l'utilise lorsque je travaille sur un projet (j'utilise un perllib par projet). Ensuite, cpanm est assez intelligent pour utiliser ce répertoire local pour installer tous les bits dont vous avez besoin.

Si cela ne fonctionne pas, le problème est probablement dû à quelque chose que vous avez manuellement installé dans/usr/local /. Effectuez une sauvegarde des divers répertoires lib associés à perl dans/usr/local/puis supprimez-les. Lancez à nouveau cpanm (en vérifiant d'abord les chemins locaux: lib) et voyez si les versions téléchargées fonctionnent.

Ce qui précède devrait fonctionner - c'est exactement ce que j'ai fait il y a 10 minutes.

L'idée générale est de créer une installation séparée de toutes vos bibliothèques Perl pour ce projet - de cette façon, si vous mettez à niveau quelque chose, cela n'affecte que l'installation actuelle.

+0

Ça a bien marché. Je vous remercie! –

Questions connexes