免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4215 | 回复: 10
打印 上一主题 下一主题

TWiki执行configure报错:Can't locate Error.pm,紧急求助! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-12 22:47 |只看该作者 |倒序浏览
在本机上安装TWiki,配置好以后执行configure脚本开始系统配置,发现报下列错误:
Software error:

Can't locate Error.pm in @INC (@INC contains: C:\TWiki\lib . C:/Perl/site/lib C:/Perl/lib) at C:\TWiki\lib/TWiki/Configure/LANGUAGES.pm line 28, <F> line 1354.
BEGIN failed--compilation aborted at C:\TWiki\lib/TWiki/Configure/LANGUAGES.pm line 28, <F> line 1354.
Compilation failed in require at (eval 92) line 2, <F> line 1354.
BEGIN failed--compilation aborted at (eval 92) line 2, <F> line 1354.
at C:\TWiki\lib/TWiki/Configure/Pluggable.pm line 42, <F> line 1354.
        TWiki::Configure:luggable::load('LANGUAGES') called at C:\TWiki\lib/TWiki/Configure/TWikiCfg.pm line 236
        TWiki::Configure::TWikiCfg::_parse('C:\TWiki\lib/TWiki.spec', 'TWiki::Configure::Root=HASH(0xda0114)', 1) called at C:\TWiki\lib/TWiki/Configure/TWikiCfg.pm line 97
        TWiki::Configure::TWikiCfg::load('TWiki::Configure::Root=HASH(0xda0114)', 1) called at C:/TWiki/bin/configure line 638
        TWiki::_actionPromptPassword() called at C:/TWiki/bin/configure line 478

经过检查,我确定在C:\TWiki\lib\CPAN\lib下存在Error.pm。

不太了解PERL。这是怎么回事儿呢?特来请高手大侠出手相助。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2013-05-13 08:58 |只看该作者
Perl 是从 @INC 中依次查找需要的模块的,你那个目录明显不在其中(第一行中有显示@INC 的内容 )。可以在脚本的最开始写个 use lib 'c:\Twiki\lib\CPAN\lib';或者设环境变量 PERL5LIB 包含这个目录

论坛徽章:
0
3 [报告]
发表于 2013-05-13 09:57 |只看该作者
zhlong8 发表于 2013-05-13 08:58
Perl 是从 @INC 中依次查找需要的模块的,你那个目录明显不在其中(第一行中有显示@INC 的内容 )。可以在脚本 ...

非常感谢版主施以援手。按照这个思路,我对twiki 5.1.1/bin/configure脚本看了一下,发现下列代码没有生效:
@INC=('.', grep{ $_  ne  '.' }  @INC);
eval 'require "setlib.cfg"';
在执行完eval后检查@INC的值,没有发生变化。
我单独执行setlib.cfg,发现@INC的值是正确的。
还请版主不吝再教我,非常感谢。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
4 [报告]
发表于 2013-05-13 11:57 |只看该作者
回复 3# buxoman


    eval 是运行期执行的,而 use 是在编译期,查找模块的时候 eval 的代码还没执行吧, 那个 eval 是在个 BEGIN 代码块中执行的吗?

论坛徽章:
0
5 [报告]
发表于 2013-05-13 12:39 |只看该作者
我用加print的方法,在命令行窗口下直接执行configure脚本。我觉得可能执行流程根本就没有走到setlib.cfg脚本中去。

我看了下代码,前后都没有BEGIN这种语法单位。

论坛徽章:
0
6 [报告]
发表于 2013-05-13 12:42 |只看该作者
buxoman 发表于 2013-05-13 12:39
我用加print的方法,在命令行窗口下直接执行configure脚本。我觉得可能执行流程根本就没有走到setlib.cfg脚 ...


我把相关代码贴一下:

###########################################################
# Establish the path to the TWiki library

# Set the working dir to the bin dir
no warnings;
$FindBin::Bin =~ /^(.*)$/;
use warnings;
chdir($1);
my @root = File::Spec->splitdir($1);
pop(@root);
my @script     = File::Spec->splitdir($0);
my $scriptName = pop(@script);
$scriptName =~ s/.*[\/\\]//;    # Fix for Item3511, on Win XP

# Try to load the LocalLib.cfg optional overload

# Paths from LocalLib.cfg (preferred)
use vars qw( $twikiLibPath @localPerlLibPath );

@INC = ('.', grep { $_ ne '.' } @INC); # setlib.cfg is in current directory
foreach my $n (@INC) {print "$n ";} print "\n";
eval 'require "setlib.cfg"';
#foreach my $n (@INC) {print "$n ";}
#print "\n";

论坛徽章:
0
7 [报告]
发表于 2013-05-13 15:35 |只看该作者
我把eval去掉,require语句执行了。
# Paths from LocalLib.cfg (preferred)
use vars qw( $twikiLibPath @localPerlLibPath );

@INC = ('.', grep { $_ ne '.' } @INC); # setlib.cfg is in current directory
require "setlib.cfg";    # 这里不用eval

再执行configure脚本,爆出下列错误:
Software error:
defined(@array) is deprecated at setlib.cfg line 53.

Software error:
[Mon May 13 15:29:16 2013] configure: defined(@array) is deprecated at setlib.cfg line 53.
Compilation failed in require at D:/TWiki511/bin/configure line 211.

下面是setlib.cfg的代码,很短,全部贴出来

use vars qw( $twikiLibPath @localPerlLibPath );

eval 'require "LocalLib.cfg"';

unless (( defined ($twikiLibPath) ) and (-e $twikiLibPath)) {
        use Cwd qw( abs_path );
        ( $twikiLibPath ) = ($twikiLibPath = Cwd::abs_path( "../lib" )) =~ /(.*)/;
}
if ($twikiLibPath eq "") {
    $twikiLibPath = "../lib";
    warn "using relative path for libs - some plugins may break";
}

#    Path to local Perl modules
my $defaultingCPANBASE = !defined($CPANBASE);
$CPANBASE = "$twikiLibPath/CPAN/lib" unless $CPANBASE;
if ( -e $CPANBASE ) {
        require Config;
        my $VER = $Config::Config{version};
        my $SITEARCH = $Config::Config{archname};
        push @localPerlLibPath, ( "$CPANBASE/arch", "$CPANBASE/$VER/$SITEARCH", "$CPANBASE/$VER", "$CPANBASE" );
}

# Prepend to @INC, the Perl search path for modules
unshift @INC, $twikiLibPath;
if ($defaultingCPANBASE) {
        push @INC, @localPerlLibPath if defined @localPerlLibPath;   # 错误提示53行即本行
} else {
        unshift @INC, @localPerlLibPath if defined @localPerlLibPath;
}

从错误消息看,似乎是对全局变量的使用有误。

论坛徽章:
0
8 [报告]
发表于 2013-05-13 15:44 |只看该作者
请问,在执行CGI-BIN脚本configure的时候,变量@INC是环境变量吗?还是要自己定义呢?

论坛徽章:
0
9 [报告]
发表于 2013-05-13 15:57 |只看该作者
判断一个数组型变量是否存在的语法是怎样的呢?按照错误提示,这种 defined(@array)语法已经被抛弃了。

论坛徽章:
0
10 [报告]
发表于 2013-05-13 16:16 |只看该作者
把下列两个defined判断修改一下,就可以正常执行twiki的cgi脚本configure了。

# Prepend to @INC, the Perl search path for modules
unshift @INC, $twikiLibPath;
if ($defaultingCPANBASE) {
        push @INC, @localPerlLibPath if defined $localPerlLibPath[0];
} else {
        unshift @INC, @localPerlLibPath if defined $localPerlLibPath[0];
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP