BitBar 应用分发指南:捆绑插件、构建 Distro 版本与程序化配置
桌面应用开发工具【免费下载链接】xbarPut the output from any script or program into your macOS Menu Bar (the BitBar reboot)项目地址https://gitcode.com/gh_mirrors/xb/xbar点击查看免费下载本指南基于 BitBarxbar 的前身菜单栏脚本运行器仓库中的官方分发文档 DistributingBitBar.md系统讲解如何将 BitBar 与你的插件捆绑成可分发的 .app 应用涵盖 BitBar 与 BitBarDistro 两种构建形态的选择、官方 bundler 脚本的用法与实现细节、用户配置的启用/禁用策略以及通过defaults命令程序化配置插件目录的完整方法。读完本文你将掌握把任意脚本插件打包进 BitBar 应用并对外分发含重新签名的完整实战流程并能从源码层面理解捆绑插件与符号链接背后的工作机制。两种发布形态BitBar 与 BitBarDistro分发 BitBar 时你可以在两种构建版本中选择其一BitBar标准版本允许最终用户在运行时自行配置插件目录也允许用户通过菜单/URL Scheme 管理插件。适合面向开发者或需要自定义插件的受众。BitBarDistro面向开箱即用场景的分发版本默认禁用用户配置userConfigDisabled默认为真插件目录默认指向应用包内可执行文件所在目录从而把插件焊死在应用内部防止用户改动或添加内容适合制作随应用分发、防篡改的交付物。两种版本都可以通过下文介绍的捆绑脚本与插件捆绑在一起使用文档原文Both can be bundled with plugins。两个版本的差异在源码层面由DISTRO编译宏体现其具体行为我们会在后续小节逐一展开。说明仓库中通过 Xcode 的 BitBarDistro.xcscheme 提供名为BitBarDistro.app的独立构建 Scheme并在 project.pbxproj 中通过GCC_PREPROCESSOR_DEFINITIONS DISTRO为 Distro 目标注入该宏因此两个形态实际由同一套代码、不同编译开关编译而来。捆绑插件使用 bitbar-bundler 脚本分发 BitBar 应用的核心诉求是把插件预先放进应用包。官方推荐使用仓库自带的 bitbar-bundler 脚本完成这一工作它接受一个 BitBar 应用路径和若干插件路径作为参数bitbar-bundler /path/to/BitBar.app /path/to/first-plugin /path/to/second-plugin ...脚本依次完成三件事移除应用原有的代码签名将签名替换为 ad-hoc 签名--sign -将插件复制进应用包内拷贝到Contents/MacOS/可执行文件目录确保插件可执行递归赋予执行权限。从源码看脚本的实现非常精简archive/bitbar/Scripts/bitbar-bundler#!/bin/bash [ $# -ge 2 ] || { echo usage: $0 /path/to/BitBar.app /path/to/first-plugin /path/to/second-plugin ...; exit 1; } codesign --deep --force --verbose --sign - $1 app$1/Contents/MacOS/ shift # copy plugins into the apps executables directory cp -v $ $app # ensure they are executable chmod -R x $app值得注意的实现细节脚本要求至少传入2 个参数应用 至少 1 个插件否则打印用法并退出退出码 1codesign --deep --force --verbose --sign -用 ad-hoc 签名-深度强制重签应用即移除代码签名的实际手段——应用原有的开发者签名若有会被替换掉因此文档明确提示分发前请使用你自己的 Apple Developer Program 证书重新签名应用否则用户可能因签名校验失败而无法正常运行或更新插件被复制到Contents/MacOS/目录而非资源目录这与下文 Distro 版本把可执行文件目录当作插件目录的默认行为互相印证chmod -R x确保复制进来的插件脚本具备可执行权限BitBar 的插件本身就是可执行脚本详见 pkg/plugins/plugin.go 对插件可执行性的解析逻辑。捆绑后插件如何被加载符号链接机制文档中提到If user configuration is enabled, symbolic links to the bundled plugins are created in the plugin folder selected by the user.如果启用了用户配置会在用户选择的插件目录中为捆绑插件创建符号链接。这背后的实现位于 PluginManager.m当用户在首次运行或插件目录无效时通过 NSOpenPanel 选择插件目录后PluginManager 会先以应用包内可执行文件目录即捆绑插件所在处为源将其中所有插件文件在用户选择的目录下逐一创建符号链接createSymbolicLinkAtPath:withDestinationPath:随后把用户目录写入设置setPluginsDirectory:。// symlink bundled plugins in selected directory self.path [NSBundle mainBundle].executablePath.stringByDeletingLastPathComponent; NSArray *pluginFiles [self pluginFilesWithAsking:NO]; for (NSString *file in pluginFiles) [[NSFileManager defaultManager] createSymbolicLinkAtPath:[openDlg.URL.path stringByAppendingPathComponent:file] withDestinationPath:[self.path stringByAppendingPathComponent:file] error:nil];由此可以推断在BitBar用户配置启用下捆绑的插件仍会被应用发现它们以符号链接形式出现在用户选择的插件目录中而实际内容保留在应用包内在BitBarDistro用户配置禁用下不会走这一路径插件目录直接默认指向应用包内的Contents/MacOS/目录用户无法变更从而实现文档所称的tamper free防篡改交付。同时PluginManager 在扫描插件目录时会过滤掉点文件.开头、.md文件、子目录以及应用自身可执行文件PluginManager.m确保只有真正的插件脚本被加载。程序化配置使用 defaults 命令除了首次运行时的图形化选择你可以通过 macOS 的defaults命令以编程方式预设 BitBar 的插件目录以及是否禁用用户配置。文档给出的两个示例defaults write com.matryer.BitBar pluginsDirectory path/to/plugins defaults write com.matryer.BitBar userConfigDisabled -bool true参数说明键类型含义pluginsDirectorystringBitBar 使用的插件目录绝对路径userConfigDisabledboolean是否禁用用户配置true表示禁用全局设置若希望对系统中所有用户生效将 domain 换成全局偏好域即可defaults write /Library/Preferences/com.matryer.BitBar pluginsDirectory path/to/plugins defaults write /Library/Preferences/com.matryer.BitBar userConfigDisabled -bool true即使用/Library/Preferences/com.matryer.BitBar作为 domain 替代用户级 domaincom.matryer.BitBar。源码层解读两个键的实际语义这两个键的读写逻辑集中在 NSUserDefaultsSettings.m 的NSUserDefaults分类扩展中且行为会随DISTRO宏不同而变化这是理解两种发布形态差异的关键- (NSString *)pluginsDirectory { #ifdef DISTRO return [self stringForKey:pluginsDirectory] ?: [NSBundle mainBundle].executablePath.stringByDeletingLastPathComponent; #else return [self stringForKey:pluginsDirectory]; #endif } - (BOOL)userConfigDisabled { #ifdef DISTRO id disabled [self objectForKey:userConfigDisabled]; return disabled ? [disabled boolValue] : YES; #else return [self boolForKey:userConfigDisabled]; #endif }从源码可以确认以下事实标准版 BitBarpluginsDirectory未设置时返回 nil此时应用会走首次运行引导流程提示用户选择插件目录userConfigDisabled未设置时默认返回NO用户配置默认启用。Distro 版 BitBarpluginsDirectory未设置时回退到应用可执行文件目录Contents/MacOS/也就是 bundler 脚本复制插件的位置userConfigDisabled未显式设置时默认返回YES用户配置默认禁用。这正是文档所说BitBarDistro disables user configuration by default的底层依据。此外AppDelegate.m 还展示了DISTRO宏的另一个影响Distro 版使用独立的 Sparkle 更新源https://bitbarapp.com/feeds/distro标准版使用https://bitbarapp.com/feeds/bitbar说明分发版拥有独立的更新通道同时 AppDelegate.m 在userConfigDisabled为真时直接忽略打开插件类 URL Scheme 请求进一步落实禁用用户配置的语义。完整分发流程实操总结结合文档与源码一次完整的 BitBar 分发大致如下构建应用用 Xcode 打开 BitBar.xcodeproj选择BitBar或BitBarDistroSchemeBitBarDistro.xcscheme中构建产物名为BitBarDistro.app进行 Release 构建。捆绑插件调用bitbar-bundler /path/to/BitBar.app /path/to/first-plugin /path/to/second-plugin ...脚本会自动移除签名、复制插件到Contents/MacOS/并赋予执行权限。可选预设配置如需开箱即用的插件目录可用defaults write com.matryer.BitBar pluginsDirectory path/to/plugins预设如需锁死用户配置追加defaults write com.matryer.BitBar userConfigDisabled -bool true企业/全局分发场景改用/Library/Preferences/com.matryer.BitBar域。重新签名用你自己的 Apple Developer Program 证书对.app重新签名codesign --deep --sign Your Certificate /path/to/BitBar.app以确保交付物签名有效、可正常通过 macOS 的 Gatekeeper 校验。分发与验证将重新签名后的.app交付给用户。标准版用户仍可自行调整插件目录Distro 版则按预设目录加载捆绑插件且默认不接受用户修改。适用前提与限制本指南描述的是仓库归档中 BitBarObjective-C 时代的 macOS 菜单栏应用的分发方式配套的 Makefile 仅负责常规构建与启动不包含分发逻辑分发细节全部由 bundler 脚本与defaults配置承担。defaults写入的偏好域com.matryer.BitBar与应用的 Bundle Identifier 一致若你分叉后修改了 Bundle Identifier需同步替换为对应域名。bundler 脚本会移除应用原有代码签名未重新签名就分发的应用在装有 Gatekeeper 的 macOS 上可能无法正常运行务必执行重签名步骤。如需在 Linux 等非 macOS 环境使用同类插件体系仓库的 Go 实现如 pkg/plugins/plugin.go提供了跨平台插件解析与执行能力可作为迁移参考但本文涉及的.app打包、defaults与代码签名均为 macOS 专属能力。赞分享桌面应用开发工具【免费下载链接】xbarPut the output from any script or program into your macOS Menu Bar (the BitBar reboot)项目地址https://gitcode.com/gh_mirrors/xb/xbar点击查看免费下载相关推荐LIKE-DBG实战教程使用GDBGEF调试Linux内核漏洞的完整步骤LIKE DBG实战教程使用GDBGEF调试Linux内核漏洞的完整步骤 你是否对Linux内核安全研究充满好奇但被繁琐的环境搭建劝退 今天我将为你如何 fork goose 构建预配置提供商与捆绑扩展的自定义发行版如何 fork goose 构建预配置提供商与捆绑扩展的自定义发行版 假设你要为自己的组织分发一个定制版 goose开箱即用某个指定的 AI 提供商本地模人工智能大模型AI AgentAI 应用本地部署MCP ClientsMCP 服务工具调用桌面应用CLI云原生应用捆绑规范(CNAB)指南云原生应用捆绑规范 CNAB 指南 本指南旨在为开发者提供对 Cloud Native Application Bundle CNAB https://gith创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考