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

zzlelutf  于 2022-12-19  发布在  Perl
关注(0)|答案(2)|浏览(188)

我不认为这是一个重复的问题,这是专门针对Perl模块附带的脚本的。
通常,当安装多个Perl版本时,您可以使用版本号(perl5.32)标记Perl可执行文件,以便它们可以并排放置在/whatever/bin中。我需要对模块附带的脚本执行相同的操作。perltidy。因此:
当我构建perl的时候,是否有一个设置可以自动创建“版本化”脚本名?
或者,当我在构建脚本时调用perl Makefile.PLperl Build.PL时,是否可以设置一些东西来生成“版本化”脚本名称?
是的,有plenvperlbrew,但是我不想在生产端使用它们,但是在我的生产机器上会有一段时间两个版本都存在。我不会“大敲”一个切换到一个新版本的一个晚上。

bt1cpqcv

bt1cpqcv1#

我在Make links to per-version tools中写了更多关于这方面的内容。
我安装了大约30个perls,并且我手动安装每个perls:

$ ./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文章Bang Bang):

#!/usr/local/perls/perl-5.32.0/bin/perl
    eval 'exec /usr/local/perls/perl-5.32.0/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
#!/usr/local/bin/perl

这充分地划分了不同的程序,每个程序都知道应该运行哪个perl
当然,这些长路径太多了,所以我有一个程序,它在~/bin中创建符号链接,使~/bin/cpan-5.x.y指向它。同一个程序接受它在/usr/bin/perls/perl-5.x.y/bin中找到的任何程序,并创建类似的符号链接。
rhich是我自己的类似which的程序,它使用正则表达式:

$ 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
9gm1akwq

9gm1akwq2#

最新情况:我重新阅读了你的问题,我想我第一次读错了。我将在最后加上我的第一个解释,因为它可能有用。

所以据我所知,你希望安装/usr/bin/yourapp-1.1,然后当人们升级时,你希望安装/usr/bin/yourapp-1.2
首先,这似乎是一个考虑不周的想法。如果您的脚本依赖于Your::Module,那么按照正常的Perl模块安装,Your::Module 1.2将替换系统上的Your::Module 1.1,因此如果/usr/bin/yourapp-1.1运行,它将使用Your::Module 1.2运行。(我猜,除非您对它进行fatpack。)
但这肯定是可能的。
简单的方法是在Makefile.PL中使用File::Copy将未版本化的脚本复制到包含版本号的新文件名中,然后让MakeMaker执行操作。

以前的答复

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

#!perl

然后ExtUtils::MakeMaker将自动重写它以指向构建发行版时Perl的当前版本。
如果您的脚本包括:

#!/usr/bin/env perl

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

相关问题