在极其受限制的环境中安装基于perl的Web应用程序

因为我和@ikegami有很长的一系列评论,所以我清理了这个问题,希望它更容易理解.不幸的是,英语不是我的“主要”语言. 🙁

比方说,有一个环境:

>没有安装任何开发工具(没有make,也没有gcc等)
> perl与其核心软件包一起安装,仅此而已
>不允许传出网络访问 – 例如用户无法使用curl或cpan来下载/安装perl依赖项
>用户甚至没有管理员(root)权限
>但是想要安装和评估一些基于perl的web-app,我们称之为MyApp

MyApp

>不使用任何基于XS的模块. (至少,我希望 – 在开发中我使用plenv和cpanm,所以从来没有深入检查过安装的依赖项)
>它是一个纯PSGI应用程序,简单的plackup app.psgi工作正常
>该应用程序使用一些应包含在“部署”中的数据文件.

主要问题是:如何准备MyApp和所有使用过的CPAN模块,以便在这种受限制的环境中轻松安装?

目标是:

>我不需要节省我的努力和时间
>但我希望节省用户的时间,并希望最大限度地减少他所需的操作,因此安装(部署)应该尽可能简单.

例如.如何以最少的(他的)步骤将正在运行的web-app运送到用户的机器上.
– 最简单的事情可能是:
   – 复制一个文件(zip或tarbal)
   – 打开包装
   – 从终端执行解压缩目录中的一些run.pl.

为了实现上述简单安装,我的想法如下:

1.)创建一个tarball,在解压缩后将包含3个文件夹和1个perl脚本,让我们说:

myapp_repo/
myapp_repo/distlib   #will contain all MyApp's perl modules also ALL used CPAN modules and their dependecies
myapp_repo/datafiles #will contain app-specific data files and such
myapp_repo/install.pl
myall_repo/lib   #will contain modules directly used by the `install.pl`

2.)我将开发一个install.pl脚本,它将用作安装程序工具,如

perl install.pl new /path/to/app_root

它会(应该):

>在/ path / to / app_root下创建所有需要的目录(尤其是将安装perl模块的lib)
>将在内部调用“local”cpanm(来自myapp_repo / lib),仅使用distlib中的分发文件来安装应用程序的perl模块及其CPAN依赖项.
>将生成并将所需的运行时脚本和app.psgi安装到/ path / to / app_root / bin中
>将为应用程序安装所需的数据文件.

3.)因此,在此之后用户应该能够简单地运行:

/path/to/app_root/bin/plackup /path/to/app_root/bin/app.psgi

简而言之,用户应该使用:

>系统范围的perl和系统范围的perl-core模块
>和任何其他

>运行时perl脚本(如plackup)
>和所需的CPAN模块

>应仅使用文件(无网络访问)安装到自包含目录树.

例如. install.pl应该在内部调用cpanm来实现以下cpanm命令(等效)

cpanm --mirror file://path/to/myapp_repo/distlib --mirror-only My::App

哪个,应该只使用myapp_repo / distlib中的文件安装My :: App和所有依赖项而无需网络访问

一些问题:

>可以在没有make的情况下使用cpanm(称为本地安装的模块)吗?
>为了创建myapp_repo / distlib,我考虑使用Pinto.它是否是实现上述目标的正确工具?
>忘记了什么?或者换句话说:
>以上是可行的(阅读:工作)方式吗?
>是否有任何其他工具,我可以/应该使用它来简化这种分发tarball的创建?

@ikegami建议一些方法:
– 在我的机器上的一个新目录中“安装所有内容”
– 将此自包含目录传输到目标计算机

这听起来非常好,因为这个目录也可以包含所有需要的特定于应用程序的数据文件,遗憾的是,我不明白他的解决方案应该如何完成的细节.

FatPacked解决方案看起来也很有趣 – 需要了解它.

最佳答案 不要编写自己的品牌或安装程序.只需从不同的机器上复制它(无论如何,这基本上就是apt / yum / etc所做的,即使你自己编写也必须要做的事情).你可以在5分钟内使用cpan!

此外,这应该允许您在需要时安装gcc(例如安装XS模块),尽管听起来不像你那样.如果您确实安装了gcc,我会安装自己的perl以避免处理PERL5LIB.

诸如minicpan之类的工具将允许您从CPAN安装任何模块而无需访问Internet.当然,如果镜像您需要的软件包,您可以继续使用已经使用它的命令.

以上解释了如何简单快速地设置机器,以便它可以使用cpan,从而轻松安装任何模块.

如果您只想安装特定模块及其依赖项,则可以完全避免在目标计算机上使用cpan.首先,您需要全新安装Perl(最好与目标系统上的版本相同).然后,只需将模块安装到机器上的新目录上,然后将该目录传输到目标机器.而已;没有别的事情需要做.如果两台机器足够相似,这甚至适用于XS模块.

这就是ppm(ActiveState的Perl包管理器)所做的事情.

不幸的是,虽然这个解决方案几乎和上面那个一样简单,但它不是那么灵活,它不会运行正在安装的模块的测试套件等.它确实具有不需要传输任何二进制文件的优点(如果你没有安装任何XS模块).

点赞