fpm 构建 Solaris SRV4 软件包solaris 输出格式完全指南【免费下载链接】fpmEffing package management! Build packages for multiple platforms (deb, rpm, etc) with great ease and sanity.项目地址: https://gitcode.com/gh_mirrors/fp/fpm导读本文讲解 fpm 项目中solaris包输出格式的使用方法与底层实现它面向旧版 Solaris 7/8/9/10 的 SRV4 包格式即通常以SUNW为前缀、文件名以.pkg结尾的包支持将deb、dir、npm等任意输入源转换为可在 Solaris 系统上安装的原生软件包。读完本文你将掌握solaris格式的适用范围、专用命令行参数、从目录/现有包转换的完整操作流程以及 fpm 如何通过pkgproto、pkgmk、pkgtrans工具链生成合法 SRV4 包的原理。solaris 包格式与适用场景根据 docs/packages/solaris.rst 的说明solaris指的是Solaris SRV4 包格式System V Release 4 packaging format它主要出现在较老的 Solaris 版本中——Solaris 7、8、9 和 10。这类包有一些容易识别的特征包名通常带有SUNW 前缀例如SUNWfoo交付文件通常以.pkg作为扩展名。需要注意的是该格式并非适用于所有 Solaris 系系统。如果你正在使用Solaris 11、OpenSolaris 或 Illumos官方文档明确建议改用更新的包格式p5pSolaris Image Packaging System / IPS相关内容见 p5p 文档。从 fpm 的支持矩阵看见 getting-startedsolaris与deb、rpm、freebsd、osxpkg、pacman、puppet、p5p、sh、tar、zip等并列是 fpm 可直接输出的目标包类型之一。fpm 对 solaris 的支持方式仅作为输出类型原文档明确说明了一个关键约束fpm supports usingsolarisonly as an output type. This means you can createsolarispackages from input types likedeb,dir, ornpm.即fpm 只支持把solaris当作目标输出类型不支持把 Solaris 包当作输入源来解析读取。这意味着你可以从deb包转换出.solaris包从dir目录/文件直接构建.solaris包从npm包转换出.solaris包同理gem、python、cpan等 fpm 支持的输入类型理论上都可作为源getting-started 中的通用示例也印证了这一点见 docs/getting-started.rst。用命令表示即为-t solarisfpm -s dir -t solaris /path/to/your/files fpm -s deb -t solaris some-package.deb fpm -s npm -t solaris npm-package-name对应地命令行参考文档 docs/cli-reference.rst 也把solaris列为独立的输出类型条目。solaris 专用命令行参数solaris 输出类型带有一组专属的 CLI 参数见 docs/packages/cli/solaris.rst 与 docs/cli-reference.rst参数说明默认值--solaris-group GROUP在 prototype原型文件中将文件属组设为 GROUProot--solaris-user USER在 prototype 文件中将文件属主设为 USERroot这两个参数在源码 lib/fpm/package/solaris.rb 中有对应的声明实现option --user, USER, Set the user to USER in the prototype files., :default root option --group, GROUP, Set the group to GROUP in the prototype file., :default root注意fpm 的命令行解析会自动为包类型专属参数加上--solaris-前缀因此源码中的--user/--group在用户侧暴露为--solaris-user/--solaris-group。它们的默认值都是root即默认情况下包内所有文件归属root:root。如果你希望包内文件在安装后属于其他用户例如服务运行账号就需要显式传入这两个参数。用法示例fpm -s dir -t solaris \ --solaris-user myapp \ --solaris-group myapp \ --prefix /opt/myapp \ /path/to/myapp这两个参数会直接影响生成的Prototype文件中每个文件条目的 user/group 字段见下文“Prototype 文件生成”一节。实战从目录构建 Solaris 包以最常见的dir源为例把本地目录内容打包成 Solaris SRV4 包fpm -s dir -t solaris \ -n SUNWmyapp \ -v 1.0.0 \ --prefix /usr/local \ --solaris-user myapp \ --solaris-group myapp \ ./build-output/关键点说明-n指定包名对应 pkginfo 中的PKG/NAME字段SRV4 惯例建议使用SUNW前缀-v指定版本号--prefix决定文件在目标系统上的安装根路径——这点很重要因为源码实现见下文会把staging_path/#{prefix}作为pkgproto的输入根包内文件的默认属主/属组由--solaris-user/--solaris-group控制。转换现有包也很直接例如把某个 deb 包转成 Solaris 格式fpm -s deb -t solaris some-package.debfpm 会自动从源包中提取名称、版本、架构、描述、维护者等信息再以 solaris 格式输出。输出文件命名规则如果未通过-p显式指定输出文件名fpm 会按照 lib/fpm/package/solaris.rb 中的default_output方法自动生成文件名def default_output v version v #{epoch}:#{v} if epoch if iteration #{name}_#{v}-#{iteration}_#{architecture}.#{type} else #{name}_#{v}_#{architecture}.#{type} end end规则可以概括为有 iteration发布号时name_version-iteration_arch.solaris无 iteration 时name_version_arch.solaris若设置了 epoch版本号会以epoch:version形式出现。例如fpm -s dir -t solaris -n SUNWhello -v 1.0 --iteration 1 ...会生成SUNWhello_1.0-1_x86_64.solaris架构具体值取决于目标机器见下文。架构的确定方式Solaris 包的ARCH字段在 architecture 方法 中处理def architecture case architecture when nil, native architecture %x{uname -p}.chomp end return architecture end即当你没有显式传入--architecture或传入了native时fpm 会在构建机上执行uname -p获取当前平台架构作为包架构如果你显式指定了其他架构值则原样保留。源码注释还提到根据 Solaris 打包资料bolthole.com 的 makeapackage 指南all也是一个合法的架构值。因此跨架构构建时可以在构建机上显式指定--architecture all适用于纯脚本/数据包或目标架构名。底层实现SRV4 包是如何生成的fpm 的 solaris 输出实现集中在 lib/fpm/package/solaris.rb 的output方法配合模板 templates/solaris.erb 以及 Solaris 自带的pkgproto、pkgmk、pkgtrans三个系统命令完成。整体流水线如下1. 处理安装/卸载脚本fpm 允许为包附加脚本--before-install、--after-install、--before-remove、--after-remove等。在 solaris 输出路径中脚本按如下规则处理pre-install对应--before-install复制为preinstall并设置 0755 权限post-install对应--after-install复制为postinstall并设置 0755 权限pre-uninstall不被 SRV4 格式支持fpm 会直接抛出FPM::InvalidPackageConfiguration异常post-uninstall同样不被支持抛出异常。when pre-uninstall raise FPM::InvalidPackageConfiguration.new( pre-uninstall is not supported by Solaris packages )这意味着如果你尝试用--before-remove/--after-remove构建 solaris 包fpm 会明确报错拒绝而不是静默忽略。2. 生成 pkginfo 元数据文件fpm 使用 ERB 模板 templates/solaris.erb 生成 SRV4 包必需的pkginfo文件写入构建目录build_path中。该模板产出的关键字段包括CLASSESnone TZPST PATH/sbin:/usr/sbin:/usr/bin:/usr/sadm/install/bin BASEDIR/ PKG% name % NAME% name % ARCH% architecture % VERSION% version %% iteration - iteration.to_s % CATEGORYapplication DESC% description.split(\n).first[0..255] or no description given % VENDOR% maintainer % EMAIL% (maintainer[/./] or maintainer).gsub(/[]/, ) %这些字段的含义与细节PKG/NAME包名取自 fpm 的name参数ARCH包架构见上文 architecture 逻辑VERSION版本号若设置了 iteration 则追加-iteration后缀CATEGORY固定为applicationDESC取description的第一行并截断到256 字符符合 pkginfo(4) 的格式限制没有描述时回退为no description givenVENDOR维护者信息EMAIL从维护者字符串Foo barbaz.com中提取邮箱部分去掉尖括号若维护者字符串不含邮箱则原样保留。3. 生成 Prototype 文件SRV4 打包流程需要一份Prototype文件列出包内所有内容条目。fpm 的实现solaris.rb先写入控制文件条目prototype.puts(i pkginfo) prototype.puts(i preinstall) if self.scripts[pre-install] prototype.puts(i postinstall) if self.scripts[post-install]然后用 Solaris 自带的pkgproto命令扫描安装内容并生成文件条目IO.popen(pkgproto #{staging_path}/#{prefix}).each_line do |line| type, klass, path, mode, user, group line.split prototype.puts([type, klass, path, mode, attributes[:solaris_user], attributes[:solaris_group]].join( )) end这里有一个值得注意的细节代码先strip prefix再调用pkgproto因为BASEDIR会通过 pkginfo 文件设定安装前缀随后将pkgproto输出的每一行中的 user/group 替换为--solaris-user/--solaris-group指定的值——这正是这两个 CLI 参数实际生效的位置。整个构建过程使用attributes[:solaris_user]与attributes[:solaris_group]读取这两个属性。4. 调用 pkgmk 与 pkgtrans 产出最终包文件清单就绪后fpm 依次调用两个 Solaris 系统命令完成打包::Dir.chdir staging_path do # Should create a package directory named by the package name. safesystem(pkgmk, -o, -f, #{build_path}/Prototype, -d, build_path) end # Convert the package directory built above to a real solaris package. safesystem(pkgtrans, -s, build_path, output_path, name) safesystem(cp, #{build_path}/#{output_path}, output_path)pkgmk -o -f Prototype -d build_path依据 Prototype 文件在构建目录中生成一个以包名命名的“包目录”-o覆盖已有同名包pkgtrans -s build_path output_path name把包目录转换为真正的 SRV4 可传输包文件-s表示 source 是目录形式最后再复制到指定的输出路径。由此可以推断构建 solaris 包的环境必须预装 Solaris 的pkgproto、pkgmk、pkgtrans工具它们是 Solaris 基础系统的一部分因此实际构建通常应在 Solaris或兼容这些工具的 illumos 等系统上进行。与其他包格式的对比与选择建议目标系统是Solaris 7 / 8 / 9 / 10使用-t solaris输出 SRV4 包.pkgSUNW 前缀目标系统是Solaris 11 / OpenSolaris / Illumos官方文档建议改用-t p5pIPS 格式详见 docs/packages/p5p.rst两者都只是 fpm 的输出类型fpm 不做反向解析从其他格式deb/rpm/npm/gem 等向这两种格式的转换都可以直接通过-s src -t solaris|p5p完成。总结fpm 的solaris输出类型为在旧版 Solaris7/8/9/10上分发软件提供了低门槛方案你不需要手工编写 pkginfo 和 Prototype只需fpm -s dir -t solaris或从 deb/npm 等转换fpm 便会自动完成元数据生成、pkgproto文件清单扫描、pkgmk打包与pkgtrans转换的全流程。需要自定义包内文件属主/属组时使用--solaris-user与--solaris-group跨架构构建时注意用--architecture显式指定all或具体架构同时记住pre-uninstall/post-uninstall脚本在 SRV4 格式下不受支持。若面向更新的 Solaris 11 / Illumos 平台则应转向 p5p 格式。【免费下载链接】fpmEffing package management! Build packages for multiple platforms (deb, rpm, etc) with great ease and sanity.项目地址: https://gitcode.com/gh_mirrors/fp/fpm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考