【问题标题】:Install fails with Perl module Date::CalcPerl 模块 Date::Calc 安装失败
【发布时间】:2016-02-14 06:56:45
【问题描述】:

我正在尝试安装 perl 模块 Date::Calc 版本 6。它是 gnuCalc 的一部分,安装时失败。我选择手动下载 Date::Calc 并安装它,但它给出了完全相同的错误,如下所示。由于 Date::Calc 不限于 gnuCalc,我希望有人能指出我解决这个问题的方向。

我使用的是 Windows 7 64 位。 Perl 是草莓 Perl 版本 5.18.2002

提前致谢。

E:\Downloads\Date-Calc-6.3>perl Makefile.PL

*************************************************************
****** BEWARE: Use "make install UNINST=1" to install! ******
*************************************************************

Checking if your kit is complete...
Looks good
Generating a dmake-style Makefile
Writing Makefile for Date::Calc
Writing MYMETA.yml and MYMETA.json

E:\Downloads\Date-Calc-6.3>C:\strawberry\c\bin\dmake.exe
cp lib/Date/Calc/Object.pod blib\lib\Date\Calc\Object.pod
cp lib/Date/Calc.pm blib\lib\Date\Calc.pm
cp lib/Date/Calendar/Profiles.pod blib\lib\Date\Calendar\Profiles.pod
cp lib/Date/Calendar.pm blib\lib\Date\Calendar.pm
cp lib/Date/Calendar.pod blib\lib\Date\Calendar.pod
cp lib/Date/Calc/Object.pm blib\lib\Date\Calc\Object.pm
cp lib/Date/Calc/PP.pm blib\lib\Date\Calc\PP.pm
cp lib/Date/Calendar/Profiles.pm blib\lib\Date\Calendar\Profiles.pm
cp lib/Date/Calc/PP.pod blib\lib\Date\Calc\PP.pod
cp lib/Date/Calendar/Year.pod blib\lib\Date\Calendar\Year.pod
cp lib/Date/Calendar/Year.pm blib\lib\Date\Calendar\Year.pm
cp lib/Date/Calc.pod blib\lib\Date\Calc.pod

E:\Downloads\Date-Calc-6.3>C:\strawberry\c\bin\dmake.exe test
C:\strawberry\perl\bin\perl.exe "-MExtUtils::Command::MM" "-MTest::Harness" "-e"
 "undef *Test::Harness::Switches; test_harness(0, 'blib\lib', 'blib\arch')" t/*.
t
t/f000.t .. ok
t/f001.t .. ok
t/f002.t .. ok
t/f003.t .. ok
t/f004.t .. ok
t/f005.t .. ok
t/f006.t .. ok
t/f007.t .. ok
t/f008.t .. ok
t/f009.t .. ok
t/f010.t .. ok
t/f011.t .. ok
t/f012.t .. ok
t/f013.t .. ok
t/f014.t .. ok
t/f015.t .. ok
t/f016.t .. Failed 16/25 subtests
t/f017.t .. ok
t/f018.t .. ok
t/f019.t .. ok
t/f020.t .. ok
t/f021.t .. ok
t/f022.t .. ok
t/f023.t .. ok
t/f024.t .. ok
t/f025.t .. ok
t/f026.t .. ok
t/f027.t .. Failed 22/46 subtests
t/f028.t .. Failed 22/46 subtests
t/f029.t .. ok
t/f030.t .. ok
t/f031.t .. ok
t/f032.t .. ok
t/f033.t .. ok
t/f034.t .. ok
t/f035.t .. ok
t/f036.t .. ok
t/f037.t .. ok
t/m001.t .. ok
t/m002.t .. ok
t/m003.t .. ok
t/m004.t .. ok
t/m005.t .. ok
t/m006.t .. ok
t/m007.t .. ok
t/m008.t .. ok
t/m009.t .. ok
t/m010.t .. ok
t/m011.t .. ok
t/m012.t .. ok
t/m013.t .. ok

Test Summary Report
-------------------
t/f016.t (Wstat: 0 Tests: 25 Failed: 16)
  Failed tests:  1-4, 6-7, 9-12, 15-17, 21-23
t/f027.t (Wstat: 0 Tests: 46 Failed: 22)
  Failed tests:  7-15, 22, 24-27, 30-35, 44-45
t/f028.t (Wstat: 0 Tests: 46 Failed: 22)
  Failed tests:  7-15, 22, 24-27, 30, 32, 34-37, 44-45
Files=51, Tests=3381,  3 wallclock secs ( 0.20 usr +  0.01 sys =  0.22 CPU)
Result: FAIL
Failed 3/51 test programs. 60/3381 subtests failed.
dmake.exe:  Error code 255, while making 'test_dynamic'

【问题讨论】:

  • 看起来 Date::Calc 现在有问题:3/51 测试程序失败。 60/3381 子测试失败。 Makefile:890:目标“test_dynamic”的配方失败 make:*** [test_dynamic] 错误 255
  • 如果您不是特别需要 Date::Calc,我会推荐 DateTime。它具有更好的功能、界面和更好的维护。
  • @Schwern - 谢谢,Date::Calc 是 gnuCash 中 Finance::Quote 的依赖项,用于在线价格检索(股票报价)。也感谢您在错误报告末尾指出补丁。

标签: perl


【解决方案1】:

不要用好的测试代替坏的测试。

这些测试的目的是测试。如果有问题,你需要知道它,而不是把它扫到地毯下。以一种或另一种方式解决问题。您的系统是否有问题,或者这是测试本身的问题。如果这是测试的问题,它还会影响您吗?如果这是系统问题,您可能会遇到这种情况吗?例如,假设有一个测试检查您的系统和 Windows 系统之间的连接性。如果您不连接到 Windows 系统,那么该特定测试可能不适用于您。

如果您的测试失败,请转到该模块的 MetaCPAN 网页,并检查左侧的 issues 以查看其他人是否遇到相同的错误。 (Bug #101232 for Date-Calc: Test suite started to fail since 2015-01-01 - 新年快乐!)。

还有一个 QA 测试人员 CPAN 网页,但现在已关闭。 QA 测试人员网页将向您展示各种 Perl 版本、模块版本、平台,并向您展示哪些测试在特定平台上的哪些版本上失败了。您可能需要安装该模块的替代版本。

只有在您确定失败的测试不一定适用于您之后,才进行强制安装:

cpan> force install Date::Calc

这将贯穿整个安装过程,但会跳过所有测试。 (或者它仍然可以测试,但如果测试失败也不会失败。)。该模块仍然会因编译器错误或某些内容无法写入您的系统而失败。它只是忽略测试。

这应该是最后一次安装某些东西的绝望尝试。您应该已经确定失败的测试是错误或对您没有意义。或者,有人站在你旁边,用枪指着你的头说:“安装那个模块,否则我会扣动扳机!”


或者,您可以决定使用它,并简单地使用另一个模块——尤其是一个已经包含在标准 Perl 发行版中的模块,例如Time::Piece。如果这是一个新的 Perl 程序,您不妨使用Time::Piece,因为它是 Perl 的官方时间计算模块。

好吧,很难说某件事是否是官方,但Time::Piece 包含在自 5.10 以来的所有 Perl 安装中,而 Date::Calc 虽然更受欢迎,但不是。然而,既然Time::Piece 现在是官方安装的一部分,它更有可能被包含在运行 Perl 程序的系统中。这也意味着更多的人在测试它,更多的用户在使用它,发现的错误更有可能被修复。

如果这是您正在编写的新 Perl 程序,请考虑使用 Time::Piece 而不是 Date::Calc

【讨论】:

  • 在该错误报告的末尾有一个补丁可以修复失败的测试。 rt.cpan.org/Public/Bug/Display.html?id=101232#txn-1450438
  • 很好的答案。我以不同的方式解决了它,但是您的方法更可取。在我的例子中,Date::Calc 是 Finance::Quote 的依赖项,所以我不能使用另一个模块(据我所知)。我能够验证错误报告是测试失败的来源,并且对我来说不太可能成为问题。经过太多小时的尝试安装后,是我的妻子用枪顶着我的头......
  • 有趣的是,提到的补丁只修补了 3 个测试文件。根本不更改代码。
  • @mseifert 是的,这是测试代码中的一个错误。关于当前日期的假设不再正确。
  • 好玩,好玩,好玩! error 实际上是在 GNU C time 函数中。 GNU 时间函数的假设是假设两位数年份在当前年份的五十年时间段内。在 2014 年,01/15/64 被假定为 1964 年 1 月 15 日,因为 1964 年是 50 年前。然而,在 2015 年,新的假设是 01/15/64 实际上是 2064,因为 1964 年是 50 多年前。在 POSIX 中,截止值是 always 1969。
【解决方案2】:

Date::Calc 手册说: 如果年份仅以一位或两位数给出(即,如果年份小于 100),则将其映射到当前年份 +/- 50 年的“窗口”,如“Moving_Window() " 功能(见下文)。 所以我不得不说补丁 proposed patch 是正确的,至少在接下来的 50 年内是正确的

【讨论】:

  • 工作补丁确实是here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2018-06-19
  • 2013-11-04
  • 2020-06-19
相关资源
最近更新 更多