![]()
开源项目的下载量有个诡异规律:每多一步编译操作,用户流失率就翻一倍。DualClip上周的v1.1.0更新,核心目标就是把"从源码构建"这行字彻底删掉。
作者用4次失败的CI/CD尝试换来了3个教训——其中一个是:苹果的服务器也会挂。
安全输入检测:最好的功能是你永远注意不到的
macOS有个叫Secure Event Input(安全事件输入)的机制。当你聚焦在密码框时,系统会激活这个模式,屏蔽所有第三方程序的键盘监听。
DualClip现在每次复制粘贴前都会检查这个状态。代码极简,就一行:
guard !AccessibilityService.shared.isSecureInputActive() else { return }
如果你在Safari输网银密码、在1Password解锁保险库、在终端敲sudo,DualClip会自动退场。没有弹窗,没有提示,静默得像没装过这个软件。
作者的原话是:「It’s the kind of feature that, when it works correctly, you never notice. And that’s exactly the point.」
这种设计哲学很产品经理:安全功能的价值在于"无感",而不是让用户每次都被提醒"我很安全"。
预编译二进制文件:终于不用装Xcode了
v1.1.0开始,每个release都用Developer ID证书签名,并经过苹果公证(Notarization)。对用户意味着两件事:
不需要去系统设置里点"仍要打开"。
下载、拖拽、直接用。
这个改动的用户价值很直白,但实现过程堪称翻车现场实录。
CI/CD翻车记:3个bug和一场全球 outage
作者用GitHub Actions搭自动化流水线,理论上流程很标准:编译→导入证书→打包→签名→提交苹果公证→轮询结果→打标签。
实际执行时,四个版本标签才跑通。
Bug 1:眼睛会骗你
苹果API返回401 Unauthorized,作者盯着secret检查了10分钟。最后发现是app-specific password里的拼写错误:fjhk写成了tihk。
「CI/CD reminds you that your eyes see what they want to see, not what’s actually there.」
Bug 2:苹果的云也会崩
连续三次提交卡在"In Progress"状态数小时。作者以为是脚本死循环,差点重写轮询逻辑。结果那天苹果公证服务全球故障,跟代码没关系。
这个教训很反直觉:你 pipeline 再优雅,也扛不住上游供应商抽风。
Bug 3:awk的单词切割陷阱
轮询脚本用awk '{print $2}'提取公证状态。但" In Progress"是两个单词,awk只抓到"In",匹配逻辑永远失败。
修复方案:改用sed 's/.*status: //',把冒号后的整个字符串都拿过来。
三个bug里,两个是人的问题,一个是基础设施的锅。比例大概符合软件工程的真实分布。
路线图进度:4/5完成,Homebrew在排队
v1.1.0的交付清单:
安全输入检测 ✅
终止时内存清零 ✅
图片/富文本支持 ✅
CI/CD+公证 ✅
Homebrew Cask分发
最后一项是作者确认的下一步。对macOS用户来说,brew install dualclip 才是真正的终极形态——连"去GitHub下载"这步都想省掉。
如果你之前因为"需要编译"而观望,现在可以动手了。作者放出的下载链接在release页面,ARM和Intel双架构通用。
一个 clipboard manager 做到这个完成度,开源社区里不算多见。更少见的是作者愿意把CI/CD的翻车过程写出来——这种"我搞砸了"的诚实,比功能列表更能建立信任。
Homebrew支持上线后,你会第一时间换源吗,还是继续手动更新?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.