65.9K
CodeProject 正在变化。 阅读更多。
Home

您的私人扩展库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (6投票s)

2015 年 3 月 9 日

CPOL

7分钟阅读

viewsIcon

19004

管理和维护您的内部 Visual Studio 扩展...

引言

Visual Studio 自 2010 版本以来,一直使用一个中央(在线)存储库来管理扩展和更新。这个中央位置允许任何人,而不仅仅是微软,通过上传一个文件来与所有使用 Visual Studio 的人共享工具/控件/模板等等——包括更新……

但是,如果您有一些非常特殊的扩展,以至于公开它们毫无意义,该怎么办?显然,您有两个选择——手动安装或私有存储库……

手动安装太老套了,所以我将向您展示如何创建和维护一个私有存储库……

背景

我属于那种不喜欢在工作时打开太多应用程序/窗口的开发者。因此,我使用了很多 Visual Studio 扩展,将功能集成到我的主要环境中。

使用扩展的另一个原因来自于我的工作。我正在处理一个大型项目(数百个网页),我的工作是为那些负责创建实际网页的开发人员创建一个定制的框架。由于这些页面基于模板(有几个),并且使用了我自制的引擎,因此创建一个扩展来发布模板是成功的捷径。

当我意识到我不仅要将扩展发布到几个(大约 12 个)计算机上,而且还要处理更新时,私有存储库变得很有用……

重要提示

Visual Studio 支持不同类型的安装包用于扩展(VSIX、MSI、VSI),但在本文中,我将重点介绍 SDK 为您创建的所有扩展项目所生成的 VSIX。

使用代码

本文不会附带任何代码。原因是这里唯一会看到的“代码”是一些 XML,用于定义私有存储库,而且目前这个 XML 将手动维护……

什么是存储库

那么 Visual Studio 是如何知道存储库中有哪些扩展以及哪些更新可用的呢?存储库以 XML 文件的形式呈现给 Visual Studio。该文件包含 Atom feed 格式的条目,Visual Studio 会扫描这些条目以查看存储库中有哪些内容。

注意: Visual Studio 使用的主存储库实际上是一个服务(用 WCF 实现),用于从中央数据库提供内容。如果您感兴趣,可以在网上找到很多使用相同方法的解决方案……我使用单个 XML 文件的方法,因为它更简单,并且对于少数(一到几百个?)扩展来说更容易处理。为这几个扩展编写一个完整的服务有点浪费……

Visual Studio 支持多个活动存储库,所以我们只需要创建一个正确格式的 XML 文件,然后将 Visual Studio 指向该文件……

XML文件

<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title type="text">My Gallery</title>
    <id>591c105e-bd42-4008-bcef-d822c1bd7607</id>
    <updated>2015-02-25T17:00:00Z</updated>
    <entry>
        <id>8936414f-bf3f-4f33-89aa-6e3e1b0985cd</id>
        <title type="text">My Extension</title>
        <summary type="text">Summary of My Extension...</summary>
        <published>2015-02-17T15:00:00Z</published>
        <updated>2015-02-25T15:50:00Z</updated>
        <author>
            <name>My Company</name>
        </author>
        <link rel="alternate" type="text/html" href="http://codeproject.com"/>
        <link rel="releasenotes" type="text/html" href="http://codeproject.com"/>
        <link rel="icon" type="text" href="icon.png"/>
        <link rel="previewimage" type="text" href="preview.png"/>
        <category term="Tools" />
        <content type="application/octet-stream" src="MyExtension.vsix" />
        <Vsix xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xmlns="http://schemas.microsoft.com/developer/vsx-syndication-schema/2010">
            <Id>8936414f-bf3f-4f33-89aa-6e3e1b0985cd</Id>
            <Version>1.1</Version>
        </Vsix>
    </entry>
</feed>

正如之前提到的,XML 基于 Atom feed 格式,该格式在 RFC4287 中定义。

RFC4287 - 简介

Atom 是一种基于 XML 的文档格式,它描述了称为“feed”的相关信息列表。Feed 由多个称为“entry”的项组成,每个项都有一组可扩展的附加元数据。例如,每个 entry 都有一个标题。

Atom 解决的主要用例是将 Web 内容(如博客和新闻标题) syndication 到 Web 站点以及直接 syndication 到用户代理。

Atom 格式被定义为可扩展的,当然,Visual Studio 使用了经过这样扩展的版本,可用于提供 VSIX 文件进行安装……

现在让我们看看所有这些 XML 标签的含义……格式有两个主要部分,header 和 entry,其中 entry 可以重复无限次……

Header(头部)

这部分包含三个标签

title

顾名思义,这是存储库的标题(名称)。此属性实际上并未被 Visual Studio 使用,更多是为了人类读者……

id

Feed 的唯一 ID。它可以是任何类型的唯一 ID,例如“my-unique-id-1234”,但我认为一个好的 UUID(GUID)会派上用场。

updated(更新时间)

Feed 最后更新的日期/时间。格式(此处以及所有其他日期/时间标签)是 YYYY-MM-DDThh:mm:ssZ……

Entry(条目)

一个 Feed 可以包含无限数量的条目,但是,如果处理的条目数量过多,您应该考虑创建(设置)一个基于服务的存储库。

title

这将作为扩展的名称呈现给最终用户。

summary(摘要)

有关扩展目的的一些说明。它也将呈现给最终用户……

id

条目的唯一 ID。它必须与 VSIX 包的 ID 完全相同!

published(发布时间)

条目最初发布时的日期/时间。

updated(更新时间)

条目最后更新的日期/时间。

author/name(作者/姓名)

创建扩展的个人/公司。它将是“创建者”块的值。

link[alternate](链接[备用])

指向一个页面,最终用户可以在其中获取有关扩展的更多信息。可选。

link[releasenotes](链接[发行说明])

指向一个页面,最终用户可以在其中随时间跟踪版本的功能历史。可选。

link[icon](链接[图标])

一个 32x32 像素的图像(不一定是图标格式),将显示在扩展名称旁边。可选。

icon[previewimage](图标[预览图])

一个 200x200 像素的图像。此图像将显示在侧边栏中,目的是让用户一窥扩展在运行时(某种截屏)的外观。可选。

category(类别)

此标签允许将存储库划分为组。term 属性将保存类别的名称(它是自由文本!)。所有具有相同 term 的扩展将以该名称(在树状视图中)呈现给最终用户。可选但非常有用。

content

此标签指向将在最终用户决定使用该扩展时安装的 VSIX 文件。

Vsix/Id

VSIX 包的 ID。

Vsix/Version

VSIX 包的版本号。

就这样。这是一个非常简单的 XML 文件,您甚至可以用记事本轻松维护它……

现在让我们看看它在 Visual Studio 中的样子。

将存储库添加到 Visual Studio

要管理扩展的存储库,请打开 Tools->Options 菜单。从左侧菜单中选择 Environment->Extensions and Updates。请注意,内置存储库未在此列出,因为该存储库是 Visual Studio 的一个组成部分……

在右侧窗口中,点击 Add 按钮,填写 NameURL(在底部)字段,然后点击 ApplyOK……

Name 是 Visual Studio 将存储库呈现给最终用户的方式,URL 是指向我们刚刚描述的 XML 文件的链接……

您完成了。

使用存储库

现在进入简单的魔法……打开 Tools->Extensions and Updates 菜单。在左侧栏中有一个树状视图,第二个叶子是 Online……打开它!您看到您的存储库了吗(如果没有,您就错过了上一步的声明)。如果您打开它,您将看到您定义的所有类别以及按类别划分的所有扩展(选择存储库的根目录将显示所有类别中的所有扩展)……

现在您可以像从 Visual Studio Gallery 安装第三方扩展一样,以完全相同的方式安装您的扩展。

现在想象一下,您所有的同事都按照上一步的说明定义了存储库……部署新扩展有多容易……就像做梦一样……

更新

向存储库添加新扩展很容易。将 VSIX 文件复制到文件夹并更新 XML 文件。打开 Visual Studio 中的存储库的每个人都会立即看到它。但是如何更新现有的扩展呢?

第一步与新扩展完全相同——将更新后的 VSIX 文件复制到现有文件之上。第二步自然涉及到 XML 文件的更新。

老实说,您唯一需要更新的标签是 Vsix/Version。所有这些日期/时间标签对 Visual Studio 都没有意义……(事实上,如果您更新版本号,即使不更新 VSIX 文件,Visual Studio 仍然会触发更新)。

摘要

这并非一篇真正的代码文章,但其中描述的实践使我每天的生活都更轻松,我希望您也能如此……

我设想可以非常容易地创建一个小型应用程序,该应用程序将从 VSIX 文件(毕竟 VSIX 文件是简单的 zip 文件)创建/更新 XML,也许有一天我会这样做,但今天我对手动方法非常满意……

 

 

© . All rights reserved.