使用PAR公布Perl应用

使用PAR发布Perl应用

PAR简介

PAR相当于Perl的Jar。使用PAR可以把模块(包括跨平台的pm及XS本地代码)及资源文件打包在一起,方便应用的发布。传统的Perl应用发布是将模块装到预定义的系统级目录中去,比如,vendor perl, site perl等位置。对于单个应用而言,将其所需的文件散落到不同的系统目录下不利于管理。主要的弊病有:

  • 因为应用依赖于特定版本的第三模块,当安装在系统级目录中的这些模块升级可能导致应用无法使用
  • 升级不方便,系统目录一般需要root权限才能更新
  • 商业应用保护源码不方便

PAR可以将整个应用包括Perl编译器,核心库,应用本身的模块和第三模块统统打包在一个可执行文件中,彻底隔离了系统级模块升级带来的影响。这大大方便了应用在目标机器上的安装。

PAR打包实例

使用PAR打包先要安装Par::Packer模块,该模块包含了一个pp的命令行工具用来进行打包。pp可以产生普通的par文件,也可以生成可执行程序。生成可以在没有安装Perl的目标机器上执行的程序,用-o选项,最后的参数是要包装的.pl程序。pp会自动扫描应用依赖的所有模块,对于那些被应用动态加载的模块,打包时要用-M选项明确指定。对于那些应用明确不会使用但被自动扫描出来的模块,可以用-X选项排除。以下是个完整的例子:

pp -o cvc                            \
   -vvv                              \
   -M backout.pl                     \
   -M passwd.pl                      \
   -X DBD::SQLite                    \
   -X DBD::DBM                       \
   -X DBD::ExampleP                  \
   -X DBD::File                      \
   -X DBD::Gofer                     \
   -X DBD::Gofer::Policy             \
   -X DBD::Gofer::Transport          \
   -X DBD::NullP                     \
   -X DBD::Sponge                    \
   -X DBD::Gofer::Policy::Base       \
   -X DBD::Gofer::Policy::classic    \
   -X DBD::Gofer::Policy::pedantic   \
   -X DBD::Gofer::Policy::rush       \
   -X DBD::Gofer::Transport::Base    \
   -X DBD::Gofer::Transport::null    \
   -X DBD::Gofer::Transport::pipeone \
   -X DBD::Gofer::Transport::stream  \
      cvc.pl

RPM封装

将PAR包装的可执行程序再用RPM封装可以利用RPM的软件包管理系统方便应用的分发。但是,在RPM构建过程中RPM的自动剥离ELF可执行文件冗余内容的功能会错误地把pp打包的模块去除掉,导致应用不完整。所以,在spec文件中必须禁止自动剥离功能(strip)。具体办法是在spec文件头加上:

 %define __os_install_post %{nil}

 这个语句使得以下自动剥离功能失效:

brp-compress
brp-strip
brp-strip-static-archive
brp-strip-comment-note