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 上这些软件包的名称,但应该很容易找到。

好的 - 现在在合适的地方创建一个新目录。

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 登录脚本的信息,请参阅文档。我只是将输出重定向到一个文件并在我处理项目时获取它(我每个项目使用一个 perllib)。

然后,cpanm 足够聪明,可以使用这个本地目录来安装您需要的所有位。

如果这不起作用,则问题可能是由于您手动安装在 /usr/local/ 中的某些内容。在 /usr/local/ 中备份各种与 perl 相关的 lib 目录,然后将它们清除。再次运行 cpanm (首先检查 local::lib 路径是否已设置)并查看它下载的版本是否有效。

以上应该有效 - 这正是我 10 分钟前所做的。

这样做的整个想法是为这个项目创建一个单独的所有 perl 库安装 - 这样,如果你升级任何东西,它只会影响当前的安装。

于 2013-07-23T13:08:25.333 回答