Strawberry Perl 和 PAR - 在其他 Windows 计算机上运行时错误:如果安装了 LWP::Protocol::https 模块,LWP 将支持 https URL

2024-01-05

我有两台 Windows 10 机器,其中一台安装了 Strawberry Perl(版本 5.30.1,如果有的话)。我的脚本使用 REST::Client,在这台机器上,脚本运行完美。

我正在使用 PAR 来制作 .exe

我可以运行 .pl 脚本或 .exe 可执行文件;在这台机器上它运行完美。我正在使用--execute当我运行 pp.bat 时的选项,并包括--xargs=选项,以便脚本可以执行并成功运行。

然后我将 .exe 复制到另一台未安装 Perl 的计算机上。我使用相同的命令行选项启动 .exe,它编译良好并开始运行。它做了一些工作,然后进行第一个 REST GET。在这台没有 Strawberry Perl 的计算机上,我收到一条消息“该服务报告永久错误:如果安装了 LWP::Protocol::https 模块,LWP 将支持 https URL。”

然后,当然,我会收到 500 系列错误,因为 REST Web 服务对 GET 缺少 https:// 感到不满。

还有另一个错误:

该服务报告永久错误:无法通过包“LWP::Protocol::https::Socket”在 C:\foo\bar\AppData\Local\Temp\baz\qux\inc\ 找到对象方法“new” lib/LWP/Protocol/http.pm 第 34 行。

在我用来调用 pp.bat 的 .bat 文件中,我确实有--module="LWP::Protocol::https"- 尽管它存在或不存在似乎并没有什么区别。

我看到一些有关 LWP::UserAgent 的文档并指定protocols_allowed => ['https']但我不确定应该如何在 REST::Client 中应用它。我尝试过将其放入(并将其排除),结果是相同的。我的那部分代码如下所示:

    my $client = REST::Client->new();

    $client->addHeader( 'charset',       'UTF-8' );
    $client->addHeader( 'Accept',        'application/xml' );
    $client->addHeader( 'Authorization', $login_string );
    $client->addHeader( 'Content-Type',  'application/xml' );
    $client->getUseragent()->ssl_opts( verify_hostname => 0 );
    $client->getUseragent()->ssl_opts( SSL_verify_mode => 0 );
    $client->getUseragent( protocols_allowed => ['https'] );
    $client->setTimeout( 10 );

    $client->setHost( $host );

    $client->GET( $url );

    my $rest_client_reponse_code = $client->responseCode();

有人能看到我在这里缺少什么,并给我指点吗?


根据 Par::Packer 的维护者的说法这个 GitHub 问题 https://github.com/rschupp/PAR-Packer/issues/21 :

PAR::Packer 不会打包这些非 Perl DLL 依赖项。你可以 要么完成它们,然后用 pp --link 手动打包它们 ...,[...]。或者使用 Shawn Laffan 的 App::PP::Autolink 来执行此操作 你。

所以给出这个测试脚本p.pl:

use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new();
my $res = $ua->get( 'https://metacpan.org/pod/pp');
if ($res->is_success) {
  print "ok\n";
}
else {
  die $res->status_line;
}

您可以使用应用程序::PP::自动链接 https://metacpan.org/pod/App::PP::Autolink像这样:

> pp_autolink -o p5.exe p.pl
Use of uninitialized value $_ in pattern match (m//) at C:\Strawberry\perl\site\lib/App/PP/Autolink.pm line 127.
Use of uninitialized value $_ in -e at C:\Strawberry\perl\site\lib/App/PP/Autolink.pm line 128.
DLL check iter: 1
DLL check iter: 2
DLL check iter: 3

Unable to locate these DLLS, packed script might not work:

Alien sys dlls added:
Detected link list: --link c:\strawberry\c\bin/libssl-1_1-x64__.dll --link c:\strawberry\c\bin/zlib1__.dll --link c:\strawberry\c\bin/libcrypto-1_1-x64__.dll
CMD:pp --link c:\strawberry\c\bin/libssl-1_1-x64__.dll --link c:\strawberry\c\bin/zlib1__.dll --link c:\strawberry\c\bin/libcrypto-1_1-x64__.dll -o p5.exe p.pl

正如您从上面的输出中看到的,我们缺少libssl-1_1-x64__.dll, zlib1__.dll, and /libcrypto-1_1-x64__.dll。转移这个p5.exe到另一台 Windows 10 计算机现在工作正常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Strawberry Perl 和 PAR - 在其他 Windows 计算机上运行时错误:如果安装了 LWP::Protocol::https 模块,LWP 将支持 https URL 的相关文章

随机推荐