0

にある Catalyst 内部サーバーを実行するとscripts/MyApp_server.pm、次のエラーが表示されます。この点で私を助けることができる人はいますか?私は、catalyst.pl によって作成されたファイルを変更していません。Catalyst.pl MyApp を実行してから、scripts/MyApp_server.pl -r を実行して、Catalyst が機能するかどうかをテストしました。これは私がやったことだけです!yum と cpan のいずれかを使用して、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 の 2681 行付近のコードは次のとおりです。

    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;
4

1 に答える 1

3

これは決定的な答えではありませんが、うまくいけば少しは役に立ちます。

私にはわかりませんが、未定義$classまたは$class->config(可能性が高い)のいずれかがあります。ConfigLoader が機能していない可能性があります。

やみくもに再インストールしても解決することはめったになく、問題は依存関係リスト内のモジュールが原因である可能性があります。モジュールのインストールに特定の問題があった場合、エラーが発生していたはずであり、その問題に取り組むことができたはずです。

そのため、 yum install cpanmlocal::libを使用します。Red Hat でパッケージが何と呼ばれているかはわかりませんが、簡単に見つけられるはずです。

OK - 適切な場所に新しいディレクトリを作成します。

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

local::lib が行っているのは、すべてをローカルに (perllib で) インストールするためのパスをセットアップすることです。eval なしで実行すると、セットアップされた環境変数を確認できます。

perl -Mlocal::lib=./perllib

bash ログイン スクリプトに追加する方法については、ドキュメントを参照してください。プロジェクトで作業しているときに、出力をファイルにリダイレクトしてソース化するだけです (プロジェクトごとに 1 つの perllib を使用します)。

次に、cpanm はこのローカル ディレクトリを使用して必要なすべてのビットをインストールするのに十分スマートです。

これが機能しない場合、問題は /usr/local/ に手動でインストールしたものが原因である可能性があります。/usr/local/ にあるさまざまな perl 関連の lib ディレクトリのバックアップを取り、それらを消去します。cpanm を再度実行し (最初に local::lib パスがセットアップされていることを確認します)、ダウンロードしたバージョンが機能するかどうかを確認します。

上記は機能するはずです-それはまさに10分前に行ったことです。

これの全体的な考え方は、このプロジェクトのすべての perl ライブラリの個別のインストールを作成することです。そのようにすると、何かをアップグレードしても、現在のインストールにのみ影響します。

于 2013-07-23T13:08:25.333 に答える