npm 更换插件版本_IDEA插件-NPM包版本历史

本文介绍了如何开发一个IDEA插件,以方便查看npm包的历史版本。通过监听用户在`package.json`中的操作,插件会执行npm或yarn命令获取版本历史,并在弹窗中展示。作者分享了插件开发的关键点,包括控制菜单显示、获取包名、显示弹窗以及执行npm命令等步骤,并提到了插件的最终效果和开发经验。
摘要由CSDN通过智能技术生成

IDEA或WS中,比如对于包版本,我们只能看到当前安装的版本或者最新版本号,但是对于查看历史版本,却没有现成的手段支持。于是我在想不如做个插件来强化下呢。

查看包版本历史的需求

查看包版本历史从来不是个多么刚性的需求,但是却也需要。

比如使用webpack4.x,这时我想知道4.x之上又有哪些版本,因为每次的升级不一定是升级到最新。

又比如,我们发布的私服包,有时需要知道私服上当前有多少个版本,因为某些原因,部分版本可能不存在了,我们需要确认下。

等等,需求还是存在的,so,只剩下解决了。

npm | yarn命令查看包版本历史

npm或者yarn命令本身即支持查询可用包版本历史

1

2npm view webpack versions --json

yarn info webpack versions

插件开发大致过程

基于上面的命令,那么插件无非也就是对于此命令包裹了可视化的UI而已。开搞

大致的流程获取用户光标聚焦的包名

执行命令获取包版本历史

弹框列表展示

具体的开发历程这里不赘述,只描述下几个点

关键点

控制菜单的显示及可用状态

我的需求是用户只有在package.json文件中,单击右键才显示菜单。

方法:重写update方法,Presentation提供了方法来控制。

1

2

3

4

5

6

7

8

9

10

11@Override

public void update(@NotNull AnActionEvent e){

PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);

String filename = psiFile.getVirtualFile().getName();

Presentation presentation = e.getPresentation();

if ("package.json".equals(filename)) {

presentation.setEnabledAndVisible(true);

return;

}

presentation.setEnabledAndVisible(false);

}

获取包名

我的需求是用户在包名称位置,光标单机右键时即获取包名

方法:PsiTreeUtil提供方法可以根据元素获取直接父元素,从而获取内容

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16PsiElement element = Objects.requireNonNull(PsiManager.getInstance(project).findFile(file)).findElementAt(offset);

PsiElement firstParent = PsiTreeUtil.findFirstParent(element, new Condition() {

@Override

public boolean value(PsiElement psiElement){

return true;

}

});

assert firstParent != null;

String packageName = getPackageName((LeafPsiElement) firstParent);

...

@NotNull

private String getPackageName(LeafPsiElement firstParent){

String name = firstParent.getText();

return name.substring(1, name.length() - 1);

}

光标位置显示弹窗1

2

3

4

5

6

7

8private void showPopup(String name, List versions, Editor editor){

IPopupChooserBuilder popupChooserBuilder = JBPopupFactory.getInstance().createPopupChooserBuilder(versions);

popupChooserBuilder.setTitle(name);

JBPopup popup = popupChooserBuilder.createPopup();

popup.setMinimumSize(new Dimension(80, 0));

popup.showInBestPositionFor(editor);

}

执行命令1

2

3

4

5

6

7

8

9

10

11

12ArrayList cmds = new ArrayList<>();

cmds.add("npm");

GeneralCommandLine generalCommandLine = new GeneralCommandLine(cmds);

generalCommandLine.setCharset(Charset.forName("UTF-8"));

generalCommandLine.setWorkDirectory(project.getBasePath());

generalCommandLine.addParameters("view", name, "versions", "--json");

String commandLineOutputStr = ScriptRunnerUtil.getProcessOutput(generalCommandLine);

Gson converter = new Gson();

Type type = new TypeToken>() {

}.getType();

List result = converter.fromJson(commandLineOutputStr, type);

最终效果

ba922b9070c26d97122b63f45596024b.gif

插件商店地址: 戳这里

写在最后这应该是我个人开发的第二款IDEA插件了,初衷很简单,现有IDE及插件不支持,索性自己开发,利用插件填补IDE的不足,进而提升个人生产力。

官方文档对于API方法并没有例子,so,单靠IDEA的文档,确实不够用,需要利用多种手段来解决插件开发中的问题,比如我会IDEA官方社区发帖子,Slack上与它们沟通,查看IDE及现有插件的SDK,这些都可以辅助解决当前遇到的问题。so,手段需要多元化。

参考文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值