愿将黄鹤翅,一借飞云空。——孟郊《上包祭酒》
当我们开发一款插件时,当其中的某些功能依赖其他插件时,就需要我们在插件中做额外的处理。
以下我们以依赖git插件为例子,做一个获取当前项目git用户名和当前分支的demo。
引入插件
1、插件id
我们可以去idea插件市场找到自己需要依赖的插件,在插件首页可以找到插件ID。这里我们用的是idea自带的git插件为例子,其id为
Git4Idea
。
**2、在我们的编译配置文件
build.gradle
中加入idea git插件的依赖**
intellij {
version '2019.3'
plugins =['Git4Idea','maven','java']
updateSinceUntilBuild =false}
**3、在项目的配置文件
plugin.xml
中声明依赖的插件**
<idea-plugin>
......
<depends>Git4Idea</depends></idea-plugin>
插件还可以指定可选的插件依赖项。在这种情况下,即使它依赖的插件没有安装或启用,插件也会加载,但插件的部分功能将不可用。
声明指向可选配置文件附加
optional="true"
和属性:
config-file
<idea-plugin>
......
<dependsoptional="true"config-file="myPluginId-git.xml">Git4Idea</depends></idea-plugin>
使用外部插件的服务
根据上面的配置,我们已经将
Git4Idea
插件引入到咱们插件中了,下面我们在自己插件中获取
idea
打开项目的git的登录名称和登录邮箱。
packagecom.my.intellij.idea.plugins;importcom.intellij.dvcs.DvcsRememberedInputs;importcom.intellij.openapi.actionSystem.AnAction;importcom.intellij.openapi.actionSystem.AnActionEvent;importcom.intellij.openapi.project.Project;importcom.intellij.openapi.ui.Messages;importcom.intellij.vcs.log.VcsUser;importgit4idea.GitUserRegistry;importgit4idea.remote.GitRememberedInputs;importgit4idea.repo.GitRepository;importgit4idea.repo.GitRepositoryManager;importjava.util.List;publicclassDemoWindowsextendsAnAction{@OverridepublicvoidactionPerformed(AnActionEvent e){Project project = e.getProject();GitRepositoryManager manager =GitRepositoryManager.getInstance(project);List<GitRepository> gitRepositories = manager.getRepositories();GitUserRegistry registry =GitUserRegistry.getInstance(project);VcsUser vcsUser = registry.getOrReadUser(gitRepositories.get(0).getRoot());if(vcsUser ==null)return;Messages.showInfoMessage(vcsUser.getEmail(), vcsUser.getName());}}
<idea-plugin>
......
<depends>com.intellij.modules.lang</depends><depends>Git4Idea</depends><!-- <depends--><!-- optional="true"--><!-- config-file="myPluginId-git.xml">Git4Idea</depends>--><extensionsdefaultExtensionNs="com.intellij"><!-- intellij的自定义扩展点信息--></extensions><actions><!-- 自定义actions --><actionid="DemoWindows"class="com.my.intellij.idea.plugins.DemoWindows"text="DemoWindows"description="DemoWindows"><!--action展现的位置--><add-to-groupgroup-id="ProjectViewPopupMenu"anchor="last"/></action></actions></idea-plugin>
我们运行下看下效果吧。
以上就是简单的展示下我们依赖外部插件实现的某些功能,那么如果我们想要在其他插件使用过程中加上自己的某些小九九怎么办呢,答案就是实现插件的扩展点,下面我们还是以
Git4Idea
插件为例子,来看下怎么扩展其他插件。
依赖插件的扩展点
我们打开
Git4Idea
插件的配置文件。
<idea-pluginxmlns:xi="http://www.w3.org/2001/XInclude"><name>Git</name><id>Git4Idea</id>
......
<extensionPoints><extensionPointqualifiedName="Git4Idea.GitHttpAuthDataProvider"interface="git4idea.remote.GitHttpAuthDataProvider"/><extensionPointqualifiedName="Git4Idea.gitRepositoryHostingService"interface="git4idea.remote.GitRepositoryHostingService"/><extensionPointqualifiedName="Git4Idea.GitCheckinExplicitMovementProvider"interface="git4idea.checkin.GitCheckinExplicitMovementProvider"/></extensionPoints></idea-plugin>
在配置文件里
extensionPoints
这里配置的就是git插件对外提供的扩展点,我们需要使用git插件的某些功能时,实现其扩展点就可以了。下面我们以
GitCheckinExplicitMovementProvider
为例子,来看下怎么实现当文件移动时实现咱们自己的特别的功能。
手写一个
DemoGitCheckinExplicitMovementProvider
类,继承
Git4Idea
插件
GitCheckinExplicitMovementProvider
。
packagecom.my.intellij.idea.extension.point.git4idea;importcom.intellij.openapi.project.Project;importcom.intellij.openapi.ui.Messages;importcom.intellij.openapi.util.Couple;importcom.intellij.openapi.vcs.FilePath;importcom.intellij.openapi.vcs.VcsNotifier;importgit4idea.checkin.GitCheckinExplicitMovementProvider;importorg.jetbrains.annotations.NotNull;importjava.util.ArrayList;importjava.util.Collection;importjava.util.List;/**
* @author yangfengshan
* @create 2023-03-20 18:20
**/publicclassDemoGitCheckinExplicitMovementProviderextendsGitCheckinExplicitMovementProvider{@OverridepublicbooleanisEnabled(@NotNullProject project){returntrue;}@Overridepublic@NotNullStringgetDescription(){//编写插件的描述 在commit 弹框中的选项return"demo-move file";}@Overridepublic@NotNullStringgetCommitMessage(@NotNullString originalCommitMessage){// 提交Message 咱们加上移动文件的标志return originalCommitMessage +"# move file";}@Overridepublic@NotNullCollection<Movement>collectExplicitMovements(@NotNullProject project,@NotNullList<FilePath> beforePaths,@NotNullList<FilePath> afterPaths){// 判断 移动的文件 ArrayList<Movement> collection =newArrayList<>();for(int i =0; i < beforePaths.size(); i++){for(int j =0; j < afterPaths.size(); j++){if(beforePaths.get(i).getName().equals(afterPaths.get(j).getName())&&!beforePaths.get(i).getPath().equals(afterPaths.get(j).getPath())){Movement movement =newMovement(beforePaths.get(i), afterPaths.get(j));
collection.add(movement);}}}return collection;}/**
* Notifies that commit with explicit movements was created
*/@OverridepublicvoidafterMovementsCommitted(@NotNullProject project,@NotNullList<Couple<FilePath>> movedPaths){VcsNotifier notifier =VcsNotifier.getInstance(project);// 提交后 日志中打印 移动的文件数量
notifier.notifyInfo("demo","move file count "+movedPaths.size());}}
然后把实现的扩展点配置到咱们插件的配置文件
plugin.xml
中。
<idea-plugin>
......
<extensionsdefaultExtensionNs="Git4Idea"><GitCheckinExplicitMovementProviderimplementation="com.my.intellij.idea.extension.point.git4idea.DemoGitCheckinExplicitMovementProvider"/></extensions>
......
</idea-plugin>
我们运行看下实际效果吧。
首先我们打开一个git管理的项目,在项目中讲一个文件移动到另外的一个文件夹中,进行commit。在commit弹框中可以看到咱们自定义的
demo-move file
选项,选项可以控制,咱们插件的逻辑是否执行。
选中
demo-move file
进行提交。在我们的提交记录中查看提交的commit message,就会发现我们在原来的提交信息后面加上了
move file
的标识。在idea的Event log 中也会打印文件变动的数量。
以上就是我们开发idea插件时依赖外部插件开发的一些知识,其实除了上面的这些,我们也可以通过idea提供的消息订阅的方式与依赖的插件进行交互,想要了解的同学们,可以听我下次讲解。
版权归原作者 错对对 所有, 如有侵权,请联系我们删除。