【发布时间】:2014-02-12 17:46:30
【问题描述】:
编辑
我在此处添加了解释的前缀,以方便其他对此问题感到困惑的人。 正如@Ikegami 解释的那样,
-
VERSION_FROM表示 发行版 的版本来自哪里, 如果不在顶级模块中; -
PREREQ_PM表示(可选)每个所需模块的版本
通常一个发行版,带有一个版本号,由几个模块组成, 每个都有自己的版本号,与发行版的编号不同。
在频谱的另一端,由单个模块组成的分布
文件不需要利用VERSION_FROM。
但是,对于中间情况:
- 应具有相同版本号的多个模块和程序的分布,并且
- 有足够多的文件或程序在其中放置版本是有利的 编号到一个单独的文件中
那么,下面描述的 hack 可能对您有用。
希望对某人有所帮助!
原始问题
实际上我在 ExtUtils::MakeMaker 的 POD 中看到的第一件事是VERSION_FROM,
这表明可以,甚至可能应该使用它。然而,
甚至 MakeMaker 本身也看不到先决条件的版本(以PREREQ_PM 列出)
除非它在顶级模块中。也就是说,如果我设置另一个模块 Bar
需要特定版本的 Foo,其中 Foo 在 Foo.pm 以外的其他位置定义其版本,
MakeMaker 将报告 Foo 的版本为未知。
似乎是一个如此明显且长期存在的错误,让我怀疑我是否 只是误解或误用?
EDIT 问题是:为什么MakeMaker在不使用VERSION_FROM的时候鼓励它 获取版本?
编辑以下是一个可能有问题的解决方法,而不是主要问题:
OTOH,ExtUtils::MM_Unix 中检查版本的代码在任何地方都看不到
VERSION_FROM 会表示。然而,它确实表明了一个有趣的
解决方法。
如果模块 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 标准)?
谢谢
【问题讨论】:
-
你展示了什么有效,但我不清楚什么无效。
-
除非你把那个 dubious hack 放在 Foo.pm 中,否则它是行不通的; MakeMaker POD 或其他地方没有暗示需要这样的东西。
-
“它不起作用”没有澄清任何事情。什么”?你得到了什么你认为不可接受的结果?
-
“It doesn't work”指的是第1段的结论,即MakeMaker报告Foo的版本为未知。在这种情况下,“有效”是指在尝试构建假设的包“Bar”时,MakeMaker 会意识到 Foo 的版本为 0.1。
-
你没有给我加标签,所以我没有收到你的评论通知。