集成外部系统

走着路睡觉大约 5 分钟

集成外部系统

IDE支持接入外部系统,例如 Apache Maven, Gradle, sbt等

大部分外部系统都提供了下面类似的功能:

  • 外部系统的配置文件(pom.xml,build.gradle.kts等)

  • 一些task

  • 执行某一个task

外部系统可以使用External System 提供的api封装自己的功能,用于扩展IDE的处理逻辑

项目管理

External System 需要能够根据指定外部系统配置文件来构建项目。构建过程需要用到以下几个类:

DataNodeopen in new window

Keyopen in new window

ExternalEntityDataopen in new window

DataNode 类只是用来存储目标数据(用key定义data type)。有向图(directed graph) 管理多个 DataNode 之间的父子关系。例如:一个简单的项目中的 DataNode 之间的关系如下图:

IDE 提供了一组内置的 KeyExternalEntityData 类,但任何外部系统集成或第三方插件开发人员都可以通过自定义 KeyExternalEntityData 并将它们存储在适当 DataNode 的子节点中来增强项目数据。

管理项目数据

ProjectDataServiceopen in new window 可以执行外部系统配置文件中定义的项目数据。

可以使用 ProjectDataService 处理基于外部系统配置构建的项目数据,它使用合适的策略来管理 ExternalEntityData 。例如:当我们想从外部模型中引入一个项目时,我们会从最上层的关联了项目数据的DataNode开始,然后使用对应的服务来引入项目。

plugin.xml使用 com.intellij.externalProjectDataService 扩展点 注册自定义服务。

我们可以把项目管理和解析分开。这表示可以为特定的项目技术引入一组 DataNode、Key 和 ProjectDataServices,然后每个外部系统都可以在必要时使用它来构建相应的数据。

从外部模型导入

IntelliJ Platform 提供了从外部模型中导入项目的API:

下面2个类使用模板模式(设计模式)提供了模板方法,可以简化实现步骤:

实现完成后需要在plugin.xml 使用 com.intellij.projectImportBuildercom.intellij.projectImportProvider 扩展点 进行注册

示例:Gradle的实现如下:

自动导入

当修改了外部系统配置文件时,可以自动刷新项目结构。

提示

从 2020.1 开始, 用户可以关闭自动导入功能

Auto-Import for ExternalSystemManager Implementation

Describe project's settings files to track by having external system ExternalSystemManageropen in new window implement ExternalSystemAutoImportAwareopen in new window.

提示

The ExternalSystemAutoImportAware.getAffectedExternalProjectPath() method is called quite often, that's why it's expected to return control as soon as possible. Helper CachingExternalSystemAutoImportAware class might be used for caching, i.e. ExternalSystemManager which implements ExternalSystemAutoImportAware can have a field like new CachingExternalSystemAutoImportAware(new MyExternalSystemAutoImportAware()) and delegate ExternalSystemAutoImportAware.getAffectedExternalProjectPath() calls to it.

独立外部系统的自动导入

没有 ExternalSystemManager (例如:maven)的外部系统想要实现自动导入,可以实现 ExternalSystemProjectAware 接口,通过该接口监控配置文件,及重新加载项目模型,最后再通过 ExternalSystemProjectTracker 进行注册。

提示

一个外部系统可以对应多个 ExternalSystemProjectAware 实例,所以外部系统可以监控多个配置文件及重新加载项目(例如监控项目的配置文件,监控Module的配置文件,外部系统的配置文件等等)

重新加载的通知图标

从2020.1版本开始,每一个外部系统可以指定自己的重新加载通知图标。实现 ExternalSystemIconProvideropen in new window 接口,重写 getReloadIcon() 方法 ,并在 plugin.xml 里使用com.intellij.externalIconProvideropen in new window 扩展点 进行注册即可,代码如下:

//实现 ExternalSystemIconProvider接口
public class ExternalSystemIconProviderImpl implements ExternalSystemIconProvider {
    @NotNull
    @Override
    public Icon getReloadIcon() {
        //返回图标
        return AllIcons.Idea_logo_welcome;
    }
}
<!--注册扩展点-->
 <extensions defaultExtensionNs="com.intellij">
        <externalIconProvider id="ExternalSystemIconProviderImpl" implementationClass="action.ExternalSystemIconProviderImpl"></externalIconProvider>
    </extensions>

设置

所有的外部系统设置控制器都实现了 ExternalSystemSettingsControlopen in new window 接口。外部系统设置UI包括以下几个部分:

  • 通用的系统设置

  • 链接外部项目列表

  • 选中项目的 Project-level设置

实现 Project-level 设置控制器推荐 继承 AbstractExternalProjectSettingsControlopen in new window,它已经实现了上述功能。

示例

修改导入项目时的设置,需要 AbstractImportFromExternalSystemControlopen in new window 的子类(包含要导入项目的路径控制器)来替换外部项目列表

测试

Use com.jetbrains.intellij.platform:external-system-test-framework from IntelliJ Platform Artifacts Repositories.open in new window

Relevant base classes:

上次编辑于:
贡献者: zhaojingbo
Loading...