本文正在参加「金石计划」
在上节 《自定义IDEA插件 → 划词翻译替换(上)》 中,杰哥先是踩了个 JDK版本问题的大坑,借鉴网上教程 写了个简单Demo跑起来,最后 借助ChatGPT快速实现了划词翻译替换功能。
写完就迫不及待想发这个插件给亲朋好友分 (zhuang)享(bi),但翻译用到的APPID和KEY都是写死我自己的。所以不太好Share,所以本节就来为这个插件开发一个 简单的设置页,让插件用户可以填写自己的翻译APPID和KEY。当然,顺带也讲下 插件的打包及发布。
话不多说,直接开冲~
0x1、编写设置页UI
同样,直接问ChatGPT:
非常简单明了,直接CV这个 applicationConfigurable 标签的代码到 plugin.xml中:
直接报错,em...又开始瞎编了是吧 (也可能是版本问题),并没有找到这两个引用,configurableClass明显是指向设置Class的。试了下属性,implementation 可以,但是已经废弃,点开具体的类 ConfigurableEP,发现可以用 instance 代替:
新建一个 CpStringFormatConfig 类继承 com.intellij.openapi.options.Configurable 类:
createComponent() 这个方法会生成设置面板的UI,这里直接Copy了ChatGPT提供的代码示例,接着配置下plugin.xml:
执行runIde运行一波:
nice,在Settings页面可以看到我们的插件设置页了,接着完善下这个设置页,这里就 不手敲+脑补UI 了,毕竟awt的API我们也不熟,直接使用 Swing Designer 拖拉控件,自动生成:
定义表单UI为 → PluginSettingUI:
左侧会生成两个文件 → .form文件及对应的.java文件
点击from文件开始界面设计:
从右侧拖拽组件到画板,然后按需调整组件属性就不用介绍了吧,这里杰哥简单拖拉出页面~
打开对应的java文件,可以看到 field name对应的就是控件实例,顺带写一个返回根Panel的方法:
回到我们的设置类 CpStringFormatConfig,实例化一个PluginSettingUI实例,然后重写 createComponent(),调用 getContentPanel() 返回布局:
运行看看效果:
nice!这里本来加了一个清空和保存的按钮,不过后面想想有些呆,直接在点击Apply或者OK时保存就完事了~
0x2、设置参数的读写
然后,我们需要一个东西来保存 设置页的配置参数,方法有很多,这里直接用最简单的方式 → 内置的 com.intellij.ide.util.PropertiesComponent,通过键值对的方式保存配置信息。接着就是读写参数的流程:
- 打开设置页,读取参数,有的话自动填充;
- 点击Apply,保存参数;
组件类 PluginSettingUI 加点代码,暴露读写appId和key的方法:
然后回到 CpStringFormatConfig 改下代码:
接着运行验证,可以发现设置的参数已经保存成功了。接着就是在需要用到翻译的Action读写appid和key了,直接改 TranslateUtil:
编译运行后,尝试不填写appid和key,直接转换,弹窗如愿出现:
接着输入自己的appid和key,点击apply,如果这两个参数无误的话,插件就能正常工作啦~
接着就可以跟亲朋好友share啦~
0x3、插件打包
双击Gradle面板的 buildPlugin Task即可开始打包:
注意 plugin.xml 黄框部分的信息要完善下哦,不然会打包失败!!!
打包后会在根目录生成build文件夹,打包后的插件就在 \build\distributions 目录下,无依赖的插件是JAR包,有依赖的插件是ZIP包。
然后就可以在其它IDE里安装这个插件,比如我搞到我的AS里,依次:File → Settings → Plugins → 点小齿轮 → 选择Install Plugin from Disk → 选中插件包:
然而,报错了:
我擦,到这一步你跟我说 写了大半天的插件 不能放到新的IDEA上???
裤子都TM脱了,放弃是不可能放弃的,然后看到了这篇文章 《IDEA 2021及以上版本Lombok插件无法安装的问题》,简单概括下解决流程:
- 解压软件直接打开插件Zip包 → Jar包 (不是解压!!!)
- 进入META-INF文件夹下,打开plugin.xml文件;
- 找到:<idea-version> 标签,把 since-build、until-build 改成自己的IDE版本。
比如我生成的插件包:
我的AS对应的IDEA版本:
改成:
<idea-version since-build="211" until-build="211.*"/>
然后保存,压缩软件一般会弹窗:
是,然后再次安装,TM就可以了:
当然,这是治标不治本的方法,我不可能每次打包完都自己手动改一遍吧?然后又发现了这篇文章:IntelliJ Plugin - 插件发布多版本兼容性,它给出的解决方法如下:
① plugin.xml 中 直接指定插件支持的最低和最高版本:
<idea-plugin>
<idea-version since-build="211" until-build="213.*" />
</idea-plugin>
② build.gradle 的 intellij dsl里将 updateSinceUntilBuild设置为false:
intellij {
version 'xx.x.x'
updateSinceUntilBuild = false
}
再次编译会报错:
The CpStringFormat (id=cn.coderpig.CpStringFormat, path=~\IdeaProjects\CpStringFormat\build\idea-sandbox\plugins\CpStringFormat, version=1.0-SNAPSHOT) plugin is incompatible (reason: since build 211.0 > IC-202.8194.7, target build range is 211 to 213.*)
但是插件包却正常生成了,打开它的plugin.xml文件,可以看到设置生效了,而且插件包也能正常安装~
安装后打开Setting找到我们的插件,输入下百度翻译的appID和key,就能开心玩耍啦~
0x4、发布市场
打开 Marketplace,需要注册一个 Jetbrains账号,也可以用第三方账号授权登录 (如Google、Github等)。登陆完点击右上角的 Upload plugin 提交插件:
依次是:选择插件包、选择License、源码URL(因为我选的开源协议)、标签
然后点击Upload即可上传至 Marketplace,然后会跳转插件详情页,可以在这里完善一些插件细节,图片描述啥的:
然后就是等系统审核了,一般在两个工作日内完成,审核完就可以在Marketplace中搜索到插件下载使用啦。
另外,Gradle还支持 直接将本地的插件发布到提交到插件存储库中,前提是手动提交过一次,因为需要 Token,审核通过后,在这里生成Token即可。
因为我的插件还没审核通过,没法演示,具体流程可以参考这篇文章:《Idea插件开发(二)——插件的创建打包及发布》,应该相差无几~
0x5、小结
本节先在原有插件的基础上添加了一个 设置页,让用户可以填写自己的百度翻译appId和Key,接着执行 buildPlugin 打包插件,在安装到自己的AS时 遇到插件兼容的问题,通过调整配置,最终成功安装,并发布到 Marketplace 上。
开发这个插件的过程真的是一波N折啊,不过所幸还是搞出来了,当然现在还很简陋,但是 可订制啊!!!读者有什么字符串格式化的需求可以在评论区提,动手能力强的甚至可以自己上手改代码~
直接给出仓库地址:CpStringFormat,懒得折腾得的直接下插件包:CpStringFormat-0.0.1-SNAPSHOT.zip
最后安利一个不错的仓库:judasn/IntelliJ-IDEA-Tutorial,玩转IDEA插件必备啊,就酱~