为什么我不能简单地将已安装的Perl模块复制到其他机器上?

时间:2010-04-21 11:57:17

标签: perl module cpan

作为Perl的新手而不是动态语言,我对如何不直接管理模块感到有些惊讶。

当然,cpan X在理论上确实有效,但我正在从三个不同的机器和操作系统(在工作中,在家里,在外部环境中测试)开发相同的项目。

  • 在工作中(Windows 7)我使用cpan时出现问题,因为我们的防火墙使ftp无法使用
  • 在家(Mac OS X)它可以正常工作
  • 在外部环境(Linux CentOs)中,它在下班后工作,因为我没有root访问权限,我必须配置cpan以非root用户身份运行
  • 我尝试过另一台可以访问的服务器。如果以前的外部环境是VPS,所以我有shell访问权限,另一个是廉价的共享主机,我无法安装新模块而不是预先安装的模块

目前我还无法在Windows下安装Template。我已经看到,作为一种替代方案,我可以编译它,我也尝试过ActiveState的PPM,但模块不存在。

现在,我的困惑在于Perl是一种动态语言。我在工作时遇到了所有这些问题,例如,在C中,我必须为所有平台编译所有库,但我认为使用Perl的方法与Python或PHP的方法非常类似。在目录中复制模块并导入模块的百分比只能起作用。

所以,我的问题是:如果Perl的模块是用Perl编写的,为什么复制/粘贴方法不起作用?如果必须编译某些(或部分)模块,如何在CPAN中查看模块是否仅为Perl还是依赖于编译库?是不是有办法下载模块(tar,zip ...)并使用cpan来部署它?这将解决我在Windows下的问题。

2 个答案:

答案 0 :(得分:10)

现在,Perl是一种动态语言,但这并不意味着人们编写的所有内容都可以跨平台移植。那不是语言的错。这甚至都不是程序员的错。有些东西,比如Win32::OLE,不适用于Unix。 :)

其他动态语言会遇到一些相同的问题。如果必须编译C代码,则无法仅将文件复制到另一台机器。某些发行版根据您的操作系统等配置代码略有不同。

即使您可以复制文件,也必须确保复制所需的所有文件。你知道特定模块需要的一切吗?请记住,他们中的许多人都有依赖关系。

您遇到的大部分问题与语言无关。你在使用这些工具时遇到了麻烦。如果您想要一个为您做出所有决定的零配置CPAN工具,请尝试cpanminus。这与你从cpan中获得的大致相同(尽管代码不同),但它会为你做出所有决定。它不会运行任何分发测试,而是安装到您的用户目录中。如果您需要可以控制的内容,请返回cpan

答案 1 :(得分:4)

  

在外部环境(Linux CentOs)中,它在下班后工作,因为我没有root访问权限,我不得不将cpan配置为以非root用户身份运行

这是有助于了解The Trick的时间之一。在这种情况下local::lib,它允许您在大约三分钟内配置非root安装区域和所有ENV变量。

  

如果perl的模块是用perl编写的,为什么复制/过去的方法不起作用?

有些是用Pure Perl编写的,但是很多都是用C语言编写的(使用Perl的XS API)来提高效率。

有时您最终会遇到JSON::XSJSON::PPJSON::Any等情况,以自动选择已安装的最佳状态。

  

是不是有办法下载模块(tar,zip ...)并使用cpan来部署它?

cpan程序就是从互联网上获取东西。您可以下载该软件包(在CPAN页面的右侧有一个“Download:CGI.pm-3.49.tar.gz”的链接),解压缩,然后

perl Makefile.PL
make
make install

您可能最好将cpan安装配置为仅使用HTTP源(在urllist配置选项中)。可能会在您的网络中create a mini CPAN mirror之前走得很远。