fpm 构建 Solaris SRV4 软件包(solaris 输出格式)完全指南
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),仅供参考

相关新闻

Java Swing数独游戏工程级实现与难度控制

Java Swing数独游戏工程级实现与难度控制

简介:本资源是一份面向Java初学者与课程设计实践者的完整数独小游戏开发项目,适用于高校Java程序设计、GUI编程或软件工程类课程作业参考。项目基于Swing构建图形界面,代码结构清晰,涵盖游戏逻辑、难度生成、用户交互及资源管理等…

2026/9/23 18:38:49 阅读更多 →
Fedora开发环境避坑指南:保姆级教程解决常见报错

Fedora开发环境避坑指南:保姆级教程解决常见报错

Fedora开发环境避坑指南:保姆级教程解决常见报错 盯着屏幕上一片红色的StackTrace,是不是感觉脑子瞬间宕机?刚把Fedora装好,连个Python环境都跑不通,报错信息长得像天书,根本不知道从哪下手。别慌,这份保姆级教程就是为你…

2026/9/23 18:38:49 阅读更多 →
基于 TVM 编译栈的 WebAssembly 独立深度学习推理:wasm-standalone 项目实战解析

基于 TVM 编译栈的 WebAssembly 独立深度学习推理:wasm-standalone 项目实战解析

编译器深度学习模型优化 【免费下载链接】tvm Open deep learning compiler stack for cpu, gpu and specialized accelerators 项目地址: https://gitcode.com/gh_mirrors/tvm7/tvm 点击查看 免费下载 本文围绕仓库中的 apps/wasm-standalone 实验性项目&#xff…

2026/9/23 18:38:48 阅读更多 →

最新新闻

Surface Duo刷机教程:fastboot与EDL救砖全流程详解

Surface Duo刷机教程:fastboot与EDL救砖全流程详解

简介:面向不熟悉官方文档、希望给微软Surface Duo刷机却无从下手的普通用户,这份教程用口语化讲解替代复杂术语,把“小白”最常卡住的环节拆开说明。内容没有停留在转载官方步骤,而是围绕真实操作补足了细节:刷机前如何…

2026/9/23 20:41:00 阅读更多 →
AI生成代码安全审查:三条信任边界与实操方法

AI生成代码安全审查:三条信任边界与实操方法

1. 为什么“看代码对不对”在 AI 生成场景下已经不够用了过去几年我参与过不少代码审查,传统模式下大家习惯盯的是语法、逻辑、边界条件、异常处理这些点。但自从团队开始大规模用 AI 辅助生成代码之后,我发现一个很明显的转变:代码本身“看起…

2026/9/23 20:41:00 阅读更多 →
技术分享:GBase 8s数据库启动服务基础说明

技术分享:GBase 8s数据库启动服务基础说明

南大通用GBase 8s数据库(gbase database)服务器启动基础说明完成 GBase 8s安装与基础配置后,还有一系列基础运维任务需要落地,包含准备应用连接、启动数据库、初始化磁盘空间、创建存储空间,配置备份恢复以及日常管理维…

2026/9/23 20:41:00 阅读更多 →
WAS8.5静默安装实战:imcl命令与节点联邦配置全解析

WAS8.5静默安装实战:imcl命令与节点联邦配置全解析

简介:面向WebSphere Application Server运维与实施人员的WAS 8.5静默安装及补丁升级完整步骤文档,覆盖Linux环境下安装包准备、目录结构规划、Installation Manager与WAS 8.5.5静默安装、管理概要与应用概要创建、Web管理控制台启动、Node节点配置&#…

2026/9/23 20:41:00 阅读更多 →
ramsey/uuid 安全漏洞披露政策(VDP)全解析:Scope 范围、Safe Harbor 条款与 PGP 加密上报流程

ramsey/uuid 安全漏洞披露政策(VDP)全解析:Scope 范围、Safe Harbor 条款与 PGP 加密上报流程

ramsey/uuid 安全漏洞披露政策(VDP)全解析:Scope 范围、Safe Harbor 条款与 PGP 加密上报流程 【免费下载链接】uuid :snowflake: A PHP library for generating universally unique identifiers (UUIDs). 项目地址: https://gitcode.com/g…

2026/9/23 20:41:00 阅读更多 →
Java企业报销系统实战:Spring Boot+Flowable流程驱动开发

Java企业报销系统实战:Spring Boot+Flowable流程驱动开发

简介:本资源是一套完整的Java毕业设计项目——企业报销管理系统,面向计算机专业本科生及Java初学者,聚焦办公自动化场景,解决传统纸质报销流程效率低、信息难共享、审批难追溯等实际问题。压缩包共206个文件,含109个编…

2026/9/23 20:40:00 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →