我需要运行我在HP unix / Solaris主机上的cygwin Windows上开发的Perl应用程序。我不是unix机器上的超级用户,我无法触摸默认的Perl模块位置,也无法将模块安装到默认的Perl模块位置。此外,unix安装缺少大多数基本模块,我无法改变它。
例如,我有一个需要Expect的Perl应用程序,它具有本机C编译的部分。如何将此应用程序推广到具有所需依赖项的unix,而无需在该框中安装任何其他内容?
有没有办法在Cygwin Windows下构建整个Perl应用程序,然后只将一个可执行文件推广到unix并从我的主目录运行它?
根据目前的答案添加EDIT:
Thanks in particular to brian,本地LIB目录解决方案似乎适用于本机Perl,但在Perl模块需要C组件的情况下,跨平台编译,即在cygwin上编译以在Solaris上运行,实际上是不可能的我担心。
然而,如果有其他Linux安装帮助,那么在不同版本的Unix之间这可能会更容易,比如在Linux上打包Perl然后部署到Solaris / HP?那些类似于lcc的东西呢?
此外,如果有人在Windows上推出了一个原生的Perl软件包,其中包含了一个复杂的Perl应用程序的所有依赖项,然后可以将其作为一个文件移动到unix,我还是希望听到更多信息? (我现在明白,如果包含在Expect.pm中的原生C代码,它将不起作用,但是如果app只使用纯perl模块呢?)
基本上由于很多原因,我试图最小化时间,我需要花费时间登录这些“生产”unix主机,并事先尽可能在本地做。
添加了一个新的交叉编译question,因为我觉得我可能偏离原来的perl问题太远了。
答案 0 :(得分:12)
在这种情况下,我会考虑使用自己的Perl提供完整的应用程序。您可以选择任何您喜欢的版本以及您喜欢的任何模块。编译所有内容,将所有内容组织到一个目录中,然后对结果进行tar。要部署,请复制文件并解压缩。使用其他人已经注意到的关于库搜索路径等的建议。实质上,您的应用程序有自己的堆栈。
现在,技巧就是交叉编译。你为什么要在Cygwin上开发?那也是目标吗?您是否有没有HP / UX或Solaris开发机器的原因?您的目标架构是什么(RISC,SPARC,英特尔等)。如果您无法获得硬件来运行这些硬件,请为您的目标获取一些虚拟机并在那里进行开发。
除此之外,您可以在任何有权限的地方安装模块。见perlfaq8:
答案 1 :(得分:3)
使用Cygwin在Windows上编译Perl脚本及其所有依赖项并运行它Solaris无法正常工作。
现在的问题是:您是否可以访问该Solaris计算机上的编译器?这不是因为您没有root访问权限,您无法使用以下命令在主目录中编译和安装Perl模块:
perl Makefile.PL PREFIX=$HOME
如果Solaris系统上有CPAN,则可以通过以下方式在CPAN shell中设置前缀:
perl -MCPAN -e shell
; conf makepl_arg PREFIX=/path/to/your/home/directory
要运行脚本,您可以使用-I $HOME
命令行开关启动perl,例如:
perl -I $HOME script.pl
您的另一个选择是将其置于脚本的开头
use lib $ENV{'HOME'};
答案 2 :(得分:3)
我没有尝试过这个特殊功能,但perl2exe表示它支持跨平台构建。
答案 3 :(得分:2)
将环境变量PERLLIB
设置为个人Perl lib目录,或使用-I命令行切换到Perl以指示它。
如果您有权访问HP-UX计算机,则可以在那里编译Expect并将其安装在您的目录中。但是从Windows到HP-UX的交叉编译可能太多更难。你必须构建一个GCC交叉编译器。
答案 4 :(得分:2)
如果你的每个系统都有一个编译器(以及像grep这样的configure所需的其他工具),你不仅应该能够编译模块,而且还应该能够构建自己的perl可执行文件。
答案 5 :(得分:2)
你需要local::lib。完成后,纯Perl模块应该跨平台工作,但您必须在外部平台上识别并重新安装已编译的模块。在真正的unix上进行初始安装,cygwin上的cpan很慢。
答案 6 :(得分:2)
我在我的工作系统上遇到过这种情况。我们有一个Perl 5.8的基本安装,我没有能力添加模块。这是我使用的解决方案:
您的代码应该执行以下操作:首先,使用已正常安装的任何模块,然后取消移动@INC环境变量以使用本地库:
# Declare Includes --------------------------------------------------------------------------------
use Getopt::Long;
use vars qw($VERSION);
use DirHandle;
use FileHandle;
# Force perl to use our local 'lib' directory for imported modules, this allows us to
# use modules without having to install them in th emain perl assembly. However, this
#also prevents these modules from being used in other projects.
BEGIN { unshift @INC, "lib"; }
use Error qw(:try);
use SOAP::Transport::HTTP;
#use LWP::Protocol::https;
use XML::Simple;
use XML::Writer;
use XML::Writer::String;
对此方法的警告是,一些Perl模块不使用'lib'方法或具有其他依赖项。如果遇到问题,请检查模块的Makefile.PL并查看它正在做什么。