View on GitHub

WePush

专注批量推送的小而美的工具,目前支持:模板消息-公众号、模板消息-小程序、微信客服消息、微信企业号/企业微信消息、阿里云短信、阿里大于模板短信 、腾讯云短信、云片网短信、E-Mail、HTTP请求、钉钉、华为云短信、百度云短信、又拍云短信、七牛云短信

ADR-0001:Classic 与 Next 双轨独立发展

背景

当前 WePush 是一个已经稳定运行和发布的 Java Swing 客户端,具备完整的消息配置、用户导入、任务调度和批量推送能力。项目计划在 next/ 目录中建设新的目标架构,包括 Core Engine、Agent、Java SDK、Service、Desktop UI 和 WebUI。

如果直接在现有客户端中持续拆分,会同时影响现有用户、发布节奏和新架构设计。另一方面,为了强制消除重复代码而建立跨项目公共模块,也会重新产生构建、版本和架构耦合,限制两条产品线的独立演进。

因此,需要明确 Classic 与 Next 之间的长期关系,以及对代码重复的处理原则。

决策

WePush 采用 Classic 与 Next 双轨独立发展的模式。

  1. 当前仓库根目录下的客户端视为 Classic,继续按照现有产品定位、技术架构和发布流程独立发展。
  2. next/ 是自包含的新项目,用于实现新的目标架构,并拥有独立的构建入口、模块结构、依赖管理、测试和发布流程。
  3. Classic 与 Next 之间不建立运行时或编译期依赖。Next 不依赖 Classic 的 Java 包、数据库实体、静态工具类或内部实现,Classic 也不依赖 Next 的模块。
  4. 不为了复用代码而建立跨两条产品线的 sharedcommon 等公共模块,也不使用软链接、共享源码目录或其他隐式源码复用方式。
  5. 两边允许出现相同或相似代码。复制代码是被接受的工程选择;代码一旦复制到另一条产品线,即成为该产品线独立维护的代码,不要求后续自动同步。
  6. 新功能、缺陷修复和安全修复根据实际需要决定进入 Classic、Next 或同时进入两边,不设置强制双向移植规则。
  7. Classic 与 Next 可以采用不同的数据模型、API、依赖版本和具体实现,也允许产品行为逐渐产生差异,不以内部实现兼容为目标。
  8. 两边可以共享需求理解、协议资料、供应商行为样例、设计经验和测试思路,但这些内容按需分别落入各自项目,不形成共享运行时制品。
  9. Classic 主要承担稳定桌面客户端和新消息类型快速实验场景;Next 按新的组件化、服务化目标发展,不为兼容 Classic 的内部架构而妥协。
  10. 两套应用使用独立的版本号、配置目录、数据存储、网络端口和安装标识,确保可以在同一环境中并行安装和运行。

结果

正面影响

接受的代价

这些代价是本决策明确接受的,不应仅以“消除重复代码”为理由重新引入跨项目依赖。

实施约束

非目标