1. 背景

插件体系是IDEA的精髓,插件市场里拥有无数开发者提交的插件,这让IDEA拥有了成长的能力。下面我通过一个例子,介绍插件创建、调试和发布的完整过程。

2. 开发步骤

2.1 创建工程

官方推荐2种方式来创建插件工程,一种是基于Github的模板代码,一种是基于Gradle手动配置。我推荐使用Github模板的方式,插件工程clone下来就可以直接执行,对新人比较友好。

2.2.1 模板代码

  1. 打开模板的Github地址:https://github.com/JetBrains/intellij-platform-plugin-template。

  2. 点击“Use this template”,将项目fork到自己的仓库里,或者直接下载模板代码。 

2.2.2 Gradle方式

在new project的时候,选择Gradle->IntelliJ Platform Plugin

2.2 开发插件

IDEA里有一个Intention action(代码推测)功能,快捷键是shift+enter。我们尝试新增一种代码推测,在输入类名后,通过推测自动生成new语句。例如,输入“User”,生成“User user = new User();”。

2.2.1 编写代码(Kotlin)

要新增Intention action功能,就要实现IntentionAction接口,实际代码里是用PsiElementBaseIntentionAction这个抽象类,它已经继承了IntentionAction。功能代码如下,IntentionAction接口里的核心方法是isAvailable()和invoke()方法。isAvailable()是在敲下shift+enter时,判断当前action是否满足执行条件;invoke()是选择aciton后,需要执行的逻辑。

class NewObjectGenerator : PsiElementBaseIntentionAction() {override fun isAvailable(project: Project, editor: Editor, element: PsiElement): Boolean {// 格式Userreturn element is PsiIdentifier && element.parent is PsiJavaCodeReferenceElement}@Throws(IncorrectOperationException::class)override fun invoke(project: Project, editor: Editor, element: PsiElement) {val typeName = element.text// 变量名第一个字母改成小写val varName = typeName.replaceRange(0, 1, ""+typeName.get(0).toLowerCase())val containingFile = element.containingFileval psiDocumentManager = PsiDocumentManager.getInstance(project)val document = psiDocumentManager.getDocument(containingFile)val statement = " $varName = new ${typeName}();"val offset = element.endOffset// 在当前元素的后面,插入文本document!!.insertString(offset, statement)}override fun getFamilyName(): @IntentionFamilyName String {return "new对象"}override fun getText(): @IntentionFamilyName String {// 提示的名称return "new对象"}
}

2.2.2 注册Aciton

resource/META-INF/plugin.xml是插件的配置文件,将自定义的action类注册到配置文件里去。

<extensions defaultExtensionNs="com.intellij"><intentionAction><className>com.github.commongenerator.actions.NewObjectGenerator</className></intentionAction>
</extensions>

2.2.3 启动插件

执行:gradle->intellij->runide

会在沙箱里启动ide实例,这个实例能访问到最新的插件代码,也可以通过Debug模式启动。

2.2.4 测试插件

在User类名上,通过shift+enter触发Intention action,弹出了“new对象”提示。

2.3 发布插件(插件市场)

2.3.1 手工发布

先在插件市场创建插件,需要上传jar包。在执行过runide后,会在build/libs下生成jar包。

如果是正式的版本,就插件就会进入审核状态。

2.3.2 自动发布

通过publishPlugin脚本,可以在idea上直接发布插件到市场。build.gradle.kts里配置了publishPlugin相关的参数,配置里提示我们需要在系统环境变量里提供PUBLISH_TOKEN。

申请PUBLISH_TOKEN

PUBLISH_TOKEN通过插件超市的个人页面上申请。

设置PUBLISH_TOKEN

我用的是zsh,所以在~/.zshrc文件里添加了环境变量

export PUBLISH_TOKEN="perm:xxxxx"

发布插件

执行publishPlugin脚本

3. 总结

至此,插件的开发和发布流程就结束了。可以看出,jetbrain通过模板代码、发布脚本等方式,大大简化了插件的开发成本,让普通开发者也可以快速的开发出插件。IDEA作为我们最重要的开发工具,每个开发者都应该体验一下插件开发的乐趣。

4. 相关文献

IntelliJ Platform SDK官方文档:https://plugins.jetbrains.com/docs/intellij/getting-started.html

IntelliJ Platform SDK中文文档:IntelliJ Platform SDK / IntelliJ Platform SDK DevGuide

IDEA插件开发实战相关推荐

  1. 【Maven】maven 插件开发实战

    [Maven]maven 插件开发实战 附上我历时三个月总结的 Java 面试 + Java 后端技术学习指南,这是本人这几年及春招的总结,目前,已经拿到了大厂offer,拿去不谢! 下载方式 1.  ...

  2. CloudIDE插件开发实战:教你如何调试代码

    摘要:今天我们来重点介绍下CloudIDE插件的调试技巧,在插件开发过程中调试作为重要的问题分析和定位手段能够有效帮助开发者提升插件质量. 今天文章中的样例工程我们继续以上一篇<实战CloudI ...

  3. [js高手之路]jquery插件开发实战-选项卡详解

    在jquery中,插件开发常见的有: 一种是为$函数本身扩展一个方法,这种是静态扩展(也叫类扩展),这种插件一般是工具方法, 还有一种是扩展在原型对象$.fn上面的,开发出来的插件是用在dom元素上面 ...

  4. UNI APP---Android端原生插件开发实战(二)

    1.前言 最近一个项目要求我们的产品必须走网络隧道,并且提供了对应的SDK,很明显只能通过原生开发的方式才能实现这个流程,之前已经写过一篇通过代理的方式进行数据请求,而这次Android端的方式是采用 ...

  5. Chrome插件开发实战

    注意:google说2018年第一季度全面停用的 应用和 扩展不是一个东西,应用指的是 chrome apps 扩展指的是 chrome extension. 在几个月之前,我的一个朋友老张,跟我说了 ...

  6. 视频教程-3D建模理论与实战 - 使用Ruby进行SketchUp(草图大师)插件开发-其他

    3D建模理论与实战 - 使用Ruby进行SketchUp(草图大师)插件开发 澳大利亚工程师协会会员航空(航天)工程师.学习编程超过20年.6年3D建模软件研发经历.4年算法交易/数学建模经历. 张元 ...

  7. Maven插件开发教程

    Maven是一个一个优秀的项目管理开源框架,其插件机制为其功能扩展提供了非常大的便捷性.大多数情况下,我们不需要自己开发Maven插件,因为Maven本身提供了很多便捷的官方插件.但是对于某些特殊场景 ...

  8. golang微服务框架对比_微服务里程碑,Golang与Spring Cloud Alibaba完美结合

    目前微服务架构仍是软件架构中最新的热门话题,虽然Golang是一门新的语言,但Golang的性能比python和java高出不少.既能承受程序使用运行的服务构建的繁重负载,又容易与GitHub集成,管 ...

  9. Knowladge_网站学习_jQuery插件

    几个参考的jquery插件网站 1. 240 多个jQuery 插件 http://www.cnblogs.com/Terrylee/archive/2007/12/09/the-ultimate-j ...

  10. 2020软件开发趋势预测(学习总结)

    数字化,工业4.0,对软件开发人员的巨大需求. 云计算/云服务.容器技术.软件架构.编程语言.Web开发.APP.深度学习.数据库.数据湖.批处理.流处理.字节码(ByteCode).无代码(No-c ...

最新文章

  1. Rust 语言风靡学术界
  2. 你说我画,你画我说:全球最大中文跨模态生成模型文心ERNIE-ViLG来了!
  3. centos7 搭建 mysql8
  4. 从0-1教你利用服务器做属于自己的个人博客
  5. Python(88)_双下划线方法
  6. 5月份Github上最热门的数据科学和机器学习项目
  7. [小技巧] ArrayList与LinkedList对比与常见方法
  8. mysql开窗函数over_oracle分析函数技术详解(配上开窗函数over())
  9. 互联网晚报 | 9月30日 星期四 | 五菱与B站跨界合作;支付宝向“云闪付”开放支付场景;平安健康险上线“药划算”...
  10. qt5 窗体显示完毕信号_iPhone手机信号不好?试试这样设置,随时随地让你的手机信号满格...
  11. DirectX 9.0 SDK安装
  12. mysql集合查询的命令_MySQL数据库常用命令集合
  13. ppc上的DataGrid运用 (C#)(版本1.2)
  14. java 零配置_Spring零配置之@Configuration注解详解
  15. 语言(文化)代码与国家地区对照表,各国手机号正则
  16. 数据库sql脚本--省市县生成
  17. “落子无悔,抉择本身就是向前”——2022年度总结
  18. 【网络通信三】研华网关Modbus服务设置
  19. 毕业设计Spring boot问题记录(后端三):java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax;
  20. 工作流模式每个工作流引擎都会支持多种方式的表单。目前大家讨论到的大概有三种。 动态表单 外置表单 普通表单

热门文章

  1. 【信息学奥赛一本通】题解目录
  2. Java 类目树形结构查询
  3. mysql朋友圈设计_微信朋友圈技术实现设想
  4. Python第三方库大全
  5. GIF图像动态生成-JAVA后台生成
  6. 乔姆斯基生成语法_乔姆斯基的转换生成语法理论
  7. 使用SVN将项目从服务器下载到本地
  8. minist数据集的获取方法
  9. C# 电子签章的实现
  10. 非华为电脑安装华为电脑管家,实现与手机平板的多屏协同