我所有的perl-module.pm文件都需要一个"$VERSION"定义



我刚刚向PDL::IO::Touchstone分发版添加了一个新文件,并注意到CPAN的索引器说版本是未定义的,因为缺少$VERSION

module : PDL::IO::MDIF
version: undef
in file: PDL-IO-Touchstone-1.009/lib/PDL/IO/MDIF.pm
status : indexed

所以::MDIF没有$VERSION,但实际上它与Makefile.PL:中提到的分发版本相同

my %WriteMakefileArgs = (
VERSION_FROM     => 'lib/PDL/IO/Touchstone.pm',
...
);

问题:

  • 那么发行版中的这个模块需要一个版本吗
  • 如果是,新模块的$VERSION是否应与Makefile.PLVERSION_FROM提供的$VERSION分开维护?
    • 我可以做$VERSION = $PDL::IO::Touchstone::VERSION,但不确定CPAN是否能解决这个问题。会吗

我环顾四周,发现了很多关于版本控制实践的讨论,但没有关于同一Perl分发包中模块版本的讨论。请分享这里的最佳实践,我是Perl模块的新手,这是我推出的第一个2文件分发版。

我确信我会在发布新的dist时更新主文件,但不确定当dist中的其他模块发生更改时,我是否会记得更改它们的版本。如果这里有一个低维护的选择,那就太好了。

更新

我在下面的一些答案中尝试了这个建议。这两项都不起作用:

  • $VERSION = do { use PDL::IO::Touchstone; $PDL::IO::Touchstone::VERSION };

  • use PDL::IO::Touchstone; our $VERSION = $PDL::IO::Touchstone::VERSION;

这是github上的MDIF.pm文件:https://github.com/KJ7LNW/perl-PDL-IO-Touchstone/blob/master/lib/PDL/IO/MDIF.pm#L22

CPAN仍显示version: undef:

Status: Version parsing problem
===============================
module : PDL::IO::MDIF
version: undef
...

好的,那么谁得到了复选标记。。。还有其他想法吗?

我喜欢给出我所有模块的版本。这不是一个要求,但当用户对CPAN的工作原理一无所知或知之甚少时,在尝试升级时要考虑用户体验。池上已经给出了tl;这个的医生。

当您想从CPAN更新模块时,该工具会查看该模块的$VERSION(好的VERSION子)。如果这个模块没有版本,那就是undef。当CPAN.pm(或其他工具)查看是否有更新的版本时,它没有找到它认为更新的,因为最新的版本也是未定义的。

一个具体的例子是Mojo::UserAgent。Mojolicus仅对主模块进行版本化。其他模块没有版本。我通常会做很多web客户端的工作,所以我的工作产品不关心Mojo的web服务器端。使用我的一些东西的人可能甚至不知道Mojo除了客户端的东西之外还有另一个不同的部分(他们甚至可能知道Perl)。

如果我运行cpan Mojo::UserAgent,它会将我当前安装的版本(unde)与CPAN上的最新版本(undf)进行比较。这意味着CPAN.pm猜测我没有比最新可用的更早的东西。

$ cpan -D Mojo::UserAgent
Mojo::UserAgent
-------------------------------------------------------------------------
(no description)
S/SR/SRI/Mojolicious-9.28.tar.gz
/usr/local/perls/perl-5.36.0/lib/site_perl/5.36.0/Mojo/UserAgent.pm
Installed: undef
CPAN:      undef  up to date
Sebastian Riedel (SRI)
kraihx@googlemail.com

现在,我有一个特殊的知识,这个发行版可以做到这一点。但有些人仅仅使用我用Mojo::UserAgent写的东西可能不会。如果他们需要Mojolicus 8来获得特定的CSS选择器,他们怎么知道呢?

通常,您可以指定模块的最低版本:

use File::Glob 8.0;

我不能要求最低版本的Mojo::UserAgent:

use Mojo::Usergent 8.0;

我得到了一个奇怪的错误(还有其他导入问题和设计决策):

Can't locate 8.pm in @INC (@INC contains: ...)

这没什么大不了的,因为Mojolicus基本上是独立的,所以我可以指定它的最低版本:

use Mojolicious 8.0;

但是,我必须知道所有这些是如何工作的,发行版是如何工作,以及Perl是如何做到这一点的。对于那些只想放下工作,包括修改我所做的事情的普通用户来说,他们必须发现一些知识才能知道这一点。他们必须知道CPAN.pm或PAUSE是如何决定最新版本的,等等

此外,对于发行版中的模块来说,这是一个问题,这些模块不会更改,也没有版本冲突的逻辑原因。他们这样做是因为他们对有版本的主模块有一个隐含的依赖,但我们没有声明那个版本的习惯。例如,考虑与API一起工作的某个模块发生了变化,但变化的核心在它使用的另一个模块中。您直接使用的模块没有更改其文本,但由于世界不同,它无法正常工作。但是,由于该文件中的文字没有更改,因此我们通常不会更改版本。

也许我们应该声明主模块依赖关系,但这需要做很多工作。它给文件添加了一些看似毫无意义的搅乱,这在回购历史上很烦人。啊,见鬼,既然我已经想到了,我需要在一些发行版中解决这个问题。有些不是全部。我不知道。值得思考的事情。

当然,我可以在发行版、脚本或其他文件中记录所有这些。但我们知道,我可以说出来,他们也可以读出来,但仍然没有意识到它的重要性。而且,到了这个时候,我们离";只是工作";。

CPAN只需要发行版的一个版本,并且您已经使用VERSION_FROM提供了该版本。

有各种各样的做法。

  • 只有";主模块";有一个版本
  • 每个文件都有自己的版本
  • 每个文件共享发行版的版本

CPAN评估设置$VERSION的行,因此如果全部在一行上,则以下操作应该有效:

use PDL::IO::Touchstone; $VERSION = $PDL::IO::Touchstone::VERSION;

相关内容

最新更新