perl MakeMaker的版本

编辑

我在这里为前面的解释添加了前缀,以便让这个问题困惑的其他人受益。 正如@Ikegami所解释的那样,

  • VERSION_FROM表示分发版本来自哪里,如果不在顶层模块中;
  • PREREQ_PM指示(可选)每个所需模块的版本
  • 通常情况下,一个包含版本号的分发包含几个模块,每个模块都带有自己的版本号,与分发版的编号不同。

    另一方面,在单个文件中包含单个模块的分发将不需要利用VERSION_FROM

    但是,对于中间情况:

  • 一个应该有相同版本号的几个模块和程序的分配,以及
  • 有足够的文件或程序将版本号放入单独的单独文件中是有利的
  • 那么,下面介绍的黑客可能对你有用。

    希望帮助别人!

    原始问题

    实际上,我在ExtUtils :: MakeMaker的POD中看到的第一件事是VERSION_FROM ,这表明可以或甚至应该使用它。 但是,即使MakeMaker本身没有看到先决条件的版本(与PREREQ_PM一起PREREQ_PM ),除非它在顶层模块中。 也就是说,如果我设置另一个需要特定版本的Foo的模块Bar,其中Foo将其版本定义为Foo.pm以外的某个版本,MakeMaker会将Foo的版本报告为未知。

    看起来像这样一个明显的,长期存在的错误,让我怀疑我是否只是误解或误用它?

    编辑问题是:为什么MakeMaker在不使用它来获取版本时鼓励VERSION_FROM?

    编辑以下是可能有问题的解决方法,而不是主要问题:

    OTOH,ExtUtils :: MM_Unix中的代码不检查VERSION_FROM会指示的任何地方。 但是,它确实表明了一个有趣的解决方法。

    如果Module Foo在Makefile.PM中有:

    WriteMakefile(
      NAME=>'Foo',
      VERSION_FROM => 'lib/Foo/Version.pm',
      ...
    

    lib / Foo / Version.pm显然有

    use vars qw($VERSION);
    $VERSION = '0.1';
    

    然后在Foo.pm中,你把:

    $Foo::VERSION = do { use Foo::Version; $Foo::Version::VERSION; };
    

    和一切正常.....现在!

    那么,这是MakeMaker中的一个错误吗? 和/或我的解决方法是否可以理解(按Perl标准)?

    谢谢


    在这种情况下,“Works”将会是,当试图构建假设的“Bar”包时,MakeMaker会意识到Foo的版本为0.1。

    VERSION_FROM指定从何处获取发行版的版本。 它不设置任何模块的版本。

    PREREQ_PM定义了分配需要的模块列表和(根据其名称和版本)。

    模块的版本可能与它所在的发布版本不同。 模块Foo没有版本,这就是为什么要求版本0.1的模块Foo(正确)失败的原因。


    $VERSION变量显然与任何其他变量相似,因此您可以用富有想象力的方式进行设置,如:

    $Foo::VERSION = do { use Foo::Version; $Foo::Version::VERSION; };
    

    要么:

    $Foo::VERSION = grep /[aeiou]/, 'a'..'z';   # version five
    

    但是,许多工具链模块(包括ExtUtils :: MakeMaker) 不会执行您的文件来查找版本号 。 相反,他们会通过查看线条并尝试寻找一些看起来像数字的东西,这些东西看起来像名为$VERSION的变量,并猜测该数字是模块的版本。 当然这并不理想,但这是我们生活的世界。

    为了让这些工具起作用,你需要确保以一种非常简单的方式设置你的版本号,la:

    $Foo::VERSION = '1.001';
    

    如果您有很多模块,并且担心同时更新所有模块的版本号,请安装Perl :: Version,它附带了一个名为perl-reversion的脚本,可以很容易地更新一堆一堆的模块。

    链接地址: http://www.djcxy.com/p/59221.html

    上一篇: perl MakeMaker's version

    下一篇: Does perlbrew work with cygwin?