IntelliJ IDE 插件开发 | (十三)自定义项目脚手架(下)

news2024/11/25 23:33:35

系列文章

本系列文章已收录到专栏,交流群号:689220994,也可点击链接加入。

前言

在上一篇文章中介绍了如何在 IDEA 中自定义项目脚手架,本文将介绍如何在WebStormPyCharmCLion等其它 IntelliJ 主流平台中如何自定义项目脚手架,参考本文的思路,开发其它平台 IDE 的脚手架也很容易,本文就不再逐一介绍,本文涉及到的完整代码已上传到GitHub。

最终效果

CLion

动画

PyCharm

动画

WebStorm

动画

写在前面

由于在上一篇文章中已经介绍了项目脚手架中创建模板及使用的方式和 UI 布局相关的内容,本文就不再介绍相关内容,并且统一将其放到了工具类TemplateUtils中,代码如下:

object TemplateUtils {
    
    const val PLUGIN_NAME = "TEMPLATE"
    
    // UI 界面
    fun initUI(settings: TemplateSettings) = panel {
        row("Name: ") {
            textField().align(AlignX.FILL).onChanged {
                settings.name = it.text
            }
        }.topGap(TopGap.MEDIUM)

        row("Description: ") {
            textField().align(AlignX.FILL).onChanged {
                settings.description = it.text
            }
        }.topGap(TopGap.MEDIUM)
    }
    
    // 使用模板及生成文件
    fun generateFile(project: Project, basePath: String, settings: TemplateSettings) {
        val template = FileTemplateManager.getInstance(project).getJ2eeTemplate(TemplateFileFactory.PLUGIN_XML)
        val properties = Properties()
        properties.setProperty("name", settings.name)
        properties.setProperty("description", settings.description)
        val renderedText = template.getText(properties)
        FileUtil.writeToFile(File("${basePath}${File.separator}demo.txt"), renderedText)
    }
    
}

后续三个 IDE 创建脚手架均会调用该类中的两个方法分别用于设置 UI 布局及生成模板文件。

实现方式

不同于 IDEA 中使用ModuleBuilder去创建自定义脚手架,其它平台则是需要实现DirectoryProjectGenerator接口并在plugin.xml中进行注册(参考下面的配置):

<directoryProjectGenerator
    implementation="cn.butterfly.template2.module.WebTemplateGenerator"/>

不过在其它平台,并不是直接去实现DirectoryProjectGenerator接口就可以一劳永逸,针对不同的 IDE 都会有自己特定的Generator类,我们需要去实现这些特定的Generator类才能顺利实现,例如引入了com.intellij.clion插件后,查看DirectoryProjectGenerator的实现类就会发现很多 C 相关的Generator类。

image-20241006203636746

本文中WebStorm通过实现WebProjectTemplate来完成,PyCharm通过实现PythonProjectGenerator来完成,CLion则是通过实现CLionProjectGenerator来完成。

经测试,直接实现DirectoryProjectGenerator接口,可以在WebStorm中成功,实现WebProjectTemplate 类则可以在WebStormPyCharm中成功,同时针对WebStorm还可以去实现NpmPackageProjectGenerator类,可以参考Vue插件的源码。总之,针对不同的插件,需要实现的类也可能有所不同,不过只需要记住在引入了相关语言插件后,去查看DirectoryProjectGenerator接口的实现类,然后根据名字查找判断即可。

实现步骤

CLion

首先需要增加com.intellij.clion语言插件,然后在plugin.xml中增加如下配置:

<depends>com.intellij.clion</depends>

<directoryProjectGenerator implementation="cn.butterfly.template2.module.CTemplateGenerator"/>

之后实现CLionProjectGenerator类即可:

class CTemplateGenerator : CLionProjectGenerator<Any>() {

    // 1
    private val settings = TemplateSettings()

    // 2
    override fun getDescription() = TemplateUtils.PLUGIN_NAME

    // 3
    override fun getName() = TemplateUtils.PLUGIN_NAME

    // 4
    override fun getLogo() = PluginIcons.TEMPLATE_ICON

    // 5
    override fun generateProject(project: Project, baseDir: VirtualFile, obj: Any, module: Module) =
        TemplateUtils.generateFile(project, baseDir.path, settings)

    // 6
    override fun getSettingsPanel() = TemplateUtils.initUI(settings)

}

其中 1 用于保存配置字段值,234 则是脚手架的基本信息,56 则是调用了TemplateUtils工具类中的两个方法分别用于生成模板文件和设置 UI 布局。

PyCharm

首先需要增加PythonCore:242.21829.3语言插件,然后在plugin.xml中增加如下配置:

<depends>com.intellij.modules.python</depends>

<directoryProjectGenerator implementation="cn.butterfly.template2.module.PyTemplateGenerator"/>

之后实现PythonProjectGenerator类即可:

class PyTemplateGenerator : PythonProjectGenerator<PyNewProjectSettings>() {

    // 1
    private val settings = TemplateSettings()

    // 2
    private var basePath = ""

    // 3
    override fun getDescription() = TemplateUtils.PLUGIN_NAME

    // 4
    override fun getName() = TemplateUtils.PLUGIN_NAME

    // 5
    override fun getLogo() = PluginIcons.TEMPLATE_ICON

    // 6
    override fun getSettingsPanel(baseDir: File?): JComponent {
        basePath = baseDir?.path ?: ""
        return TemplateUtils.initUI(settings)
    }

    // 7
    override fun configureProject(
        project: Project,
        baseDir: VirtualFile,
        settings: PyNewProjectSettings,
        module: Module,
        synchronizer: PyProjectSynchronizer?
    ) {
        super.configureProject(project, baseDir, settings, module, synchronizer)
        basePath = baseDir.path
    }

    // 8
    override fun afterProjectGenerated(project: Project) =
        TemplateUtils.generateFile(project, basePath, settings)


其中 1 用于保存配置字段值,2用于保存项目路径,345 则是脚手架的基本信息,6 则是保存项目路径信息和设置 UI 布局,7 也用于保存项目路径信息,8 则是用于生成模板文件。

WebStorm

直接在plugin.xml中增加以下配置:

<directoryProjectGenerator
    implementation="cn.butterfly.template2.module.WebTemplateGenerator"/>

之后实现WebProjectTemplate类即可:

class WebTemplateGenerator : WebProjectTemplate<TemplateSettings>() {

    // 1
    private val webSettings = TemplateSettings()

    // 2
    override fun getDescription() = TemplateUtils.PLUGIN_NAME

    // 3
    override fun getName() = TemplateUtils.PLUGIN_NAME

    // 4
    override fun getLogo() = PluginIcons.TEMPLATE_ICON

    // 5
    override fun createPeer(): ProjectGeneratorPeer<TemplateSettings> = object : ProjectGeneratorPeer<TemplateSettings> {
        override fun getComponent() = TemplateUtils.initUI(webSettings)

        override fun buildUI(step: SettingsStep) {
        }

        override fun getSettings() = webSettings

        override fun validate() = null

        override fun isBackgroundJobRunning() = true

    }

    // 6
    override fun generateProject(project: Project, baseDir: VirtualFile, settings: TemplateSettings, module: Module) =
        TemplateUtils.generateFile(project, baseDir.path, webSettings)

}

其中 1 用于保存配置字段值,234 则是脚手架的基本信息,56 则是调用了TemplateUtils工具类中的两个方法分别用于生成模板文件和设置 UI 布局。

可以看到针对不同的 IDE 都有各自创建脚手架的方式,但总体差异不大,思路也一样,核心就是找到满足要求的Generator类即可。

总结

本文简单介绍了如何在除 IDEA 外的 IntelliJ IDE 中创建自己的脚手架,参考本文的思路也很容易在除本文外的其它 IDE 中实现自定义脚手架,如果大家在实现的过程中遇到了什么问题,也欢迎一起交流讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2193245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文速看】DL最新进展20241006-视频深度估计、3D、自监督学习

目录 【视频深度估计】【3D】【自监督学习】 【视频深度估计】 [TPAMI 2024] NVDS: Towards Efficient and Versatile Neural Stabilizer for Video Depth Estimation 论文链接&#xff1a;https://arxiv.org/pdf/2307.08695 代码链接&#xff1a;https://github.com/RaymondW…

地理空间数据存储与处理:MySQL空间数据类型的优化与应用!

在 MySQL 数据库中&#xff0c;空间数据类型用于存储和处理地理空间数据。这些数据类型允许我们在开发时可在数据库中存储和操作地理位置、几何形状和地理空间关系等信息。 一、什么是空间数据类型 MySQL 中的空间数据类型主要包括以下几种&#xff1a; GEOMETRY&#xff1a…

【无人水面艇路径跟随控制3】(C++)USV代码阅读: ROS包的构建和管理:包的依赖关系、包含目录、库文件以及链接库

【无人水面艇路径跟随控制3】&#xff08;C&#xff09;USV代码阅读&#xff1a; ROS包的构建和管理&#xff1a;包的依赖关系、包含目录、库文件以及链接库 写在最前面ROS是什么CMakeLists.txt总结详细解释CMake最低版本和项目名称编译选项查找catkin包catkin包配置包含目录添…

(刷题记录5)盛最多水的容器

盛最多水的容器 题目信息&#xff1a;题目思路(环境来自力扣OJ的C)&#xff1a;暴力枚举&#xff1a;双指针&#xff1a;移动高度较高的指针移动高度较低的指针 复杂度&#xff1a;代码与注释&#xff1a;暴力枚举&#xff1a;双指针&#xff1a; 题目信息&#xff1a; 给定一…

windows 找不到文件 Microsoft Net Framework 3.5 windows Driver Foundation(WDF).exe

问题 正常更新windows 11的时候发现这个问题。 重启也无法完成下面的更新&#xff0c;重启之后还是显然要更新&#xff1a; 解决方法 中文网站没有找到解决方案。微软官网总是给不靠谱的解决方案。 从有关上看到一个印度语音的视频&#xff0c;用的方法可行。借鉴过来。 …

【机器学习】机器学习框架

机器学习框架是支持开发、训练、和部署机器学习模型的工具集和库&#xff0c;以下是一些主流的机器学习框架及其特点&#xff1a; 1. TensorFlow 特点: 由 Google 开发&#xff0c;支持从研究到生产的大规模部署&#xff0c;广泛应用于深度学习模型。优势: 强大的可扩展性&am…

golang gin入门

gin是个小而精的web开发框架 官方文档 安装 go get -u github.com/gin-gonic/gin最简单的起手代码 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON…

【自用】王道文件管理强化笔记

文章目录 操作系统引导:磁盘初始化文件打开过程角度1文件的打开过程角度2 内存映射的文件访问 操作系统引导: ①CPU从一个特定主存地址开始&#xff0c;取指令&#xff0c;执行ROM中的引导程序(先进行硬件自检&#xff0c;再开机) ②)将磁盘的第一块–主引导记录读入内存&…

【机器学习】深度学习、强化学习和深度强化学习?

深度学习、强化学习和深度强化学习是机器学习的三个重要子领域。它们有着各自独特的应用场景和研究目标&#xff0c;虽然都属于机器学习的范畴&#xff0c;但各自的实现方式和侧重点有所不同。 1. 深度学习&#xff08;Deep Learning&#xff09; 深度学习是一种基于神经网络的…

2024 年在线翻译谁称霸?论文翻译场景大揭秘!

现在这世界&#xff0c;语言就是把我们连在一起的绳子&#xff0c;挺关键的。不管搞研究、做生意还是传文化&#xff0c;翻译得又快又准。2024年&#xff0c;翻译这行竞争挺猛的&#xff0c;各种在线翻译工具都挺拼的。咱们今天就聊聊论文翻译&#xff0c;瞅瞅谁能在这场翻译比…

Meta 发布 Quest 3S 头显及 AR 眼镜原型:开启未来交互新视界

简介 在科技的浪潮中&#xff0c;Meta 始终站在创新的前沿&#xff0c;不断为我们带来令人惊叹的虚拟现实和增强现实体验。2024 年 10 月 6 日&#xff0c;让我们一同聚焦 Meta 最新发布的 Quest 3S 头显及 AR 眼镜原型&#xff08;Orion&#xff09;&#xff0c;探索这两款产品…

【Blender Python】5.Blender场景中的集合

概述 这里的“集合”是指Blender场景中的集合。你可以在“大纲视图”面板中看到 图标的&#xff0c;就是集合&#xff0c;可以看做是文件夹&#xff0c;用于分类和整理场景中的对象。 获取场景的集合 >>> C.scene bpy.data.scenes[Scene]>>> C.scene.coll…

nodejs 构建高性能服务器的关键技术

nodejs 构建高性能服务器的关键技术 演示地址 演示地址 源码地址 源码地址 获取更多 获取更多 在现代 Web 开发中&#xff0c;Node.js 已成为构建高性能、可扩展网络应用的首选平台之一。它的非阻塞 I/O 模型与事件驱动架构使其能够在处理大量并发请求时表现出色&#xff0…

环形缓冲区(Ring Buffer)在STM32 HAL库中的应用:防止按键丢失

环形缓冲区&#xff08;Ring Buffer&#xff09;又称为循环缓冲区或圆形队列&#xff0c;是一种数据结构&#xff0c;它用于管理固定大小的数据存储空间。环形缓冲区本质是一个一维数组&#xff0c;不过是收尾相连的&#xff0c;类比一条蛇咬自己尾巴。 环形缓冲区重要性&…

危机四伏|盘点紧盯我国的五大APT组织

毒云藤&#xff08;APT-C-01&#xff09; 命名&#xff1a;该组织是 360 独立发现的&#xff0c;并率先披露了该组织的部分相关信息符合 360 对 APT 组织就行独立命名的条件。 360 威胁情报中心将 APT-C-01 组织命名为“毒云藤”&#xff0c;主要是考虑了以下几方面的因素&…

L1415 【哈工大_操作系统】CPU调度策略一个实际的schedule函数

L2.7 CPU调度策略 1、调度的策略 周转时间&#xff1a;任务进入到任务结束&#xff08;后台任务更关注&#xff09;响应时间&#xff1a;操作发生到响应时&#xff08;前台任务更关注&#xff09;吞吐量&#xff1a;CPU完成的任务量 响应时间小 -> 切换次数多 -> 系统…

curses函数库简介及使用

curses函数库简介及使用 导语curses简介屏幕输出读取清除移动字符 键盘键盘模式输入 窗口WINDOW常用函数屏幕刷新优化 子窗口keypad彩色显示pad总结参考文献 导语 curses函数库主要用来实现对屏幕和光标的操作&#xff0c;它的功能定位处于简单文本行程序和完全图形化界面之间…

【重学 MySQL】五十八、文本字符串(包括 enum set)类型

【重学 MySQL】五十八、文本字符串&#xff08;包括 enum set&#xff09;类型 CHAR 和 VARCHARTEXT 系列ENUMSET示例注意事项 在 MySQL 中&#xff0c;文本字符串类型用于存储字符数据。这些类型包括 CHAR、VARCHAR、TEXT 系列&#xff08;如 TINYTEXT、TEXT、MEDIUMTEXT 和 L…

鸿蒙开发(NEXT/API 12)【管理应用与Wear Engine服务的连接状态】手机侧应用开发

监测应用与Wear Engine服务的连接状态 华为运动健康App在后台停止服务&#xff08;如功耗过高&#xff09;&#xff0c;从而导致应用与Wear Engine服务的连接状态发生变化。对于类似这种不确定的断开情况&#xff0c;开发者可以通过本功能特性了解当前应用和Wear Engine的连接…

NatGo我的世界联机篇

书接上回 这里的TCP是JAVA&#xff0c;UDP是BE&#xff0c;选自适合你的映射类型 内网端口就填下面图片在你游戏同一个地方的数字!!! 就是我填12345的地方&#xff0c;mod-自定义局域网联机 默认 25565&#xff0c;如果出现无法创建本地游戏&#xff0c;那可能是端口被占用或…