你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

intellij idea activiti 开源项目版本号更新难?一键迁移工具或成解决之道

发布时间:2025-06-22

浏览次数:0

图片

该网页上的图片链接指向的图片文件版本已进行升级。

开源项目中最让人头疼的是如何得知新版本的发布,以及新版本中解决了哪些问题。就像这张图所示,若能设置一个提醒机制,每次新版本发布时都能通知我,告知新版本新增了哪些功能、修复了哪些问题,并与我当前使用的版本进行对比,明确是否需要修改代码才能直接升级,那无疑会大大简化操作流程。

图片

提供便捷的在线服务,实现图片文件从原地址至目标位置的快速转移,名为“http://.cn//img/image/.png一键迁移工具”。

官网内置了图形界面的迁移助手,可便捷地将数据从其他路由器迁移过来。然而,在使用过程中,还需额外下载一款应用程序。鉴于代码已开源,若将此功能直接集成到开发工具中,无疑将大大提升便利性。

图片

导航跳转是通过什么方式完成的?

在 idea 插件的开发过程中,存在一个至关重要的类别,该类别由提供的 SDK 所提供。该类别充当代码每一行的标识提供者,与图中代码侧面的标识相对应,其创建方式如下。

例如,在这款设计插件中,通过以下代码实现了一个侧边栏的行标记功能:

if若(allMarkerStatus[key]不等于STATUS_SHOWN),{
所有标记的状态中,以key为键的值被设置为显示状态。

构建器将边距图标渲染器的对齐方式设定为居中。
    builder.setTargets(all)
    if若目标内容的类型等于注释类型或动作类型,则执行。
构建器设定了工具提示的标题为:"TheRouter:跳转到使用处")
    } else {
        builder.setTooltipTitle("TheRouter:跳转到声明处")
    }
result中添加了builder依据psiElement创建的行标记信息。
}

在这个功能中,我们使用点括号来定义一个侧边栏的行标记,该标记接受一个图片资源作为输入。根据需要展示的内容类型,我选择了相应的资源图片进行返回。

fun getIcon(type: Int): Icon {
    return when (type) {
TYPE_ANNOTATION映射至IconLoader的getIcon方法,以获取图标。"/icon/icon_from.png")
TYPE_NAVIGATION操作将触发IconLoader类中的getIcon方法执行。"/icon/icon_to.png")
TYPE_ACTION映射至IconLoader的getIcon方法。"/icon/icon_from.png")
        else -> IconLoader.getIcon("/icon/icon_warn.png")
    }
}

找到要跳转的psi

解决了显示的标记,剩下的就是找到点击标记后要跳到哪里了。

在 idea 插件的 SDK 中,存在一个至关重要的类别,即 PSI(程序结构接口),其核心职能是解析文件内容、构建语法和语义代码。每个 PSI 实例都代表了一条我们需处理的代码语句。

在上述代码中,存在一个关键的方法.(),它指示点击相应图标后应跳转至何处。该代码段中的参数all代表一个集合,若集合中仅有一个元素,点击后便会直接进行跳转;若集合包含多个元素,则会弹出一个选择界面,供插件使用者自行挑选目标进行跳转。

此all集合的获取途径源自另一个SDK所提供的方法。()。()该方法能够将项目内所有代码以psi形式呈现,便于你根据具体需求进行筛选,锁定跳转目标位置。具体操作方法,请参考以下代码片段:

private fun findAllTargetPsi(
    project: Project,
    filePath: String?,
    target: TargetContent
): Collection {
val allTargetPsi 为一个集合,该集合中包含了所有目标心理状态的数据。()
获取项目范围,使用全局搜索范围函数,对项目进行项目范围的界定。
val allCodeFiles = FilenameIndex通过项目信息获取所有扩展名为代码的文件列表,,,然后返回这些文件的集合。"kt", scopes)
所有代码文件集合中加入了Java文件。
    for (virtualFile in allCodeFiles) {
psiFile变量:等于PsiManager实例化对象在指定项目中查找virtualFile所对应的PsiFile。
        psiFile ?: return HashSet()

获取psiFile中的子元素,通过PsiTreeUtil工具类调用findChildrenOfType方法,参数为PsiElement类。
遍历properties集合中的每个元素,对psiElement进行操作。
allTargetPsi集合中新增了元素,该元素为TargetPsiElement,其中包含psiElement和psiFile的名称。
        }
    }
    return allTargetPsi
}

迁移工具是如何实现的

存在一个显而易见的缘由,即在规划阶段广泛借鉴了众多其他路由器的设计方案,依据官方的介绍:

之所以命名为如此,是因为“The”象征着独特性;在设计阶段,我们全面审视了所有现行的开源方案intellij idea activiti,广泛借鉴了其中的卓越成果,并且针对各方案的不足之处进行了补充和完善。

因此,在API层面,其与其他路由并无显著差异,故而迁移工具的核心功能在于“字符串替换”。关于替换的具体内容,此处不予赘述,下面重点来讲解如何在插件中实现UI弹窗的展示。

首先intellij idea activiti,我们需要构建一个类,这个类同样来源于所提供的SDK。它的功能是在菜单栏中展示一个菜单项,具体表现形式如下:,

图片

SDK同样已经准备好了弹窗的接口,开发者只需直接调用,便能够轻松实现弹窗功能。

class TransferAction : AnAction() {
私有变量routerNameList被定义为HashMap类型()
覆盖函数fun,在事件触发时执行,事件类型为AnActionEvent。
return
获取版本号后,变量val被赋值为该版本号。

        if (MessageDialogBuilder
                .okCancel(
                    "TheRouter 一键迁移工具",
                    "当前项目为:$projectPath\n\n即将迁移至 TheRouter $latestVersion。迁移完成后,会在桌面生成改动日志。请注意查看:\n\n${file.absolutePath}。"
                )
                .noText("取消")
                .yesText("开始迁移")
图标设置为获取信息图标。
                .ask(project)
        ) {
            routerNameList["ARouter"执行项目路径的转移操作,指定最新版本,并处理相关文件。
        }
    }
}

插件开源

本工程已依照2.0版本协议进行开源,同时已将插件发布至市场平台,热忱邀请大家关注并下载。

:https://.com/kymjs/

插件下载:  https://..com//20047-

插件下载

打开 -> -> ->

搜索

点击下载

重启

https://.cn//img/image/.jpg

向大家推荐我的网站,网址是https://www.yuque.com/,只需点击原文即可一键直达。

专注 -- 欢迎大家访问

往期推荐

如有侵权请联系删除!

13262879759

微信二维码