如何在Windows上更新Perl而又不会丢失模块?
在工作中,我在Windows上使用Perl 5.8.0。
当我第一次使用Perl时,我去了CPAN,下载了所有源代码,进行了一些更改(在.MAK文件中以支持线程,或者类似的东西),并进行了nmake / nmake test / nmake安装。然后,一点一点地,我从CPAN下载了单个模块并进行了nmake跳舞。
因此,我想升级到较新的版本,但是新版本不得破坏任何现有脚本。值得注意的是,必须在新版本中安装一堆我已安装的"使用"模块。
更新我当前版本的最可靠(最简单)的方法是什么,确保在更新后仍然可以使用nmake dance完成所有工作?
解决方案
完成后,我将较新的版本安装到一个单独的目录中。运行两个版本会增加一些混乱,但这绝对有助于确保所有功能都首先运行,并提供了一种快速切换回旧版本的快速方法。我还设置了Apache以运行两个单独的服务,因此我可以在一项服务中使用较新的Perl,而不必在旧的Perl上使用生产性服务。
事后看来,将其安装在单独的计算机上并在其中进行测试可能要明智得多。记录我们需要进行的每个配置更改。
不知道自己构建它我总是只使用Windows的预打包二进制文件。
我不确定我确切了解要求。我们是否有对5.8 makefile所做的更改的列表?还是问题是如何获得这样的清单?我们是否还在问如何找出从CPAN获得的基本安装之上的哪些软件包?我们是否还在问如果再次从CPAN获得这些软件包,如何测试自定义更改不会破坏这些软件包?
我会认真考虑使用草莓Perl。
我们可以在其他位置安装第二个版本的Perl。我们必须将所有非核心模块重新安装到新版本中。通常,不同版本的Perl不二进制兼容,如果我们有任何利用XS组件的特定于程序的库,则可能会出现问题。纯Perl模块不应该受到影响。
如果我们停留在5.8轨道之内,则所有安装的包含XS(二进制)扩展名的模块将继续工作,因为在同一5.8系列中保证了二进制兼容性。如果移至5.10,则必须重新编译包含XS组件的所有模块。
我们需要做的就是确保新版本在其@INC数组(用于查找模块)中列出以前的包含目录。
听起来,我认为我们使用的是Windows,在这种情况下,当前的@INC路径可以通过
perl -le "print for @INC"
确保在另一个目录中定位新的Perl版本。它将愉快地共存
使用以前的版本,这将允许我们选择使用哪种Perl安装;这只是整理PATH顺序的问题。一旦启动了perl解释器,它便知道在哪里寻找其其余模块。
如今,Strawberry Perl可能是Windows上最适合自己滚动的发行版。
如其他人所述,首先在单独的地方安装新的perl。我安装了几个Perl,每个Perl与所有其他Perl完全分开。
为此,我们必须自己配置和编译源。运行configure
时,我们将有机会指定安装程序。在《 Perl评论》 2008年春季的"编译我自己的Perl"中,我对此进行了详细说明。有效的Perl编程中还有一个项目向我们展示如何进行。
现在,返回到原始发行版并运行cpan -a
以创建一个自动捆绑文件。这是一个Pod文档,其中列出了我们已安装的所有其他内容,CPAN.pm理解如何使用它来重新安装所有内容。
要在新的perl中安装东西,请使用该perl的路径启动CPAN.pm并安装我们创建的autobundle文件。 CPAN.pm将从该perl的配置中获取正确的安装路径。
观察输出以确保一切顺利。此过程不会安装相同版本的模块,而是安装最新版本。
至于Strawberry Perl,除了默认位置外,我们还可以在其他位置安装"便携式"版本。这样,我们可以在可移动介质上安装新的Perl。我们可以在任何喜欢的地方对其进行测试,而不会影响本地安装。我认为这还不适合一般使用。 Berrybrew工具可能会进行管理。
祝你好运, :)
我认为解决方案涉及某种虚拟化:
- 设置当前活动计算机的精确副本。使用与当前所使用的相同的目录位置和结构升级Perl。
- 完成脚本,然后在新映像上对其进行测试。
- 一旦感到满意,请拨动开关。
其背后的想法是,可能存在我们未曾想到的各种细微的依赖关系和假设。虽然不太可能,但是特定模块的最新版本(甚至可能是核心模块,尽管可能性更大)与我们使用的模块相比可能会有细微的差别。除非我们已遍历整个代码库,否则很可能只有在某些情况下才需要特定模块。
我们可以尝试通过建立所有脚本的列表(无论如何应该拥有),通过所有代码受版本控制(我们正在使用版本控制,例如Subversion,是吗?)并对其进行迭代来发现该列表,在每个脚本上运行perl -c
。例如这个脚本。这种自动测试非常宝贵:我们可以将其设置为运行,去喝杯咖啡或者其他任何东西,然后返回以检查是否一切正常。最初的几次,我们可能会发现一个忘记的晦涩模块,这很好:将其自动化的全部目的是,我们不必进行检查每个脚本的繁琐工作。