@code-push-next/react-native-code-push

中文文档
10.4.3发布于 2026/08/10MITTypeScriptCommonJS近 30 天下载 28.5万

CodePush 服务的原生插件

中文使用文档
文档目录15 节
  1. 怎么会这样?
  2. 支持的 React 本地平台
  3. 支助构成部分
  4. 开始
  5. 插件使用
  6. 用于 CNG( 持续的原住民世代) 的 expo 用户
  7. 库存准则遵守情况
  8. 发布更新
  9. 多部署测试
  10. 动态部署任务
  11. API 参考
  12. 示例 Apps / 启动器
  13. 调试/ 解决问题
  14. 持续整合/交付
  15. 类型脚本消耗

来自维护者: 我们建设 密码补丁,一个自我托管的OTA更新服务,用于React Introduct——服务器,客户端SDK,CLI,和仪表板——我们的新开发发生的地方,我们推荐它用于新的项目. 如果你想从自办的代码Push中迁移,请查看 移徙指南。 。 。 .

代码Push 的原生模块

此插件提供了客户端集成 代码Push服务,允许您在您的 React Industrial app(s) 中轻松添加动态更新体验.

怎么会这样?

反应原生应用程序由 JavaScript 文件及任何随附文件组成 图像,它们被捆绑在一起 地铁捆绑器 并作为特定平台二进制(即: .ipa 或者说 .apk 存档). 应用程序发布后,更新JavaScript代码(如制作错误修正,添加新功能)或图像资产,需要您重新编译并再分配整个二进制,这当然包括与您正在出版的商店相关的任何审查时间.

代码Push插件帮助在终端用户面前立即获得产品改进,方法是保持您的JavaScript和图像与您向代码Push服务器发布的更新同步. 这样,你的应用程序就能从离线移动体验中获得好处,以及一旦获得副载更新的"网状"敏捷性. 这是一个双赢!

为了保证您的终端用户总是有一个功能化的应用程序版本,CodePush插件维护了上一个更新的复制件,这样,如果您不小心推了包含崩溃的更新,就可以自动回滚. 这样,你可以放心,你新发现的发布敏捷性不会导致用户在有机会翻回服务器之前被屏蔽. 双赢!

注意: 任何产品更改, 触及本地代码( 例如修改您的本地代码) AppDelegate.m编号 :MainActivity.java 文件,添加了一个新的插件)无法通过 CodePush 发布,因此,必须通过适当的商店更新.

支持的 React 本地平台

  • iOS (15.5+) (中文(简体) )
  • TLS 1.2相容设备上的Android(4.1+)
  • Windows (UWP) - 未积极测试

我们尽力保持我们的插件与之前版本的React Industrial相容,但由于平台的性质,以及发行间出现突破变化,你可能需要使用代码Push插件的特定版本,以支持你正在使用的React Industrial的准确版本. 下表概述了哪些CodePush插件版本正式支持各自的回放原生版本:

反应原生版本支持代码Push版本
v0.76, v0.77, 0.78, 0.79 (英语)v1.0+ (韩语) (适用于旧/新建筑)
v. 0.80 (中文(简体) )v10.1+ (韩语) (适用于旧/新建筑)
页:1v10.3+ (韩语) (适用于旧/新建筑)
v. 0.82+ (单位:千美元)v10.4+ (韩语) (适用于新建筑)

支助构成部分

当使用反应原生资产系统时(即使用 require("./foo.png") 语法),以下列表代表了支持通过CodePush更新其被引用的图像和视频的核心组件(和道具)的一组:

构成部分推进
Imagesource
MapView.Marker
(所需资源 反应-内生-映射 >=O.3.2(中文(简体) )
image
ProgressViewIOSprogressImage, (中文(简体) ), trackImage
TabBarIOS.Itemicon, (中文(简体) ), selectedIcon
ToolbarAndroid
(反应土著0.21.0+)
actions[].icon, (中文(简体) ), logo, (中文(简体) ), overflowIcon
Videosource

以下列表代表了目前不支持其资产通过CodePush更新的一组组件(和道具),因为它们依赖于静态图像和视频(即使用 { uri: "foo" } 语法 :

构成部分推进
SliderIOSmaximumTrackImage, (中文(简体) ), minimumTrackImage, (中文(简体) ), thumbImage, (中文(简体) ), trackImage
Videosource

随着新的核心组件被发布,这些组件支持引用资产,我们将更新这个列表,以确保用户能够确切地知道他们可以期待使用CodePush更新什么.

注意: 代码Push仅在使用视频组件时工作 require 来源道具。 例如:

<Video source={require("./foo.mp4")} />

开始

一旦您设置了 CodePush 服务器, 您可以启动 CodePush- fying 您的 React Natural app, 从您的应用的根目录中运行以下命令 :

yarn add @code-push-next/react-native-code-push

和所有其他 React Endroid 插件一样,iOS和Android的集成体验也不同,因此根据您选择的平台执行以下设置步骤. 注意,如果针对两个平台,建议为每个平台创建单独的CodePush应用程序.

如果您想了解其他项目是如何与 CodePush 合并的, 您可以查看其中的优秀 示例应用程序 由社区提供。 此外,如果你想快速熟悉 CodePush + React Industrial, 你可以检查一下 令人赞叹的开始视频 由 比拉尔·布达尼 和(或) 迪帕克·西索迪亚 。 。 。 .

注: 本指南假定您使用了 react-native init 命令以初始化您的 React 原生项目。 截至2017年3月,指挥部 create-react-native-app 也可以用来初始化一个React Industrial项目. 如果使用此命令, 请运行 npm run eject 在您的项目主目录中获取一个非常类似于什么的项目 react-native init 本来会创造的.

然后继续安装本地模块

插件使用

有了CodePush插件下载和链接,你的应用程序要求CodePush从哪里得到正确的JS捆绑,唯一剩下的是将必要的代码添加到你的应用程序中来控制以下政策:

  1. 何时(和多久)检查更新? (例如应用启动,在设置页面中点击按钮时,在一定固定的间隔内定期启动)

  2. 当更新可用时,如何向最终用户展示?

最简单的方法是"代码Push-fy"你的应用的根部组件. 为此,您可以选择以下两个选项之一:

  • 备选案文1:用 codePush 高序组件 :

    • 类组件

      import codePush from "@code-push-next/react-native-code-push";
      
      class MyApp extends Component {}
      
      MyApp = codePush(MyApp);
      
    • 职能部分

      import codePush from "@code-push-next/react-native-code-push";
      
      let MyApp: () => React$Node = () => {};
      
      MyApp = codePush(MyApp);
      
  • 备选案文2:使用 ES7 装饰器 语法 :

    注:尚未在 Babel 6.x 中支持更新提案. 您可能需要安装并使用 bail- preset- react-native-statement-0 预选赛 预选赛 预选赛 预选赛。 。 。 .

    • 类组件

      import codePush from "@code-push-next/react-native-code-push";
      
      @codePush
      class MyApp extends Component {}
      
    • 职能部分

      import codePush from "@code-push-next/react-native-code-push";
      
      const MyApp: () => React$Node = () => {};
      
      export default codePush(MyApp);
      

默认情况下, CodePush 将会检查每个应用程序启动时的更新. 如果有更新可用,它将被静默地下载,并在下一次重启应用程序时安装(要么由终端用户明确,要么由OS),这保证了您的终端用户的入侵经验最少. 如果已有的更新是强制性的,则将立即安装,确保最终用户尽快得到.

如果您希望您的应用程序能更快地发现更新,您也可以选择在每次应用程序从背景恢复时与 CodePush 服务器同步.

  • 类组件

    let codePushOptions = {
      checkFrequency: codePush.CheckFrequency.ON_APP_RESUME,
    };
    
    class MyApp extends Component {}
    
    MyApp = codePush(codePushOptions)(MyApp);
    
  • 职能部分

    let codePushOptions = {
      checkFrequency: codePush.CheckFrequency.ON_APP_RESUME,
    };
    
    let MyApp: () => React$Node = () => {};
    
    MyApp = codePush(codePushOptions)(MyApp);
    

或者,如果想要对检查发生时进行精细控制(如按下按钮或计时间隔),可以拨打 CodePush.sync() 随时随地 SyncOptions自动检查,并指定手册 checkFrequency数字 :

let codePushOptions = { checkFrequency: codePush.CheckFrequency.MANUAL };

class MyApp extends Component {
  onButtonPress() {
    codePush.sync({
      updateDialog: true,
      installMode: codePush.InstallMode.IMMEDIATE,
    });
  }

  render() {
    return (
      <View>
        <TouchableOpacity onPress={this.onButtonPress}>
          <Text>Check for updates</Text>
        </TouchableOpacity>
      </View>
    );
  }
}

MyApp = codePush(codePushOptions)(MyApp);

如果您想要显示更新确认对话框( “ 主动安装 ” ) , 在安装可用的更新时配置( 如强制立即重新启动) , 或以任何其他方式自定义更新经验 , 请参考 codePush() API 对于如何调整这一默认行为的信息参考.

注:如果使用 复数 财务报告和审定财务报表 Redux 萨加,也可以使用 反应-内生-编码-push-saga 模块,允许您自定义何时 sync 以也许更简单/更平庸的方式称呼.

用于 CNG( 持续的原住民世代) 的 expo 用户

// app.json
    "expo": {
        // ...
        "plugins": [
      [
        "@code-push-next/react-native-code-push/expo",
        {
          "ios": {
            "CodePushDeploymentKey": "deployment key",
            "CodePushServerURL": "server url"
          },
          "android": {
            "CodePushDeploymentKey": "deployment key",
            "CodePushServerURL": "server url "
          }
        }
      ],
    ]
    }

目前,代码-push-cli不支持expo-cli建设. 要成功,需要将地铁.config.js制作在根目录上.

npx expo customize metro.config.js

https://docs.expo.dev/guides/ customization-metro/# 定制化

库存准则遵守情况

Android Google Play和iOS App Store都有相应的准则,在将CodePush解决方案整合到您的应用程序中之前,您应该了解这些准则.

谷歌游戏

第3段,第1行,第1行 设备和网络滥用 专题描述除了Google Play的更新机制之外,其他任何方法更新源代码都受到限制. 但这一限制并不适用于Javascript捆绑的更新.

这一限制不适用于在虚拟机中运行且对Android API有有限访问的代码(如网页视图或浏览器中的JavaScript).

这完全允许代码Push,因为它只是更新JS捆绑,无法更新本地代码部分.

应用程序存储

段 次 页 次 3.3.2 国家2015年代开始 苹果开发者程序许可协议 完全允许对 JavaScript 和资产进行空中更新 - 及其最新版本(20170605) 这里可下载 这一裁决更为宽泛:

被解释的代码可以下载到一个应用程序,但只能下载这样的代码:(a)不通过提供与提交App Store的应用程序的预期和广告目的不一致的特征或功能来改变应用程序的主要目的,(b)不为其他代码或应用程序创建商店或商店前端,(c)不绕过OS的签名,沙盒,或其他安全特征.

CodePush允许您完全遵守这些规则,只要您所推动的更新不会显著地偏离其App Store的最初批准意图.

为了进一步遵守苹果公司的准则,我们建议App Store分发的应用软件不能使用 updateDialog 选项 sync,因为 App Store 审查准则 它写道:

App不得强迫用户对App进行评分,审查App,下载其他App,或其他类似动作,以访问App的功能,内容,或使用.

情况不一定如此 updateDialog,因为它不会强迫用户下载新版本,但至少你应该知道,如果你决定显示它的话.

发布更新

一旦你的应用程序被配置并分发给用户,并且你做了一些JS或资产修改,是时候发布它们了. 使用您的 CodePush 兼容服务器的 CLI 将您的 JavaScript 文件, 资产文件捆绑, 并将更新发布到服务器 .

代码Push客户端支持差异更新,所以尽管您正在发布您的JS捆绑和每次更新的资产,您的终端用户只会实际下载他们需要的文件. 服务会自动处理这个,这样你就可以专注于创建真棒的应用程序,我们可以担心优化终端用户下载.

如果你遇到任何问题,或有任何问题/评论/反馈,你可以把我们推入 代码推 恢复和/或检查 排除出问题 详细情况如下.

注:代码Push更新应当以除去bug模式以外的模式进行测试. 在调试模式下,React Industrial app总是下载由包机生成的JS捆,因此由CodePush下载的JS捆不适用.

多部署测试

在我们 开始中 docs, 我们用一个特定的部署密钥演示了代码Push插件的配置 。 然而,为了有效测试你的释放,你必须利用 Staging 财务报告和审定财务报表 Production 当您创建 CodePush app时自动生成的部署( 或您可能创建的任何自定义部署) 。 这样,你永远也不会向终端用户发布你一直无法验证自己的更新.

注:我们的客户端回滚功能可以帮助用户在安装导致崩溃的发布后解锁,服务器端回滚功能允许您在识别出不良发布后防止额外的用户安装不良发布. 然而,很明显,如果你能防止错误的更新在最初被广泛发布,会更好.

利用 Staging 财务报告和审定财务报表 Production 部署允许您实现如下工作流程( 自定义 !) :

  1. 向您发布代码Push更新 Staging 部署

  2. 运行您的应用程序的中继/ β构建, 同步服务器的更新, 并按预期验证其效果

  3. 推动测试的释放 Staging 改为 Production

  4. 运行您的应用程序的制作/ 发布构建, 同步服务器的更新, 并按预期验证其效果

注:如果想要采取更谨慎的做法,甚至可以选择作为"3"的一部分进行"分期推出",这允许您通过更新来减轻额外的潜在风险(就像您在#2中的测试会触碰所有可能的设备/条件?),只向您的用户提供一定比例的制作更新. 然后,在等待合理的时间,看看是否有坠机报告或客户反馈出现后,你可以将其扩展至整个观众.

你会注意到,上述步骤指的是你的应用程序的"Stage building"和"生产building". 如果您的构建过程已经生成了每个“ 环境” 的显著二进制, 那么您就不需要再读取了, 因为换出代码Push部署密钥就像处理您应用使用的任何其他服务的环境配置( 如Facebook) 。 然而,如果你在寻找实例包括示范项目)关于如何设置您的构建过程来容纳此功能,然后根据您的应用程序所选择的平台,参考以下章节:

动态部署任务

以上章节说明了您如何利用多种代码Push部署,以便在向终端用户广泛发布之前有效测试您的更新。 然而,由于该工作流程静态地将部署任务嵌入到实际的二进制中,一个中转或生产架构只会同步与部署的更新。 在很多情况下,这已经足够了,因为你只希望你的团队,客户,利益攸关方等与你的出品前发布同步,因此,他们只需要一个能与出品同步的架构. 然而,如果想要能够进行A/B测试,或者为某些用户提供早期的应用访问,那么在运行时能够将特定的用户(或受众)动态地放入特定的部署中,可以证明是非常有用的.

为了实现这种工作流程,你只需要指定您想要当前用户在调用时同步的部署密钥 codePush 方法。 指定时, 此密钥将覆盖您的应用程序中提供的“ 默认 ” Info.plist (iOS)或 (iOS) 或 (iOS) MainActivity.java (Android)档案. 这使得您可以生产出一个用于中转或出产的构件,这种构件也可以根据需要被动态地"重定向".

// Imagine that "userProfile" is a prop that this component received
// which includes the deployment key that the current user should use.
codePush.sync({ deploymentKey: userProfile.CODEPUSH_KEY });

随着这个变化的出现,现在只需要选择您的应用程序如何决定当前用户的正确部署密钥. 在实践中,一般有两种解决办法:

  1. 展示一个随时改变部署的用户可见机制. 例如,您的设置页面可以有一个切换器,用于允许“β”访问 。 这个模型如果不关心你的出品前更新的隐私,并且有权力用户可能希望按照自己的意愿(类似于克罗姆频道)选择更早(并有可能被buggy)的更新. 然而,这个解决方案将决定权交给了您的用户,这无助于您透明地进行A/B测试.

  2. 将用户的服务器侧配置图附加一块元数据, 以显示他们应该同步的部署 。 默认情况下,您的应用程序只能使用二进制嵌入式密钥,但在用户认证后,您的服务器可以选择"重定向"到不同的部署,这允许您根据需要将某些用户或组逐步置于不同的部署中. 您甚至可以选择将服务器响应存储在本地存储中, 从而成为新的默认值 。 如何将密钥和用户配置文件一起存储,完全取决于您的认证解决方案(例如Auth0,Firebase,自定义 DB + REST API),但一般都相当微不足道.

注:如果需要,您也可以执行混合解决方案,允许终端用户在不同的部署之间切换,同时允许您的服务器推翻这个决定。 这样,你就有"部署解析度"的分级,可以保证你的应用程序能够自我更新出"框外",你的终端用户可以通过提前访问比特而感觉得到奖励,但是也能够根据需要运行用户的A/B测试.

由于我们建议使用 Staging 用于您更新的发布前测试的部署(如上一节所解释),使用它来对您的用户进行A/B测试,而不是允许提前访问(如上选项1所解释),这不必然是有意义的。 因此,我们建议充分利用自定义应用程序的部署,以便您可以分割您的用户,但满足您的需要。 例如,你可以创建长期甚至一次性的部署,向它发布一个应用程序的变体,然后将某些用户放入其中,看看他们是如何参与的.

// #1) Create a new deployment to hold releases of a specific app variant via your CodePush server CLI

// #2) Target any new releases at that custom deployment

注:您部署的"安装计量"中报告的用户总数将考虑到从一个部署到另一个部署的"切换"用户. 比如说,如果你 Production 部署当前报告有1个用户,但您要动态切换该用户到 Staging,然后是 Production 部署将报告0个用户,而 Staging 将报告1(刚刚切换的用户)。 这种行为使您能够准确跟踪您的发布采纳,即使在使用以运行时间为基础的部署重定向解决方案的情况下.


API 参考

示例 Apps / 启动器

React原住民社群慷慨地创造了一些令人赞叹的开源应用, 以下是同样使用CodePush的OSS React Introduct应用程序列表,因此可以用来查看其他人如何使用该服务:

另外,如果你想开始使用 React Industrial + CodePush, 并且正在寻找一个很棒的启动器套件, 你应该检查以下内容:

注意:如果你已经开发了使用 CodePush 的 React Industrial app,也就是开源,请告诉我们. 我们愿意加入这个名单!

调试/ 解决问题

这个 sync 方法包括很多诊断性记录出箱,所以如果你在使用时遇到一个问题,首先尝试的最好办法是检查你的应用的输出日志. 这将告诉您该应用程序是否配置正确( 类似插件能否找到您的部署密钥? ) , 如果该应用程序能够到达服务器, 如果正在发现可用的更新, 如果正在成功下载/ 安装更新等 。 我们想继续改善伐木 尽可能直观和全面 所以请 告诉我们 如果你发现它 令人困惑或缺少任何东西.

查看这些日志的最简单方式是添加旗帜 --debug 每个命令。 这将输出一个被过滤到仅 CodePush 信件的日志流 。 这使得可以很容易地确定问题,而不需要使用特定平台的工具,或者通过潜在的大量日志.

screen shot 2016-06-21 at 10 15 42 am

此外,您还可以使用任何平台专用工具来查看CodePush日志,如果您对它们更满意的话. 简单启动 Chrome DevTools 控制台, Xcode 控制台( iOS), 操作 OS X 控制台 (iOS)和(或)亚行的logcat(Android),并查找前缀为 [CodePush]。 。 。 .

请注意, 默认情况下, React Industrial logs 在 iOS 构建中会被禁用, 因此, 如果您想要在 发布 构建中查看它们, 您需要做以下修改 AppDelegate.m 文件 :

  1. 添加一个 #import <React/RCTLog.h> 语句。 RN < v.40 用途: #import "RCTLog.h"

  2. 在您的顶部添加以下语句 application:didFinishLaunchingWithOptions 方法 :

    RCTSetLogThreshold(RCTLogLevelInfo);
    

现在你可以在iOS或Android上看到调试或放出模式下的CodePush日志. 如果检查日志不能说明问题,请参考以下共同问题以补充解析想法:

问题/症状可能的解决方案
编译出错重复检查您的版本 React Industrial 是 兼容 和您使用的代码Push版本.
呼叫时网络超时/ 挂起 sync 或者说 checkForUpdate iOS 模拟器尝试通过选择 Simulator -> Reset Content and Settings.. 菜单项目,然后重运行您的应用程序.
服务器响应 a 404 调用时 sync 或者说 checkForUpdate重复检查您添加到您的部署密钥 Info.plist (iOS), build.gradle (Android) 或者你正在传递给 sync编号 :checkForUpdate,事实上是正确的。 您可以使用您的 CodePush CLI 验证您的应用程序部署的正确密钥 .
未发现更新重复检查您运行的应用程序的版本( 如 1.0.0)匹配您在向 CodePush 发布更新时指定的版本。 另外, 请确保您释放到您所配置的应用程序可以同步的配置 .
重新启动后未显示更新如果你不打电话 sync 应用程序启动时( 如 componentDidMount ,然后需要明确调用 notifyApplicationReady 在应用程序启动时, 否则插件会认为您的更新失败并滚回 .
我发布了iOS的更新,但我的Android应用程序也显示更新,它打破了它确定每个平台都有不同的部署密钥,以便正确接收更新
我已经发布了新的更新,但是没有反映变化请确定您正在运行非调试模式的应用程序 。 在调试模式下,React Industrial app总是下载由包机生成的JS捆,因此由CodePush下载的JS捆不适用.
运行您的应用程序时, 没有找到 JS 捆绑 默认,React Industrial在与模拟器相撞时不会生成你的JS捆. 因此,如果你使用 [CodePush bundleURL],并瞄准iOS模拟器, 你可能会得到一个 nil 结果。 这个问题将固定在RN 0.22:0中,但只用于发行建造. 你可以解开这个情景 通过制作 这一变动 当地.

持续整合/交付

除了能够使用"代码Push CLI"来"手动"发布更新之外,我们认为重要的是创造一个可重复和可持续的解决方案,以同步向您的应用程序提供更新. 这样,你和(或)你的团队就足够简单了,可以创造和维持执行敏捷部署的节奏. 为了协助建立基于CodePush的CD管线,请参考与各种CI服务器的下列集成:

另外,如果你想知道更多关于一个完整的移动 CI/CD工作流程的长相, 包括 CodePush, 请检查一下 优秀文章 编辑 Zee Mee工程队。 。 。 .

类型脚本消耗

本单元载运 *.d.ts 作为国家防范机制软件包的一部分,允许您简单地 import 它,并获得支持编辑器的智能感(如Visual Studio Code),以及编译时间类型检查是否使用TypeScript. 大部分情况下,这种行为应该只是 走出盒子,但是,如果你已经说明 es6 作为其中任一的值 target 或者说 module 编译器选项 在你身边 tsconfig.json 文件,然后确保您也设置 moduleResolution 选项到 node。这将确保 TypeScript 编译器在 node_modules 用于输入模块的类型定义。 否则,你会遇到如下错误: react-native-code-push 模块 : error TS2307: Cannot find module 'react-native-code-push'。 。 。 .

版本与发布记录

@code-push-next/react-native-code-push 共发布 18 个版本,首次发布于 2025/01/19;过去 12 个月发布了 6 个版本。

版本发布日期距今
10.4.3latest2026/08/103 个月前
10.4.22026/06/244 个月前
10.4.12026/04/136 个月前
10.4.02026/02/039 个月前
10.3.22026/01/199 个月前
10.3.12026/01/0610 个月前

关于 @code-push-next/react-native-code-push 的常见问题

@code-push-next/react-native-code-push 是什么?

CodePush 服务的原生插件

如何安装 @code-push-next/react-native-code-push?

在项目目录运行 npm install @code-push-next/react-native-code-push,或使用 pnpm add / yarn add / bun add。

@code-push-next/react-native-code-push 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@code-push-next/react-native-code-push 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@code-push-next/react-native-code-push 可以商用吗?

@code-push-next/react-native-code-push 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@code-push-next/react-native-code-push 的下载量有多少?

根据 npm 官方下载统计,@code-push-next/react-native-code-push 在 2026/10/10 – 2026/11/08 这 30 天内被下载 285,054 次,日均约 9,502 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@code-push-next/react-native-code-push 还在维护吗?

最新版本 10.4.3 发布于 2026/08/10(3 个月前);至今共发布 18 个版本,其中过去 12 个月发布了 6 个;首次发布于 2025/01/19。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。