11

在工作中,我在 Windows 上使用 Perl 5.8.0。

当我第一次安装 Perl 时,我去了 CPAN,下载了所有源代码,做了一些更改(在 .MAK 文件(?)中以支持线程,或类似的东西),然后nmake/ nmake test/ nmake install。然后,一点一点地,我从 CPAN 下载了各个模块并完成了 nmake 舞蹈。

所以,我想升级到更新的版本,但新版本不能破坏任何现有的脚本。值得注意的是,我安装的一堆“使用”模块必须安装在新版本中。

更新我当前版本的最可靠(也是最简单)的方法是什么,以确保我对 nmake 舞蹈所做的一切在更新后仍然存在?

4

7 回答 7

9

正如其他人所指出的,首先在一个单独的地方安装新的 perl。我安装了几个 perls,每个都与其他的完全分开。

为此,您必须自己配置和编译源代码。运行时configure,您将有机会指定安装程序。我在The Perl Review 2008 年春季刊的“编译我自己的 Perl”中对此给出了详细说明。Effective Perl Programming中还有一个 Item向您展示了如何做到这一点。

现在,回到您的原始发行版并运行cpan -a以创建一个自动捆绑文件。这是一个 Pod 文档,列出了您已安装的所有额外内容,CPAN.pm 了解如何使用它重新安装所有内容。

要在新的 perl 中安装东西,请使用该 perl 的路径来启动 CPAN.pm 并安装您创建的 autobundle 文件。CPAN.pm 将从 perl 的配置中获得正确的安装路径。

观察输出以确保一切顺利。此过程不会安装相同版本的模块,而是安装最新版本。

至于Strawberry Perl,除了默认位置之外,您还可以安装一个“便携式”版本。这样你就可以在可移动媒体上使用新的 perl。您可以在任何您喜欢的地方对其进行测试,而不会影响本地安装。不过,我认为这还没有为一般用途做好准备。Berrybrew工具可能帮助您管理它。

祝你好运, :)

于 2008-09-22T22:11:15.363 回答
8

我会认真考虑使用Strawberry Perl

于 2008-09-22T20:49:07.307 回答
4

您可以在不同的位置安装 Perl 的第二个版本。您必须将所有非核心模块重新安装到新版本中。通常,不同版本的 Perl 不兼容二进制,如果您有任何使用 XS 组件的特定于程序的库,这可能是一个问题。纯 Perl 模块不应受到影响。

于 2008-09-22T20:49:53.733 回答
3

如果您停留在 5.8 轨道内,所有已安装的包含 XS(二进制)扩展的模块将继续工作,因为在同一个 5.8 系列中保证了二进制兼容性。如果您迁移到 5.10,那么您将不得不重新编译任何包含 XS 组件的模块。

您需要做的就是确保新构建在其@INC 数组(用于查找模块)中列出了以前的包含目录。

从它的声音来看,我认为您在 Windows 上,在这种情况下,可以查看当前的 @INC 路径

perl -le "print for @INC"

确保将新的 Perl 版本定位在另一个目录中。它将与以前的版本愉快地共存,这将允许您选择使用哪个 Perl 安装;这只是整理您的 PATH 顺序的问题。一旦 Perl 解释器启动,它就知道去哪里寻找它的其余模块。

Strawberry Perl 可能是目前 Windows 上最好的发行版,可以让你自己滚动。

于 2008-09-22T20:53:34.300 回答
1

当我这样做时,我将较新的安装到一个单独的目录中。运行两个版本会带来一些额外的混乱,但它肯定有助于确保一切正常,并提供一种在紧要关头切换回旧版本的快速方法。我还将 Apache 设置为运行两个独立的服务,这样我就可以在一个服务中使用新的 Perl,而无需触及旧 Perl 上的生产服务。

事后看来,安装在单独的计算机上并在那里进行测试可能更明智。记录您需要进行的每个配置更改。

我不确定自己构建它——我总是只使用预打包的 Windows 二进制文件。

我不确定我是否完全理解您的要求。你有你对 5.8 makefile 所做的更改的列表吗?或者问题是如何获得这样的列表?您是否还在询问如何找出您从 CPAN 获得的基本安装之上的哪些软件包?如果您再次从 CPAN 获取自定义更改,您是否还询问如何测试您的自定义更改不会破坏这些包?

于 2008-09-22T20:46:46.313 回答
1

我认为这个问题的答案涉及某种虚拟化:

  1. 设置当前实时机器的精确副本。升级 Perl,使用与您目前使用的相同的目录位置和结构。
  2. 通过您的脚本在新图像上测试它们。
  3. 开心后,拨动开关。

这背后的想法是,可能存在你没有想到的各种微妙的依赖关系和假设。虽然不太可能,但与您使用的模块相比,特定模块的最新版本(甚至可能是核心模块,尽管这更不可能)可能会有细微的差别。除非您已经详尽地浏览了整个代码库,否则很可能只有在某些情况下才需要一个特定的模块。

您可以尝试通过构建所有脚本的列表来发现这一点 - 一个无论如何都应该拥有的列表,通过所有代码都处于版本控制之下(您正在使用版本控制,例如Subversion,是吗?) - 并迭代它,perl -c在每个脚本上运行。例如这个脚本。这种自动化测试是无价的:你可以让它运行,出去喝杯咖啡或其他什么,然后回来检查一切是否正常。最初的几次你可能会发现一个你忘记的晦涩的模块,这很好:自动化它的全部目的是让不必做检查每个脚本的苦差事。

于 2008-09-23T00:33:36.707 回答
0

为什么不使用 ActivePerl 及其“ppm”工具来(重新)安装模块?

替代文字

于 2011-01-04T14:32:25.323 回答