2013-07-23 2 views
0

scripts/MyApp_server.pm에있는 Catalyst 내부 서버를 실행하면 다음 오류가 발생합니다. 이 점에서 저를 도울 수있는 사람이 있습니까? catalyst.pl로 만든 파일을 변경하지 않았습니다. Catalyst를 실행했는지 여부를 테스트하기 위해 MyApp를 실행 한 다음 스크립트/MyApp_server.pl -r을 실행합니다. 이게 내가 한 유일한 일이야! yum과 cpan을 사용하여 Catalyst 및 그 종속 모듈을 여러 번 다시 설치했습니다. 하지만 다시는 작동하지 않습니다.Catalyst 서버를 시작할 때 오류가 발생했습니다.

감사합니다.

오류 메시지 :

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 

/usr/local/share/perl5/Catalyst.pm 라인 2,681 주변의 코드는 다음과 같다

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'); 
     } 
    } 

lib/MyApp.pm의 내용은 다음과 같습니다.

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

촉매제에 2681 줄 주변에 몇 줄의 코드를 게시해야 할 것입니다. 익숙한 사람이 제안을 할 수 있습니다. 2670에서 2690 사이의 행과 서브의 이름을 시도하십시오. –

+0

2681 행의 코드 행은 다음과 같습니다. sub setup_home { my ($ class, $ home) = @_; if (my $ env = Catalyst :: Utils :: env_value ($ class, 'HOME')) { $ home = $ env; } $ home || = 촉매제 :: Utils :: home ($ class); if ($ home) { #이 설정 값을 할당하기 위해 최근에 꾸짖음을 기억합니다. =====이 줄은 2681 ==== $ class-> config -> {home} || = $ home ; $ class-> config -> {root} || = 경로 :: 클래스 :: 디렉토리 -> 새 ($ 홈) -> 하위 디렉토리 ('루트'); } } –

+0

Google은 Catalyst 소스를 온라인에서 찾을 수 있습니다. 그러나 프레임 워크가 일반적으로 작동하기 때문에 MyApp.pm이 더러운 것을하고 있다고 확신합니다. 또한 일반적으로'scripts/MyApp_server.pm' 파일이 없습니다. – innaM

답변

3

이것은 명확한 대답은 아니지만 약간 도움이 될 것입니다.

내가 말할 수는 없지만 정의되지 않은 $class 또는 $class->config (가능성이 높음)이 있습니다. 아마도 ConfigLoader가 작동하지 않았을 수 있습니다.

맹목적인 방법으로 다시 설치하는 것은 거의 도움이되지 않으며 문제는 종속성 목록의 모듈 때문일 수 있습니다. 특정 모듈을 설치하는 데 문제가있는 경우 오류가 발생했을 수 있으며이를 해결할 수있었습니다.

yum을 사용하여 cpanmlocal::lib을 설치하십시오. - 패키지가 Red Hat에서 어떻게 호출되는지 잘 모르겠지만 쉽게 알아낼 수 있습니다.

OK - 이제 어딘가에 새로운 디렉토리를 만듭니다. 당신이 평가없이 실행하여이 설정 환경 변수를 볼 수 있습니다 - 지역 무엇 :: lib 디렉토리 (PERLLIB에) 로컬로 모든 것을 설치 경로를 설정하는 것입니다하고있다

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 

.

perl -Mlocal::lib=./perllib 

bash 로그인 스크립트에 문서를 추가하는 방법은 문서를 참조하십시오. 출력물을 파일로 리디렉션하고 프로젝트에서 작업 할 때 소스로 사용합니다 (프로젝트 당 하나의 perllib 사용).

그런 다음 cpanm은이 로컬 디렉토리를 사용하여 필요한 모든 비트를 설치할 정도로 똑똑합니다.

이 방법으로 문제가 해결되지 않으면 문제는 아마도 수동으로/usr/local /에 설치했기 때문일 수 있습니다. /usr/local /에있는 다양한 perl 관련 lib 디렉토리의 백업을 가져 와서 정리하십시오. cpanm을 다시 실행하십시오 (local :: lib 경로를 먼저 확인하십시오).

위의 내용이 작동해야합니다. 정확히 10 분 전에 한 일입니다.

이 프로젝트의 모든 perl 라이브러리를 별도로 설치하는 것이 좋습니다. 업그레이드하는 경우 현재 설치에만 영향을 미칩니다.

+0

잘 작동했습니다. 고맙습니다! –