4.3. Win32 安装注意事项

本节介绍在 Microsoft Windows 上的安装。Bugzilla 已经被制作用于 Win32 平台,但是 Bugzilla 团队希望强调,在 Intel 架构机器上安装 Bugzilla 最简单的方法是安装某种 GNU/Linux 变体,然后按照本指南中的 UNIX 安装说明进行操作。如果您对运行此系统的平台选择有任何影响力,请选择 GNU/Linux 而不是 Microsoft Windows。

Warning

在发出警告之后,这是关于 2.16 和 Windows 的情况。它根本无法开箱即用。您几乎肯定最好从 CVS 获取 2.17 版本(在与 Bugzilla 团队协商以确保您在稳定的一天拉取之后),因为我们将进行大量工作,以使 Win32 体验比现在更愉快。

如果您仍然想尝试,为了有任何希望使其工作,您需要应用来自 bug 124174邮件补丁。之后,您需要阅读下面的(过时的)安装说明,一些(可能好得多)由 Toms Baugis 和 Jean-Sebastien Guay 好心提供的 更新的说明,并查看 Bugzilla 2.16 Win32 更新页面。如果我们有时间,我们将为 2.16 编写一些更好的安装说明并放在那里。但是不保证。

4.3.1. Win32 安装:步骤详解

Note

在执行 Win32 安装时,您应该熟悉并参考 Bugzilla 安装 部分的其余部分。

在 Microsoft Windows 上使 Bugzilla 工作并非易事。在过去的几个版本中,对 Win32 的支持已大大提高,但是,如果您选择继续,您应该是一位非常熟练的 Windows 系统管理员,具有强大的故障排除能力、高度的痛苦容忍度和一定的 perl 技能。NT 上的 Bugzilla 需要破解源代码并实现一些高级实用程序。以下是在 Win32 上推荐的安装步骤;附录 A 中提供了其他建议。

  1. 为 Windows 安装 Apache Web Server,并将 Bugzilla 文件复制到 Apache 可以服务它们的位置。请遵循 Bugzilla 安装 中引用的关于您的 Apache 配置的所有说明,特别是关于 "AddHandler" 参数和 "ExecCGI" 的说明。

    Note

    您也可以为此目的使用 Internet Information Server 或 Personal Web Server。但是,设置完全不同。如果 ActivePerl 似乎无法正确处理您的文件关联(对于 .cgi 和 .pl 文件),请查阅 附录 A

    如果您要使用 IIS,如果在 Windows NT 上,您必须至少更新到 Service Pack 4。Windows 2000 附带了足够版本的 IIS。

  2. 为 Windows 安装 ActivePerl。查看 http://aspn.activestate.com/ASPN/Downloads/ActivePerl 以获取当前的编译二进制文件。

    另请查看以下链接以充分了解 Win32 上 ActivePerl 的状态:Perl 移植Perl on Win32 FAQ

  3. 使用 perl\bin 目录中的 ppm 安装以下包:DBI、DBD-Mysql、TimeDate、Chart、Date-Calc、Date-Manip、GD、AppConfig 和 Template。您可能需要先使用 Winzip 或其他 unzip 程序从 .zip 格式解压缩它们。大多数这些额外的 ppm 模块可以从 ActiveState 下载,但 AppConfig 和 Template 应该使用 Template Toolkit 网站上的说明 从 OpenInteract 获取。

    ppm 的语法是 C:> ppm <模块名>

    例 4-1. 在 Microsoft Windows 上安装 ActivePerl ppd 模块

    C:> ppmDBD-Mysql

    注意大小写!

    ActiveState 的 5.6Plus 目录也包含 AppConfig ppm,因此当尝试安装 OpenInteract 版本时,您可能会看到以下错误

    Error installing package 'AppConfig': Read a PPD for 'AppConfig', but it is not intended for this build of Perl (MSWin32-x86-multi-thread)

    如果是这样,请直接从 OpenInteract 下载 tarballppd,然后在您下载这些文件的同一目录中运行 ppm,并通过在 install 命令中显式引用 ppd 文件来安装包,例如。

    例 4-2. 在 Microsoft Windows 上手动安装 OpenInteract ppd 模块

    installC:\AppConfig.ppd

  4. 安装 MySQL for NT。

    Note

    您可以从 MySQL.com 下载 Windows NT 版 MySQL。有些人发现使用下载中包含的 WinMySqlAdmin 实用程序来设置数据库很有帮助。

  5. 设置 MySQL

    1. C:> C:\mysql\bin\mysql -u root mysql

    2. mysql> DELETE FROM user WHERE Host='localhost' AND User='';

    3. mysql> UPDATE user SET Password=PASSWORD ('new_password') WHERE user='root';

      上面的 "new_password" 指示您希望为 "root" 用户使用的任何密码。

    4. mysql> GRANT SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, CREATE, DROP, REFERENCES ON bugs.* to bugs@localhost IDENTIFIED BY 'bugs_password';

      上面的 "bugs_password" 指示您希望为 "bugs" 用户使用的任何密码。

    5. mysql> FLUSH PRIVILEGES;

    6. mysql> create database bugs;

    7. mysql> exit;

    8. C:> C:\mysql\bin\mysqladmin -u root -p reload

  6. 编辑checksetup.pl在您的 Bugzilla 目录中。更改此行

    my $webservergid =
                getgrnam($my_webservergroup);

    my $webservergid =
              $my_webservergroup;
    或您希望拥有文件的组的名称
    my $webservergid =
              'Administrators'

  7. 运行checksetup.pl从 Bugzilla 目录。

  8. 编辑localconfig以满足您的需求。设置$db_pass为来自 步骤 5.d"bugs_password",以及$webservergroup"8"

    Note

    不确定上面的 "8" 是否正确。$webservergroup如果错误,请发送更正。

  9. 编辑defparams.pl以满足您的需求。特别是,设置DefParam("maintainer")DefParam("urlbase") 以匹配您的安装。

    Note

    这是我不确定的另一个步骤,因为本文档的维护者不在 NT 上维护 Bugzilla。如果您可以确认或否认此步骤是必需的,请告诉我。

  10. Note

    Sendmail 有几种替代方案可以在 Win32 上工作。这里提到的只是一个建议,而不是要求。其他一些可以工作的邮件包包括 BLATWindmailMercury Sendmail 和 CPAN Net::SMTP Perl 模块(在 .ppm 中可用)。每个选项都需要对 Bugzilla 的 Perl 脚本进行一些修改才能使其工作。这里的选项只是需要最少的修改。

    1. 下载 NTsendmail,可从 www.ntsendmail.com 获取。您必须有一个“真正的”邮件服务器,允许您在 $ENV{"NTsendmail"} 中(您可能应该将其放在 globals.pl 中)中继它

    2. 将 ntsendmail.pm 放入您的 .\perl\lib 目录。

    3. 添加到 globals.pl

      # these settings configure the NTsendmail
                    process use NTsendmail;
                    $ENV{"NTsendmail"}="your.smtpserver.box";
                    $ENV{"NTsendmail_debug"}=1;
                    $ENV{"NTsendmail_max_tries"}=5;

      Note

      一些人提到还要编辑$db_passglobals.pl为您的 "bugs_password"。虽然这可能会让您绕过一些验证数据库的问题,但由于 globals.pl 通常不受.htaccess的限制,您的数据库密码会暴露给任何使用您的 Web 服务器的人。

    4. 在您的 Bugzilla 目录中查找并注释掉所有 " open(SENDMAIL " 的出现。然后将它们替换为
      # new sendmail functionality my $mail=new
                    NTsendmail; my $from="bugzilla\@your.machine.name.tld"; my
                    $to=$login; my $subject=$urlbase;
                    $mail->send($from,$to,$subject,$msg);

      Note

      有些人发现使用商业产品 Windmail 取得了成功。您可以尝试将您的 sendmail 调用替换为
      open SENDMAIL,
                      "|\"C:/General/Web/tools/Windmail 4.0 Beta/windmail\" -t >
                      mail.log";
      或类似的东西。

  11. 将所有文件中从processmailprocessmail.plprocessmail .

    Note

    许多人认为这可能是我们想要为主线 Bugzilla 做出的更改。这对 UNIX 用户来说是无痛的,并且会让 Win32 用户更快乐。

    Note

    有些人建议使用 Net::SMTP Perl 模块代替 NTsendmail 或此处列出的其他选项。您可以更改 processmail.pl 以使其工作。
    
    my $smtp = Net::SMTP->new('<Name of your SMTP server>');   #connect to SMTP server
    $smtp->mail('<your name>@<you smpt server>');# use the sender's adress here
    $smtp->to($tolist); # recipient's address
    $smtp->data();  # Start the mail
    $smtp->datasend($msg);
    $smtp->dataend();   # Finish sending the mail
    $smtp->quit;    # Close the SMTP connection
    $logstr = "$logstr; mail sent to $tolist $cclist";
    }
    
    
                
    这是一个用于 Net::SMTP 的测试邮件程序
    
    use Net::SMTP;
     my $smtp = Net::SMTP->new('<Name of your SMTP server', Timeout => 30, Debug
    => 1, ); # connect to SMTP server
                     $smtp->auth;
                    $smtp->mail('you@yourcompany.com');# use the sender's adress
    here
                    $smtp->to('someotherAddress@someotherdomain.com'); #
    recipient's address
                    $smtp->data();  # Start the mail
                    $smtp->datasend('test');
                    $smtp->dataend();   # Finish sending the mail
                    $smtp->quit;    # Close the SMTP connection
    exit;
    
    
                

  12. Note

    如果您使用的是 IIS 或另一个仅根据文件扩展名 (.pl) 而不是 "shebang" 行 (#!/usr/bonsaitools/bin/perl) 决定解释器的 Web 服务器,则此步骤是可选的

    修改所有文件第一行 (#! ) 上 perl 的路径以指向您的 Perl 安装,并在所有使用 perl 脚本作为参数的 Perl 系统调用的开头添加 "perl"。这可能需要一段时间。有一个 "setperl.csh" 实用程序可以加速此过程的一部分,可在 Bugzilla 指南的 Bugzilla 的实用补丁和实用程序 部分中找到。但是,它需要设置 Cygwin GNU 兼容环境才能在 Win32 上工作。有关获取 Cygwin 的详细信息,请参阅 http://www.cygwin.com/

  13. 修改 Bugzilla 目录中所有 perl 脚本中所有 system() 调用的调用。您应该为每个 system() 调用指定 perl 的完整路径。例如,更改 processmail 中的这一行
     
    system ("./processmail",@ARGLIST); 
            </programlisting> to
            <programlisting> 
    system ("C:\\perl\\bin\\perl", "processmail", @ARGLIST);
    
              

  14. 添加binmode()调用,以便附件可以工作 (bug 62000)。

    由于基于 Microsoft Windows 的系统处理二进制文件的方式与基于 Unix 的系统不同,因此您需要将以下行添加到createattachment.cgishowattachment.cgirequire 'CGI.pl';行之前。

    binmode(STDIN);
    binmode(STDOUT);
    
                

    Note

    根据 bug 62000,perl 文档说您应该始终使用binmode()在处理二进制文件时,但绝不应该在处理文本文件时使用。这似乎表明,与其随意放置binmode()在附件文件的开头,应该有逻辑来确定是否binmode()是必需的。

Tip

如果您使用的是 IIS 或 Personal Web Server,则必须在 属性 -> 主目录(选项卡) -> 应用程序设置(部分) -> 配置(按钮)中添加 cgi 关系,例如

.cgi to: <perl install directory>\perl.exe %s
        %s .pl to: <perl install directory>\perl.exe %s %s
        GET,HEAD,POST
当然,将 Perl 的路径更改为与您的安装匹配。

4.3.2. 其他 Windows 技巧

Tip

来自 Andrew Pearson:

您可以使 Bugzilla 与 Windows 98 及更高版本的 Personal Web Server 以及 IIS 4.0 一起工作。Microsoft 在 http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP 提供了相关信息

基本上,您需要在注册表中以下位置添加两个字符串键

            HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap

键应称为“.pl”和“.cgi”,并且都应具有类似于以下内容的值:c:/perl/bin/perl.exe "%s" "%s"

KB 文章仅讨论 .pl,但它更详细地介绍了并提供了一个 perl 测试脚本。

Tip

如果尝试运行 Bugzilla 2.12 或更早版本,您将需要从 Perl 源代码中删除 encrypt() 调用。对于 Bugzilla 2.13 及更高版本(包括当前版本 Bugzilla 2.16.3),这不是必需的

例 4-3. 为 Windows NT Bugzilla 2.12 或更早版本移除 encrypt()

替换为
SendSQL("SELECT encrypt(" . SqlQuote($enteredpwd) .
          ", " . SQLQuote(substr($realcryptpwd, 0, 2)) . ")"); my
          $enteredcryptpwd = FetchOneColumn();
用这个
my $enteredcryptpwd = $enteredpwd
在 cgi.pl 中。