如何在具有多个Perl版本的Perl模块中安装脚本?

如何在具有多个Perl版本的Perl模块中安装脚本?,perl,module,scripting,Perl,Module,Scripting,我不认为这是一个重复的问题。这是专门关于Perl模块附带的脚本的 通常,在安装多个Perl版本时,可以使用版本号(perl5.32)标记Perl可执行文件,以便它们可以并排放置在/whatever/bin中。我需要对模块附带的脚本执行相同的操作。示例:perltidy。因此: 当我构建perl时,是否有一个设置可以自动创建“版本化”脚本名 或者,当我在构建脚本以生成“版本化”脚本名时,调用perl Makefile.PL或perl Build.PL时,是否可以设置一些内容 是的,有plenv和p

我不认为这是一个重复的问题。这是专门关于Perl模块附带的脚本的

通常,在安装多个Perl版本时,可以使用版本号(
perl5.32
)标记Perl可执行文件,以便它们可以并排放置在
/whatever/bin
中。我需要对模块附带的脚本执行相同的操作。示例:
perltidy
。因此:

当我构建perl时,是否有一个设置可以自动创建“版本化”脚本名

或者,当我在构建脚本以生成“版本化”脚本名时,调用
perl Makefile.PL
perl Build.PL
时,是否可以设置一些内容


是的,有
plenv
perlbrew
,但我不想在生产端使用它们,但在我的生产机器上会有一段时间两个版本都存在。随着时间的推移,我将迁移程序;有一天晚上,我不会“大敲打”一个新版本。更新:重读你的问题后,我想我第一次看错了。我将在最后附上我的第一个口译,因为它可能会有用。

据我所知,您希望安装
/usr/bin/yourapp-1.1
,然后当人们升级时,您希望安装
/usr/bin/yourapp-1.2

首先,这似乎是一个考虑不周的想法。如果脚本依赖于::Module,那么按照正常的Perl模块安装,::Module 1.2将替换系统上的::Module 1.1,因此如果
/usr/bin/yourapp-1.1
运行,它将使用::Module 1.2运行。(我想,除非你把它打包。)

但这当然是可能的

简单的方法是在Makefile.PL中使用File::Copy将未版本的脚本复制到包含版本号的新文件名,然后再让MakeMaker执行它的操作


前面的答案

如果您的脚本包含这样的shebang:

#!perl
然后ExtUtils::MakeMaker将自动重写它,以指向构建发行版时的当前Perl版本

如果您的脚本包括:

#!/usr/bin/env perl

然后它将不会被重写,脚本将在运行时针对$PATH环境变量中的任何perl版本运行,这可能不是您想要的

我已经安装了大约30个PERL,并且我手动安装每个PERL:

$ ./Configure -des -Dprefix=/usr/bin/perls/perl-5.x.y
$ make test install
现在有了类似于
/usr/bin/perls/perl-5.x.y/bin/perl
之类的东西。如果我想为此安装模块或脚本,我将使用该
cpan

$ /usr/bin/perls/perl-5.x.y/bin/cpan ...
当您通过普通的Perl工具链进行安装时,shebang行指向安装它的
Perl
(有关这方面的更多信息,请参阅最近的Perl.com文章):

这将不同的程序彼此充分划分开来,每个程序都知道应该运行哪个
perl

当然,这些长路径太长,无法键入,因此我有一个程序,在
~/bin
中创建符号链接,以便
~/bin/cpan-5.x.y
指向该路径。同一程序接受它在
/usr/bin/perls/perl-5.x.y/bin
中找到的任何程序,并生成类似的符号链接

是我自己的
,它类似于接受正则表达式的程序:

$ rhich 5.32.0 | head -4
/Users/brian/bin/perls/pod_cover5.32.0 → /usr/local/perls/perl-5.32.0/bin/pod_cover
/Users/brian/bin/perls/ppodchecker5.32.0 → /usr/local/perls/perl-5.32.0/bin/ppodchecker
/Users/brian/bin/perls/prove5.32.0 → /usr/local/perls/perl-5.32.0/bin/prove
/Users/brian/bin/perls/plackup5.32.0 → /usr/local/perls/perl-5.32.0/bin/plackup
除此之外,它还提供了使用
-latest
而不是版本的链接,因此我不必记住我拥有的内容:

$ rhich latest | head -5
/Users/brian/bin/latest_sha1.pl
/Users/brian/bin/perls/perl-latest → /usr/local/perls/perl-5.32.0/bin/perl
/Users/brian/bin/perls/ptar-latest → /usr/local/perls/perl-5.32.0/bin/ptar
/Users/brian/bin/perls/ttree-latest → /usr/local/perls/perl-5.30.1/bin/ttree
/Users/brian/bin/perls/dprofpp-latest → /usr/local/perls/perl-5.14.4/bin/dprofpp
在其中的某个地方,我也只是让裸露的命令名指向最新的,这是我大多数时候想要的:

/Users/brian/bin/perls/perl → /Users/brian/bin/perls/perl-latest
珀蒂 下面是我所有的
perltidy
安装:

$ rhich perltidy
/Users/brian/bin/perls/perltidy5.30.1 → /usr/local/perls/perl-5.30.1/bin/perltidy
/Users/brian/bin/perls/perltidy5.30.0 → /usr/local/perls/perl-5.30.0/bin/perltidy
/Users/brian/bin/perls/perltidy-latest → /usr/local/perls/perl-5.32.0/bin/perltidy
/Users/brian/bin/perls/perltidy5.28.0 → /usr/local/perls/perl-5.28.0/bin/perltidy
/Users/brian/bin/perls/perltidy5.26.1 → /usr/local/perls/perl-5.26.1/bin/perltidy
/Users/brian/bin/perls/perltidy5.30.2 → /usr/local/perls/perl-5.30.2/bin/perltidy
/Users/brian/bin/perls/perltidy5.32.0 → /usr/local/perls/perl-5.32.0/bin/perltidy
/Users/brian/bin/perls/perltidy → /Users/brian/bin/perls/perltidy-latest

>据我所知,您希望安装/usr/bin/yourapp-1.1,之后当人们升级时,您希望安装/usr/bin/yourapp-1.2?不完全是。您的第一个答案更接近我需要的答案。:-)假设App::Mine提供了脚本Mine.pl。如果我在Perl5.16下安装它,那么我希望安装产生'/usr/bin/mine5.16.pl'。如果我在Perl 5.32下安装它,那么我希望安装产生“/usr/bin/mine5.32.pl”。@mpersico然后我会执行我提到的File::Copy操作,但是将脚本复制到包含Perl版本号而不是模块版本号的文件名中。tobynk-当然可以。我明白了,原来的描述中我不清楚。我试图保留多个Perl版本。通过附加Perl版本,作为一个额外的好处,我可以在一个Perl版本下升级模块,同时在另一个Perl版本下保持固定。Alos知道我这样做是为了安装所有模块,而不仅仅是我正在编写的模块。我不太确定您的File::Copy解决方案是否适用,因为a)我没有打开我下载的每个模块来修改Makefile.PL b)不是每个模块都使用Makefile.PL;对于我找到的每个tom dick和harry安装方法,我都需要这样做。我确信99.999%是Makefile.PL或Build.PL,但是容纳尾部将是一个PITA。我决定可以添加一个处理步骤,在/usr/local/bin中创建脚本的“版本化”链接。然后我读了这个答案,读了关于rhich的文章,这应该可以帮助我验证我的经理是否真的这么做了。别担心,他很难成为PHM;他是CPAN的作者。:-)是的,当你有了解决方案后,请回来告诉我们你做了什么。Re“它也会围绕符号链接进行洗牌,以便你可以“切换”到特定的版本。”,不,它不会。它只是更改当前shell中的路径。所有这些都不会影响脚本,因为脚本的安装程序将硬编码到
perl
的路径,该路径用于安装perlbrew
perl
与普通
perl
一样多。关于
pe的部分
$ rhich perltidy
/Users/brian/bin/perls/perltidy5.30.1 → /usr/local/perls/perl-5.30.1/bin/perltidy
/Users/brian/bin/perls/perltidy5.30.0 → /usr/local/perls/perl-5.30.0/bin/perltidy
/Users/brian/bin/perls/perltidy-latest → /usr/local/perls/perl-5.32.0/bin/perltidy
/Users/brian/bin/perls/perltidy5.28.0 → /usr/local/perls/perl-5.28.0/bin/perltidy
/Users/brian/bin/perls/perltidy5.26.1 → /usr/local/perls/perl-5.26.1/bin/perltidy
/Users/brian/bin/perls/perltidy5.30.2 → /usr/local/perls/perl-5.30.2/bin/perltidy
/Users/brian/bin/perls/perltidy5.32.0 → /usr/local/perls/perl-5.32.0/bin/perltidy
/Users/brian/bin/perls/perltidy → /Users/brian/bin/perls/perltidy-latest