Mac打包Unix可执行文件为pkg
Mac打包Unix可执行文件为pkg
方式一:通过packages页面打包
1.下载packages app
- Distribution:自定义化更高,包括修改安装页面的内容提示
我这里主要演示Distribution模式的项目:通过unix可执行文件+postinstall.sh脚本实现通过mac的pkg安装系统服务

2.点击new project,创建新项目

3. 设置project version等信息
一个 project 可以对应多个 packages,这里我们先修改 package 信息,后面修改全局的 project 信息。

可以设置安装完成后,是否重启应用、退出用户

4. 在packages的payload里添加unix文件
在payload 添加需要安装的文件
选中 contents 里面的文件夹,然后选择下面的+ 按钮,即可添加文件到指定位置。
- 因为我需要将unix打包到pkg文件里,所以这里点击+按钮,将我本地文件添加到对应目录
文件可以添加到这个目录树下的任意地方。
这是我添加了之后的效果。
5. 添加 pre-install 脚本、post-install 脚本
- preinstall:针对单程序安装包(pkg),该脚本会在preflight脚本运行之后运行;针对多程序安装包(mpkg),该脚本会在用户按下Install铵钮后执行,只会在用户第一次安装该程序时执行。
- postinstall:该脚本在程序安装完之后才运行。
因为我pkg安装包执行后会将unix文件安装到Application下,所以我这里直接在post-install脚本里以sudo方式运行即可:
postinstall.sh:
#!/bin/bash
sudo /Applications/ziyi_darwin_arm64# 记录日志到指定文件
echo "postinstall.sh executed at $(date)" >> /var/log/postinstall.logexit 0

6. 设置安装页面介绍文案presentation


7. build项目,打包pkg
选中Build-点击Build And Run:

然后就弹出了安装页面,至此大工搞成:

我们打包好的pkg文件默认放在了~/项目名/build目录下

访问服务接口,可以看到服务已经安装成功:

方式二:通过pkgbuild命令打包
pkgbuild的所有参数如下:-root:指定要打包的文件夹的路径。-identifier:指定包的标识符(ID)。-install-location:指定安装包的安装位置。-scripts:指定安装前后脚本文件的路径。-version:指定包的版本号。-sign:指定签名文件的路径,以进行安全签名。-keychain:指定要用于签名的钥匙链。-timestamp:指定时间戳服务器的URL,用于验证签名。-verbose:显示详细信息。-nopayload:仅创建空载荷。-filter:指定要包含或排除的文件和文件夹。-template:指定要使用的pkgproj模板文件的路径。sudo pkgbuild --root /Users/ziyi2/GolandProjects/ziyi/build --identifier com.test.pkg.project --version 1.0.1 --install-location /tmp/ziyi_pkg --scripts /Users/ziyi2/scripts /Users/ziyi2/Desktop/project.pkg
# --root /Users/ziyi2/GolandProjects/ziyi/build:指定要打包的文件夹
# --install-location /tmp/ziyi_pkg 指定安装包的安装位置(tmp目录,默认如果文件超过3天没人访问则被删除)
# --scripts /Users/ziyi2/scripts 指定preinstall、postintall脚本所在文件夹(在安装前、安装后执行的脚本)
#### 注意:脚本文件名必须为:preinstall、postintall且有可执行权限
相关文章:
Mac打包Unix可执行文件为pkg
Mac打包Unix可执行文件为pkg 方式一:通过packages页面打包 1.下载packages app Distribution:自定义化更高,包括修改安装页面的内容提示 我这里主要演示Distribution模式的项目:通过unix可执行文件postinstall.sh脚本实现通过ma…...
C++ 模拟散列表 || 哈希表存储与查询,模版题(拉链法)
维护一个集合,支持如下几种操作: I x,插入一个整数 x ; Q x,询问整数 x 是否在集合中出现过; 现在要进行 N 次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N ,…...
详解Skywalking 服务Overview页面的参数含义(适合小白)
本文针对刚刚接触skywalking的同学,重点讲解服务Overview页面中各个参数的含义,为大家快速上手skywalking会起到帮助作用! 最重要的三个指标 Service Apdex(数字):当前服务的评分 Successful Rate(数字&a…...
Android studio GridView应用设计
一、xml布局文件设计: <GridViewandroid:id="@+id/gridView"android:layout_width="match_parent"android:layout_height="match_parent"tools:layout_editor_absoluteX="1dp"tools:layout_editor_absoluteY="1dp"andr…...
K8s 是如何完成调度和权重调整?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、调度流程二、kuble-scheduler 调度原理1 kubernetes 1.23版本调度器filter阶段和score阶段源码分析2 修改调度器插件默认权重示例2.1 环境准备2.2 调整Inte…...
计算机毕业设计----Springboot超市订单管理系统
项目介绍 该超市订单管理毕业设计基于jdk8版本开发,在部署时需要使用jdk8以上的版本。使用了目前流行的框架组合springbootmybatis的框架技术, 实现了供应商管理对供应商实现增删改查、订单管理对超市订单实现增删改查、用户管理等功能,适用…...
如何给AI下达精准的指令,哪些提示词对于AI是有效的?
刚上手那会,我倾向于将 prompt 翻译为“指令”,但这并不精确。“指令”通常对应instructions,属于 prompt 中的纯指令部分,通常是一个动宾结构(做什么)。剩下的部分更多是描述(describe…...
软件外包资源网站分享
经济不景气导致很多人失业,能否找到一份工作或找些项目做做,这里列了一些国内和国外的资源网上,希望对大家有益: 国内篇: 软件项目交易网:(软件项目交易网)这是一个专注于软件开发需求的外包平台…...
在控制理论里,单个输入变量被施加了饱和特性处理,那么后续怎么利用李雅普诺夫判据判断系统稳定性呢?
在控制理论中,当一个系统的输入变量被施加了饱和特性(即输入被限制在某个范围内),系统的稳定性分析可能变得更复杂。使用李雅普诺夫方法判断这样的系统稳定性通常需要考虑非线性特性。下面是如何使用李雅普诺夫方法进行稳定性分析…...
MySQL夯实之路-查询性能优化深入浅出
MySQL调优分析 explain;show status查看服务器状态信息 优化 减少子任务,减少子任务执行次数,减少子任务执行时间(优,少,快) 查询优化分析方法 1.访问了太多的行和列࿱…...
UniApp面试题
面试题1 问:什么是 UniApp?它有哪些特点? 答:UniApp 是一种基于 Vue.js 开发跨平台应用的框架。它可以同时构建运行在多个平台(包括但不限于小程序、H5、App)的应用程序。UniApp 的特点包括:一…...
30 树的定义
树的定义 树的度?叶节点? 注意:k为叶节点 孩子/双亲/子孙/祖先 树的高度? 有序树 森林 树的一些操作: 粗略的框架代码: 省略。。。 小结: 树是线性表的扩展...
程序员必备的面试技巧
程序员必备的面试技巧 “程序员必备的面试技巧,就像是编写一段完美的代码一样重要。在面试战场上,我们需要像忍者一样灵活,像侦探一样聪明,还要像无敌铁金刚一样坚定。只有掌握了这些技巧,我们才能在面试的舞台上闪耀…...
【NI-DAQmx入门】LabVIEW中DAQmx同步
1.同步解释 1.1 同步基础概念 触发器:触发器是控制采集的命令。您可以使用触发器来启动、停止或暂停采集。触发信号可以源自软件或硬件源。 时钟:时钟是用于对数据采集计时的周期性数字信号。根据具体情况,您可以使用时钟信号直接控制数据采…...
FlinkRestAPI
which flink 找到Flink客户端地址 如果输出结果为空,则说明 Flink 客户端没有安装在系统路径中。在这种情况下,您可以通过设置 FLINK_HOME 环境变量来指定 Flink 客户端的路径。例如: export FLINK_HOME/opt/flink 然后,您可以使…...
Qt获取当前系统网络接口信息
1.QInterface获取网络接口信息 void NetProperty::init() {// 获取所有网络接口const QList<QNetworkInterface> interfaces QNetworkInterface::allInterfaces();ui->com_Interface->clear();for(const QNetworkInterface& interface : interfaces){ui->…...
【C++】STL 算法 ④ ( 函数对象与谓词 | 一元函数对象 | “ 谓词 “ 概念 | 一元谓词 | find_if 查找算法 | 一元谓词示例 )
文章目录 一、函数对象与谓词1、一元函数对象2、" 谓词 " 概念3、find_if 查找算法 二、一元谓词示例1、代码示例 - 一元谓词示例2、执行结果 一、函数对象与谓词 1、一元函数对象 " 函数对象 " 是通过 重载 函数调用操作符 () 实现的 operator() , 函数对…...
C++ 并发编程 | 并发世界
一、C 并发世界 1、什么是并发? 并发是指两个或更多独立的活动同时发生,计算机中的并发指的是,在单个系统里同时执行多个独立的活动...
GitHub注册新账号的操作流程(详细)
目录 第一步 进入官网,点击右上角的"Sign up" 第二步 输入email地址 第三步 设置密码 第四步 输入昵称 第五步 根据个人喜好决定要不要接收GitHub的邮件推送。然后回答他们的验证问题 第六步 输入验证码 我在注册github账号时遇到过一些阻碍&#x…...
Kali安装Xrdp结合内网穿透实现无公网ip远程访问系统桌面
文章目录 前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于,它允许用户从远程位置访问Kali系统,而无需直接物理访…...
告别裸机轮询:在GD32F30x上用USART中断和回调函数实现驱动解耦
GD32F30x串口驱动架构升级:从轮询到中断回调的工程化实践 在嵌入式开发中,串口通信作为最基础的外设接口之一,其实现方式往往决定了整个系统的响应效率和代码质量。许多工程师在项目初期为了快速验证功能,常采用简单的轮询方式处理…...
用Python处理全球植被数据?手把手教你将BEPS模型的.img文件转成GeoTIFF
从.img到GeoTIFF:Python生态数据处理实战指南 引言:当生态学遇上数据科学 在生态学研究领域,BEPS模型生成的全球植被生产力数据(GPP/NEP/NPP)是理解碳循环和生态系统功能的重要基础。然而,许多研究者第一次…...
保姆级教程:在QT中配置qcustomplot实现热力图(含常见问题解决方案)
QT中qcustomplot热力图实战:从配置到交互优化的完整指南 第一次在QT项目中尝试用qcustomplot绘制热力图时,我被数据映射和实时刷新的问题困扰了整整两天。直到凌晨三点调试通过的那一刻,才真正理解这个强大可视化工具的精妙之处。本文将分享那…...
JS知识点汇总(十九)--ajax
1. 说说ajax的原理,以及如何实现? AJAX 全称(Async Javascript and XML) 即异步的 JavaScript 和 XML,是一种创建交互式网页应用的网页开发技术,可以在不重新加载整个网页的情况下,与服务器交换数据,并且更…...
为什么你的Monte Carlo期权定价结果总偏差>8%?:揭秘随机数种子、路径步长与方差缩减的3重陷阱
第一章:Monte Carlo期权定价偏差的典型现象与问题界定Monte Carlo方法在欧式、亚式及路径依赖型期权定价中广泛应用,但其数值结果常表现出系统性偏差——并非源于算法逻辑错误,而是由随机采样、方差结构与边界处理等多重因素耦合所致。实践中…...
告别数据丢失!GD32串口DMA双缓冲+内存对齐配置避坑指南
GD32串口DMA双缓冲与内存对齐实战:工业级数据零丢失方案 在工业自动化、高速数据采集等场景中,串口通信的稳定性和效率直接关系到整个系统的可靠性。当波特率提升到921600甚至更高时,传统的轮询或中断方式往往难以应对持续的数据流࿰…...
开发效率翻倍:用快马智能推荐最佳排序算法,告别性能焦虑
今天想和大家分享一个提升开发效率的实用技巧——如何快速找到最适合当前场景的排序算法。作为开发者,我们经常需要处理各种排序需求,但面对不同规模、不同特征的数据集时,如何选择最优算法往往让人头疼。 数据准备阶段 在实际项目中…...
欧拉Euler~21.10系统下OpenSSH 9.0升级与安全加固实战指南
1. 环境准备:从零搭建OpenSSH 9.0升级基础 在欧拉Euler~21.10系统上升级OpenSSH,就像给老房子换新门窗——既要保证新功能正常使用,又不能破坏原有结构。我最近刚在测试环境完成这套操作,整个过程踩过几个坑,这里把完整…...
OpenClaw技能扩展实战:基于Qwen3-32B开发自定义文件处理器
OpenClaw技能扩展实战:基于Qwen3-32B开发自定义文件处理器 1. 为什么需要自定义文件处理器 上周处理季度数据时,我又遇到了那个老问题:手头有37个CSV文件需要清洗格式、去重合并,还要按日期归档。这种重复性工作既耗时又容易出错…...
P15800 [GESP202603 六级] 选数
[GESP202603 六级] 选数 https://www.bilibili.com/video/BV1nCAEz2E1q/ P15800 [GESP202603 六级] 选数-信息学奥赛GESP等级考试真题解析 https://www.bilibili.com/video/BV14PwXzEEWL/ 202603GESP六级C第题1选数 https://www.bilibili.com/video/BV19nAnzgEt5/ P15800 [GESP…...


