Managed Package Types & Apex Versioning

DEX455 - Apex 部署与托管包完全指南

📄 第 465 页 🎬 视频课程

课程章节介绍

咱们今天来聊聊 Salesforce 里托管包的三种类型,以及怎么在 Apex 里根据包的版本做不同的事情。你可能听说过 1GP、2GP 还有 Unlocked 包,但别担心,我用最简单的话给你讲清楚。 首先,1GP,全称是第一代托管包,其实就是咱们在 AppExchange 上最常见的那种传统包。它跟组织绑定得比较紧,开发流程大多是直接在打包组织里点点改改。这个方式已经很多年了,稳定但不够灵活。 接着是 2GP,第二代托管包。它是从源代码驱动的,就是说你的代码放在版本控制系统里,比如 Git,然后 Salesforce 根据你源码的版本来创建包版本。它的一个很大改进是命名空间的可见性控制更精细,而且允许你构建模块化的包,把功能拆分开来,更适合现代开发流程。你可能会同时维护同一个包的不同主要版本,让订阅者可以选择升级到什么版本。 最后是 Unlocked 包,这个其实主要不是给 AppExchange 上架用的,而是用于企业内部,尤其是想在多个 org 间共享组件,但又不想走很重的 AppExchange 审核流程。Unlocked 包也是从源代码创建的,但它没有命名空间,或者可以使用一个没有发布到 AppExchange 的命名空间,很适合内部开发和分发。 现在关键来了:无论你是作为包的开发者,还是作为使用包的订阅者写 Apex 代码,都需要有能力知道“我当前运行的代码是属于哪个版本的包”。因为你的逻辑可能需要根据包版本来走不同的分支。这时候,System.requestVersion() 方法就派上用场了。 System.requestVersion() 返回一个 Version 对象,它描述的是当前正在执行的代码所属的包版本。注意,它不是订阅者安装的包的版本,而是具体正在调用的那部分代码所在的包版本。比如,你的扩展包或者订阅者代码调用了托管包里某个类的方法,那个方法里调用的 System.requestVersion() 返回的就是托管包自己的版本。 然后你可以用 Version 对象的 compareTo 方法来做比较。假设你作为包开发者,想对 2.0 版本以上的包启用一套新逻辑,而对旧版本保持兼容,你就可以这样写: ```apex if (System.requestVersion().compareTo(new Version(2, 0)) >= 0) { // 执行新版本的逻辑 } else { // 执行旧版本的逻辑 } ``` compareTo 方法会返回一个整数:如果当前版本比传入的版本大,返回正数;相等返回 0;小的话返回负数。所以 >=0 就代表当前版本大于等于 2.0。 还有个重要概念:请求上下文。System.requestVersion() 返回的版本在整个请求的调用链里是保持一致的,哪怕你的方法内部调用了同一个包里的其他方法,这个版本号也不会变。但它只持续到当前请求结束,下一个请求就会重新根据实际调用的包确定。 简单总结一下:1GP 是传统打包,2GP 是现代源码驱动且更适合模块化,Unlocked 包用于内部共享。你需要用 System.requestVersion() 拿到当前执行代码的包版本,然后通过 compareTo 来编写版本兼容条件。好啦,今天的知识点就这么些,下回咱们来动手写写代码试试看。

关键词

Apex Salesforce Developer Guide