zoukankan      html  css  js  c++  java
  • VS插件

    VS插件

    背景

       前些天去考科目二,感觉经历了一场不是高考却胜似高考的考试(10年前的5分之差, 还是难以释怀)!

         一行八人,就我学的时间最少(4天,8人一辆车),教练都觉得我肯定还得再来一次!

       靠着运气和信念,惊险的通过了侧方停车和倒车入库,终于还是抚慰了一下10年前那颗年轻的心!

        

       ——————————感慨完毕,回归主题——————————

           终于修改完了客户提交的bugs,发布、更新、测试、邮件通知,悠哉悠哉的浏览博客园...然后客户来了...

       客户:我提的需求怎么都没修改,这个按钮颜色也没变,点击效果还是以前的,那个界面也没修改...!@#$%^&*...

        我:我这里都正常的,截图给你看下...

       客户:要不你远程看下什么问题。

        我:哦,浏览器缓存没有更新,你强制刷新下

       客户:怎么强制刷新?

        我:ctrl+f5,手机上...!@#$%^&*...

       客户:(° ?°)~@

      

           ——————————以上对话来源生活,如有雷同,实属正常——————————

            每次更新后,总会产生这样的对话,每次解释半天都是无功而返,最后还是一个个的给每个js,css文件加上 ?v=111 这样的字样,劳心又费神,还不讨好。

        然后引入combres 以为可以万事大吉了,增加js和css引用麻烦,每次去修改配置也是麻烦,同事也都不愿意用了。

        最后,只能要求大家修改时都添加 ?v=xxx 的字样,律己容易律人难,再则操作确实也不方便,大家更不愿意弄了。

        你不去修改,问题就在那里,只增不减...

        

    快捷输入

      后来发现VS有这么一个功能,可以把代码片段拖到工具栏,点击可以自动快捷输入,效果如下,用起来非常方便,当时就想如果js和css版本号也可以有快捷的输入,大家也会更愿意去操作吧,但是因为这个内容是固定的,所以用起来还是不太方便。于是,路漫漫其修远兮,吾将上下而求索!

         

       

      

    VS插件开发---自己动手,丰衣足食

       直到看到这个 《强迫症的福利——我的第一个VS插件,对using排序!》 文章,我就知道了:只要你想,就有可能。至于安装 VisualStudio SDK,创建项目之类的,前面的文章已经讲得蛮多了。有兴趣的可以移步前面的文章链接哈!

       配置要修改的不多,基本就是图标、快捷键、菜单名称等。以下是我的完整配置文件

      

      搭好项目,配置完成,我们开始上菜了。

    小菜第一版

      我们知道菜单的逻辑都在 fillVersion.cs  -》MenuItemCallback 中实现

      第一版功能非常简单,就是简单的输入 ?v=yyyyMMddss,表面上已经实现了我的想法,确实也比原来方便多了,只要按下快捷键就完成原来多次输入的效果,代码如下

    复制代码
    1 var dte = this.ServiceProvider.GetService(typeof(DTE)) as DTE;
    2 var selection = dte.ActiveDocument.Selection as TextSelection;//当前文档中选中的部分
    3 if (selection == null)
    4 { 
    5    return;
    6 }
    8 string versionstr = "?v=" + DateTime.Now.ToString("yyyyMMddss");
    9 selection.Insert(versionstr, (int)vsInsertFlags.vsInsertFlagsCollapseToEnd);//重新写入文档
    复制代码

      

       效果如下:

      

      但是问题来了:

      A、光标一定要定位到文件名后面,这完全是在制造麻烦么?

      B、我要同时给几个js添加版本号怎么办?一个个添加?这还是在制造麻烦么?

      C、我要同时给js和css添加版本号又怎么办呢?

      ...

      带着这些疑问,我开始了新的起航。

    小菜最终版

       在解决第一版提出的问题,首先我们得解析我们选中的内容,随便百度一下,我就发现了 HtmlAgilityPack,后面的工作就简单了,便利选中 script和link 标签,获取 href,src 属性,加个?v=yyyyMMddss 就OK了。

       这个版本,我们可以直接多个标签批量设置版本号了,操作就更方便了。使用方便了,同事自然就想用了,都不用我去要求了。

       直接上代码吧,大家一看就了然了,没有注释哈,代码就是最好的注释了。

       

    复制代码
     1 var dte = this.ServiceProvider.GetService(typeof(DTE)) as DTE;
     2 var selection = dte.ActiveDocument.Selection as TextSelection;//当前文档中选中的部分
     3 if (selection == null)
     4 {
     5     return;
     6 }
     7 
     8  HtmlDocument doc = new HtmlDocument();
     9  doc.LoadHtml(selection.Text);
    10 
    11  HtmlNodeCollection script = doc.DocumentNode.SelectNodes("//script");
    12  HtmlNodeCollection link = doc.DocumentNode.SelectNodes("//link");
    13 
    14  string newcontent = "";
    15  string versionstr = "?v=" + DateTime.Now.ToString("yyyyMMddss");
    16 
    17  if (link != null)
    18  {
    19                 foreach (HtmlNode categoryNode in link)
    20                 {
    21                     string href = categoryNode.Attributes["href"].Value;
    22                     if (href.IndexOf("?") > 0)
    23                     {
    24                         href = href.Substring(0, href.IndexOf("?"));
    25                     }
    26                     href += versionstr;
    27                     newcontent += "<link type="text/css" rel="stylesheet" href="" + href + "" />
    ";
    28                 }
    29             }
    30 
    31 
    32             if (script != null)
    33             {
    34                 foreach (HtmlNode categoryNode in script)
    35                 {
    36                     string src = categoryNode.Attributes["src"].Value;
    37                     if (src.IndexOf("?") > 0)
    38                     {
    39                         src = src.Substring(0, src.IndexOf("?"));
    40                     }
    41                     src += versionstr;
    42                     newcontent += "<script src="" + src + ""></script>
    ";
    43                 }
    44 
    45             }
    46 
    47             if (newcontent.Length == 0)
    48             {
    49                 newcontent = versionstr;
    50             }
    51 
    52 selection.Insert(newcontent, (int)vsInsertFlags.vsInsertFlagsCollapseToEnd);//重新写入文档
    复制代码

       

      再上几张最后的效果图,有图有真像,后面还有代码哦(至于最后用HJ这个图标,就是为了给媳妇邀功 \*^o^*// )。

      

      

                  (选择一行)           

      

                              (选择多行,包含link,script标签)                                                                                                     

                    

    结语

      虽然这个插件功能非常简单,但是整理这个开发的过程还是用了好几个晚上。个人觉得还是蛮实用的(至少对我们开发,还是非常有帮助的),特来分享给大家(后面有安装文件和源码)。

      觉得有帮助呢,动动手指点个赞,图个高兴;觉得写得不好,也接受拍砖哈;写得不正确的地方,请不吝赐教下哈,共同进步!

      安装文件,点击下载(VS2015开发的,不能安装的话,自行编译哈)

      源代码,压缩后还有11M,只能上传CSDN了,免积分哦。点击下载

       成为一名优秀的程序员!

  • 相关阅读:
    Android编码规范03
    Android编码规范02
    Android编码规范01
    函数返回值类型为枚举类型
    ObjectAnimator属性动画应用demo
    n个元素的入栈顺序有多少种出栈顺序?
    JNI笔记1
    字符串——面试题1:统计一行字符中有多少个单词?
    快速排序算法
    es6之 async await 使用小计
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5683549.html
Copyright © 2011-2022 走看看