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
的脚本,可以很容易地更新一堆一堆的模块。