12

我需要在 HP unix / Solaris 主机上运行我在 cygwin Windows 上开发的 Perl 应用程序。我不是 unix 机器上的超级用户,我无法触及默认的 Perl 模块位置,也无法将模块安装到默认的 Perl 模块位置。此外,unix 安装缺少最基本的模块,我无法更改。

例如,我有一个需要Expect的 Perl 应用程序,它具有本地 C 编译部分。我如何将这个应用程序推出到 unix 及其所需的依赖项,而不必在那个盒子上安装任何其他东西?

有没有办法在 Cygwin Windows 下构建整个 Perl 应用程序,然后将一个可执行文件推出到 unix 并从我的主目录运行它?


根据迄今为止的答案编辑添加:

特别感谢 brian,本地 LIB 目录解决方案似乎适用于本机 Perl,但在 Perl 模块需要 C 组件的情况下,跨平台编译,即在 cygwin 上编译以在 Solaris 上运行,实际上是不可能的,因为我担心.

但是,是否有其他 linux 安装帮助,即这在不同风格的 Unix 之间是否可能更容易,例如 linux 上的 Perl 包,然后部署到 Solaris/HP?像lcc这样的东西呢?

另外,如果有人在 Windows 上推出了一个本地 Perl 包,其中包含复杂 Perl 应用程序的所有依赖项,然后可以将其作为一个文件移动到 unix,我仍然希望听到更多信息?(我现在明白,如果像 Expect.pm 中那样包含原生 C 代码,它将无法工作,但是如果应用程序仅使用纯 perl 模块呢?)

基本上出于多种原因,我试图尽量减少登录这些“生产”unix 主机所需的时间,并尽可能多地事先在本地进行操作。


添加了一个新的交叉编译问题,因为我觉得我可能偏离了原来的 perl 问题太远了。


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

4

7 回答 7

12

在这种情况下,我会考虑提供一个完整的应用程序,其中包含它自己的 Perl。你可以选择你喜欢的任何版本和你喜欢的任何模块。编译所有内容,将所有内容组织到一个目录中,然后对结果进行 tar。要部署,请复制文件并解压缩。使用其他人已经注意到的关于库搜索路径等的建议。本质上,您的应用程序有自己的堆栈。

现在,诀窍是交叉编译。为什么要在 Cygwin 上开发?这也是目标吗?您没有 HP/UX 或 Solaris 开发机器是有原因的吗?您的目标是什么架构(RISC、SPARC、英特尔等)。如果您无法获得运行这些硬件的硬件,请为您的目标获取一些虚拟机并在那里进行开发。

除此之外,您可以在任何有权限的地方安装模块。见perlfaq8

于 2009-02-20T22:35:38.737 回答
3

使用 Cygwin 在 Windows 上编译一个 Perl 脚本及其所有依赖项并在 Solaris 上运行它是行不通的。

现在的问题是:您可以访问那台 Solaris 计算机上的编译器吗?这并不是因为您没有 root 访问权限,因此您无法通过以下方式在您的主目录中编译和安装 Perl 模块:

perl Makefile.PL PREFIX=$HOME

如果您的 Solaris 系统上有可用的 CPAN,您可以通过以下方式在 CPAN shell 中设置前缀:

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

为了让您的脚本运行,您可以使用-I $HOME命令行开关启动 perl,例如:

perl -I $HOME script.pl

您的另一个选择是将其放在脚本的开头

use lib $ENV{'HOME'};
于 2009-02-20T19:09:19.637 回答
3

我还没有尝试过这个特殊功能,但是perl2exe说它支持跨平台构建。

于 2009-02-20T21:38:36.783 回答
2

将您的环境变量设置PERLLIB为您的个人 Perl lib 目录或使用 -I 命令行切换到 Perl 来指示它。

如果您可以访问 HP-UX 机器,您可以在那里编译 Expect 并将其安装在您的目录中。但是从 Windows 到 HP-UX 的交叉编译可能要困难得多。您必须构建一个 GCC 交叉编译器。

于 2009-02-20T18:47:52.997 回答
2

如果您在每个系统上都有一个编译器(以及配置所需的其他一些工具,例如 grep),那么您不仅应该能够编译模块,而且还应该能够构建自己的 perl 可执行文件。

于 2009-02-20T21:09:03.487 回答
2

你会想要local::lib。完成后,纯 Perl 模块应该可以跨平台工作,但您必须在外部平台上识别并重新安装已编译的模块。在真正的 unix 上进行初始安装,cygwin 上的 cpan 很慢。

于 2009-02-20T21:57:24.913 回答
2

我在我的工作系统上遇到过几次。我们有 Perl 5.8 的基本安装,但我无法添加模块。这是我使用的解决方案:

  1. 在项目根目录中创建一个名为“lib”的文件夹(例如:~/projects/MyProject/lib)
  2. 您从 CPAN 下载的任何模块都应该有一个 Makefile 以及一个名为“lib”的目录。将 lib 文件夹的内容复制到新创建的 lib 文件夹中。一些模块可能只包含一个 .pm 文件,没有 lib 结构。只需复制 .pm 文件。

您的代码应该执行以下操作:首先,使用已正常安装的任何模块,然后取消转换 @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 并查看它在做什么。

于 2009-02-20T22:53:10.380 回答