2008-09-22 257 views
9

在工作中,我在Windows上使用Perl 5.8.0。如何在Windows上更新Perl而不丢失模块?

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

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

什么是最可靠(最简单)的方式来更新我的当前版本,确保我所做的一切与nmake跳舞将在更新后仍然存在?

+0

这可能是一个好主意,如果有人改变了这对“如何在Windows Update上的Perl”,或类似的标题。 – 2008-09-22 22:03:02

+0

我建议“如何在Windows上更新Perl而不会丢失模块。”我开始给出我的答案,然后意识到它不适合,因为我的答案是纯UNIX,并要求您重新安装所有模块(我认为这将是一个要求)。 – skiphoppy 2008-09-24 19:10:37

+0

感谢您的标题建议。我已编辑以反映您的建议。 – piCookie 2008-10-07 14:59:43

回答

9

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

要做到这一点,您必须自己配置和编译源代码。当您运行configure时,您将有机会指定安装程序。我在the Spring 2008 issue of The Perl Review的“编译自己的Perl”中给出了详细的说明。还有一个项目有效的Perl编程,告诉你如何去做。

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

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

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

至于Strawberry Perl,有一个“便携”版本可以安装在默认位置以外的某个位置。这样你可以在可移动媒体上安装新的perl。您可以在任何地方测试它,而不会影响本地安装。尽管如此,我不认为这已经准备好了。 Berrybrew工具可能会帮助您管理它。

祝你好运:)

1

当我这样做了,我安装了较新的一个单独的目录。有两个版本增加了一些混淆,但它确实有助于确保一切正常工作,并提供了一种快速切换回旧版本的方法。我还设置了Apache来运行两个独立的服务,这样我就可以在一个服务中使用新的Perl,而不必接触旧的Perl上的生产服务器。

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

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

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

+0

鉴于大量修改,预包装可能无法使用。我也安装到名为文件夹的版本中,并从通用的R:\ PERL文件夹中链接以帮助切换。 – piCookie 2008-09-22 20:48:05

+0

5.8生成文件的更改并不重要。我更多地问如何找到我已经获得的基本安装之上的哪些软件包。我有很多脚本说“使用xxx”,其中xxx被下载和内置。他们都需要继续工作。 – piCookie 2008-09-23 15:12:06

+0

这可能有点跛脚,但是您可以使用TextPad的“在文件中查找”或等效功能来搜索“^ use”的所有脚本。 – Kev 2008-10-07 15:09:47

4

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

3

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

您需要做的就是确保新版本在其@INC数组(它用于查找模块)中列出以前的include目录。

通过它的声音,我认为你是在Windows上,在这种情况下,当前@INC路径可以

perl -le "print for @INC" 

被视为确保在另一个目录瞄准新的Perl版本。它将与以前的版本共享 ,这将允许您选择使用哪个Perl安装;这只是一个解决PATH订单的问题。一旦perl解释器启动,它就知道在哪里寻找其余的模块。

草莓Perl可能是最近在Windows上推出自己的最好的发行版。

1

我认为这个问题的答案涉及某种virtualisation

  1. 设置您的当前活动机器的精确拷贝。升级Perl,使用与您目前使用的相同的目录位置和结构。
  2. 通过您的脚本在新映像上测试它们。
  3. 一旦你快乐,翻开开关。

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

你可以尝试通过建立所有的脚本列表发现这一点 - (你使用版本控制,如Subversion,是的,你应该有反正列表,通过所有的代码力是版本控制之下?) - 并遍历它,在每个脚本上运行perl -c。例如this script。这种自动化测试是无价的:你可以设置它运行,离开喝咖啡或任何东西,然后回来检查是否一切正常。前几次你可能会发现一个你忘记了的模糊的模块,这很好:自动化的这一点使得你不需要做检查每一个脚本的苦差事。

0

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

alt text