当我无法在目标主机上安装模块时,如何创建便携式perl?

时间:2009-02-20 18:41:55

标签: perl cross-platform cygwin solaris

我需要运行我在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问题太远了。


编辑 - Par看起来很有希望用于纯Perl,虽然同样的交易,但它并不寻求解决原生扩展的跨平台编译问题

7 个答案:

答案 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中设置前缀:

  1. 启动shell perl -MCPAN -e shell;
  2. 使用conf makepl_arg PREFIX=/path/to/your/home/directory
  3. 更改前缀

    要运行脚本,您可以使用-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的基本安装,我没有能力添加模块。这是我使用的解决方案:

  1. 在您的帐户中创建一个名为'lib'的文件夹 项目根(例如: 〜/ projects / MyProject / lib)
  2. 任何 您从CPAN下载的模块 应该有一个Makefile以及一个 名为“lib”的目录。将lib文件夹的内容复制到新创建的lib文件夹中。某些模块可能只包含一个.pm文件,并且没有lib结构。只需复制.pm文件。
  3. 您的代码应该执行以下操作:首先,使用已正常安装的任何模块,然后取消移动@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并查看它正在做什么。