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

Knit - Visual Studio 插件

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2007年12月30日

CDDL

8分钟阅读

viewsIcon

36366

downloadIcon

457

Knit 是一个 Visual Studio 插件工具,允许开发人员将多步模式应用于解决方案和程序集元数据。

引言

Knit 是一个 Visual Studio 插件工具,允许开发人员将多步模式应用于解决方案和程序集元数据。

虽然最初是为了将项目缝合到 SharePoint 2007 解决方案中而创建的,但 Knit 足够灵活且可扩展,可以处理几乎任何生成后元数据处理。

Visual Studio 解决方案、项目和项目文件的元数据通过“Skein”文件以 XML 的形式暴露给编织模式。此外,Skein 文件中的每个项目还包含其 .NET 反射元数据。Skein 文件可用于每个模式步骤,包括应用 XSLT 转换的强大的“Stitch”步骤。

新模式易于使用 XML 创建,并且内置了几个强大的步骤进程,允许开发人员完全自主地创建生成后编织模式。

背景

通过添加解决方案 CAB 文件,分发 SharePoint Web 部件和其他自定义项的整个概念得到了极大的简化。解决方案 CAB 文件包含所有必需的文件,包括一个定义 SharePoint 如何以及在何处安装每个组件的 manifest.xml 文件。使用提供的 stsadm.exe 工具,在 SharePoint 站点上安装打包的解决方案只需一个命令行指令。CAB 文件和 manifest.xml 文件的结构相当简单,可以通过 CodeProject 文章:SharePoint Web 部件基础(第二部分:部署方法)(作者:_alank)以及 Microsoft MSDN 文章:解决方案概述进行更好的解释。

当您的 Visual Studio 解决方案相对简单时,包含,例如,一个包含一两个 Web 部件的单个项目,创建 SharePoint 解决方案文件并不难。对于最有奉献精神的开发人员来说,让解决方案和 manifest.xml 文件与包含自定义字段、.ASCX 用户控件、.ASPX 页面和其他 SharePoint 模板文件的多个项目的 VS 解决方案保持同步可能会很棘手。幸运的是,创建这些解决方案所需的大部分信息都包含在 Visual Studio 解决方案、项目和程序集中的结构和元数据中。为什么不创建一个工具来访问元数据并使其更易于打包?

由于我创建的 SharePoint 解决方案的复杂性因项目而异,因此我需要一个可以相对轻松地更新和扩展的工具;一种公开 Visual Studio 所有元数据并使其易于操作的方法。使用 Visual Studio 插件技术(参见 Microsoft MSDN 文章 创建插件和向导),我创建了 Knit 插件。在撰写本文时,Knit 插件的源代码仍由 Hitachi Consulting 拥有版权;但是,他们已好心地同意允许该工具的二进制文件作为本文的一部分分发。本文的主要重点是解释 Knit 的用法、它如何公开 Visual Studio 元数据以及如何创建模式,并提供一个用于打包 SharePoint 2007 解决方案的特定示例。

安装 Knit

下载并安装 Knit 二进制文件。Knit 要求安装 Visual Studio 2005 或 2008。下载并解压 Knit.zip 文件,然后执行 Setup.exe。设置向导有三个选项

  • 为 Visual Studio 2005 安装 Knit
  • 为 Visual Studio 2008 安装 Knit
  • 安装 Knit 模式示例

开始使用 Knit

安装完成后,下次启动 Visual Studio 时,Knit 应该会出现在 Visual Studio 工具菜单的顶部。可以通过单击“Knit”菜单项或执行 Visual Studio 命令“knit”来执行 Knit。

Visual Studio Tool Menu

将显示 Knit 对话框,允许您选择一个模式开始编织。

Knit Dialog

当 Knit 执行时,它会在一个标记为“knit”的输出窗格中产生输出。

Knit Output Pane

将 Knit 作为 Visual Studio 命令执行需要将模式的标签指定为其参数。例如:Knit Share Point 2007 - Solution。将 Knit 作为命令执行不会调用 Knit 对话框。

Knit 架构

以下图表描述了 Knit 如何检查元数据并应用模式步骤来生成输出。

编织机:第一遍

编织机的第一遍检查 Visual Studio 解决方案元数据,并处理每个项目和项目文件。对于每个生成程序集文件的项目,如果程序集文件存在,则打开它,并使用 .NET 反射提取程序集元数据。所有元数据与用户输入的选项结合,转换为 XML 标签,并添加到 Skein 文档中。

Knit Pass 1

编织机:第二遍

然后,编织机应用所选模式的每个步骤,以 Pass 1 的 Skein 文档作为输入。步骤执行,在 Visual Studio 或解决方案目录中创建一个或多个输出文件。

Knit Pass 2

最后,如果用户选择生成 skein 文件,则 Skein 文档将作为文件输出。

Skein 文件

编织机的核心是“Skein”文件。Skein 文件是整个 Visual Studio 项目的 XML 表示,以及所有选定的编织选项和程序集元数据。总之,它包含关于您的解决方案的一切,除了代码本身!当模式执行时,每个步骤都会向 Skein 文件追加信息,使其可供模式的下一个步骤使用;您可以在示例底部,在 `<outputs>...<outputs/>` 标签之间看到一个示例。

下面是一个简单解决方案的 Skein 文件的缩写示例(请注意,文件的大部分已使用省略号“...”进行了缩写,包括文件路径,以节省屏幕空间)

<skein xmlns="http://hitachiconsulting.com/namespaces/visualstudio/knit/skein">
  <options>
    <option name="AutoSaveFiles">true</option>
    <option name="CreateSkeinFile">true</option>
    <option name="SolutionID">ac468818-e45b-4e17-b453-b4b437b273cf</option>
    <option name="GenerateWebPartFiles">true</option>
  </options>
  <solution name="Hitachi.VisualStudio.Knit.UnitTest" 
               path="C:\Users\...\VisualStudio\Knit\UnitTest">
    ...
    <project name="UnitTest" unique-name="UnitTest\UnitTest.csproj">
      <assembly name="Hitachi.Sharepoint.SolutionBuilder.UnitTest" 
            full-name="Hitachi.Sharepoint.SolutionBuilder.UnitTest, 
                       Version=1.0.0.0, Culture=neutral, 
                       PublicKeyToken=dda93a23bface736" 
            location="C:\Users\...\UnitTest\bin\Debug\Hitachi.
                      Sharepoint.SolutionBuilder.UnitTest.dll" 
            version="1.0.0.0" culture="neutral" 
            public-key-token="dda93a23bface736">
        <type name="TestWebPart" 
             full-name="Hitachi.Sharepoint.SolutionBuilder.UnitTest.TestWebPart" 
             namespace="Hitachi.Sharepoint.SolutionBuilder.UnitTest" 
             base-type="System.Web.UI.WebControls.WebParts.WebPart">
          <attribute name="Public" type="System.Reflection.TypeAttributes" />
          ...
          <attribute name="Bindable" 
             type="System.ComponentModel.BindableAttribute" 
             Bindable="True" Direction="OneWay" />
          <member-property name="Title" property-type="System.String">
            <attribute name="WebBrowsable" 
               type="System.Web.UI.WebControls.WebParts.WebBrowsableAttribute" 
               Browsable="True" />
            <attribute name="Personalizable" 
               type="System.Web.UI.WebControls.WebParts.PersonalizableAttribute" 
        IsPersonalizable="True" 
        IsSensitive="False" Scope="User" />
            <attribute name="DefaultValue" 
               type="System.ComponentModel.DefaultValueAttribute" 
               Value="Knit Test Web Part" />
          </member-property>
       ...
          <member-property name="Description" property-type="System.String">
           ...
          </member-property>
          <member-method name="DoSomeStuff" return-type="System.Void">
            <attribute name="FamANDAssem" type="System.Reflection.MethodAttributes" />
            <attribute name="Family" type="System.Reflection.MethodAttributes" />
            <attribute name="Public" type="System.Reflection.MethodAttributes" />
            <attribute name="HideBySig" type="System.Reflection.MethodAttributes" />
            <parameters>
              <parameter name="a" type="System.Int32" />
              <parameter name="b" type="System.String" />
              <parameter name="c" type="System.Boolean" />
            </parameters>
          </member-method>
          <member-method name="Render" return-type="System.Void">
            ...
          </member-method>
        </type>
      </assembly>
      <folder name="_layouts">
        <folder name="HitachiConsulting">
          <folder name="KnowledgeManagement">
            <folder name="Rating">
              <file name="Comments.aspx">
                <properties>
                  <property name="Extension">.aspx</property>
                  <property name="FileName">Comments.aspx</property>
                  ...
                  <property name="DateCreated">11/15/2007 4:16:30 PM</property>
                  <property name="LocalPath">C:\Users\...\Comments.aspx</property>
                </properties>
              </file>
              <folder name="Images">
                <folder name="Rating">
                  <file name="0.png">
                    ...
                  </file>
                  ...
                  <file name="none.png">
                    ...
                  </file>
                  <properties>
                    ...
                  </properties>
                </folder>
                <properties>
                  ...
                </properties>
              </folder>
        ...
            </folder>
        ...
          </folder>
  </solution>
  <outputs>
    <step-outputs from-step="Step_0">
      <output name="disposition">continue</output>
    </step-outputs>
    <step-outputs from-step="webparts">
      <output name="disposition">manifest</output>
    </step-outputs>
    <step-outputs from-step="manifest">
      <output name="file-name">C:\Users\...\manifest.xml</output>
      <output name="disposition">fail</output>
    </step-outputs>
  </outputs>
</skein>

SharePoint-SolutionBuilder 模式

Knit 工具附带的 SharePoint Solution-Builder 模式旨在直接从 Visual Studio 解决方案和 .NET 程序集文件的元数据创建解决方案 CAB 文件、manifest.xml 文件和所有 .webpart 定义文件。

<?xml version="1.0" encoding="utf-8" ?>
<pattern xmlns="http://hitachiconsulting.com/namespaces/visualstudio/knit/pattern" 
         name="SharePoint-SolutionBuilder" label="Share Point 2007 - Solution"> 
    <description> Generates a complete Share Point 2007 Solution, 
                  including all web part definition files. </description> 
    <options> 
        <option type="guid" required="true" persist="true" 
                 name="SolutionID" label="Share Point Solution GUID"> 
            <description>Uniquely identifies a Share Point solution.</description> 
        </option> 
        <option type="check-box" persist="true" name="GenerateWebPartFiles" 
                label="Generate .webpart files" default-value="true">
             <description>Generate .webpart files by scanning each 
                assembly for web parts Note that the values 
                of properties are extracted from the [DefaultValue] attribute. 
                To supply a value for Title and Description, override the base property and 
                supply a [DefaultValue] attribute. 
            </description> 
        </option> 
    </options> 
    <steps> 
        <if expression="/ns:skein/ns:options/ns:option[@name='GenerateWebPartFiles']='true'" 
           on-false="no-webparts"/> 
        <stitch name="webparts" label="generating webpart file(s)" 
            uri="$(PatternPath)\Transforms\webparts.xslt" 
            on-success="manifest" 
            on-failure="manifest"/> 
        <message name="no-webparts" 
          text="Web Part definition file generation disabled by user" popup="false"/> 
        <stitch name="manifest" label="generating manifest file" 
            uri="$(PatternPath)\Transforms\manifest.xslt" 
            output-path="$(SolutionPath)\manifest.xml"/> 
        <stitch name="cabinet-definition" label="generating cabinet definition file" 
            uri="$(PatternPath)\Transforms\cabinetDefinition.xslt" 
            output-path="$(SolutionPath)\wsp_structure.ddf"/> 
        <execute name="makecab" window="Normal" label="generating cabinet file" 
            command="MAKECAB.EXE" directory="$(SolutionPath)" 
            arguments="/f "$(SolutionPath)\wsp_structure.ddf""/> 
        <message text="Sharepoint-SolutionBuilder knitted!" popup="true"/> 
    </steps> 
</pattern>

请注意,此模式中的关键步骤是 `<stitch>` 步骤。每个 stitch 步骤使用 Skein 文件作为输入,应用 XSLT 转换以生成输出文件。有关 XLST 样式表标准的更多信息,请访问 w3.org 上的文章:XSL 转换 (XSLT) 版本 1.0。我还发现 w3schools.com 有一个相当不错的 XSLT 教程,适合刚开始的开发人员。

第一个 stitch 步骤,标记为“webparts”,应用 XSLT 文件“webparts.xslt”来扫描 Skein 文件中任何使用 SharePoint [WebBrowsable] 属性的程序集类型。找到的每个具有 [WebBrowable] 属性的类型都用于为解决方案生成一个 .webpart 文件。

第二个 stitch 步骤,标记为“manifest”,应用 XSLT 文件“manifest.xslt”来扫描 Skein 文件并创建 SharePoint 解决方案清单文件(manifest.xml)。

第三个也是最后一个 stitch 步骤,标记为“cabinet-definition”,创建用作 makecab 步骤输入的 cabinet 定义(.ddf)文件。

有关如何创建模式定义的更多详细信息,包括创建自定义步骤的详细信息,请参阅作为 Knit Add-In 下载一部分安装的 Knit 用户指南。

使用 SharePoint-SolutionBuilder 模式

SharePoint-SoutionBuilder 模式随 Knit 的已安装版本提供。要将 SharePoint-SoutionBuilder 编织模式应用于您的解决方案,请从工具菜单中选择“Knit”,然后从模式选择下拉列表中选择 SharePoint 2007 解决方案。第一次选择模式时,您需要从 Knit 对话框中提供或生成解决方案 ID 的 GUID。Knit 在生成有效的解决方案文件之前,需要您的 SharePoint 解决方案具有一定的结构。如果您要将文件放入 SharePoint 的共享 TEMPLATE 目录,则需要按以下方式构建您的项目

  • 解决方案
    • 项目(或 Web)
      • TEMPLATE
        • template-folder(可选)
          • template-folder(可选)
            • file(生成操作设置为“content”)
            • file(生成操作设置为“content”)

TEMPLATE”文件夹下的任何生成操作属性设置为“content”的文件都将在安装解决方案时复制到 SharePoint 通用 TEMPLATE 文件夹的相应位置。一个很好的例子是创建一个安装 SharePoint 自定义字段类型的项目(有关更多信息,请参阅有关自定义字段类型的 Microsoft MSDN 文章)。要安装自定义字段定义文件,请按以下方式设置您的解决方案结构

  • 解决方案
    • 项目(或 Web)
      • TEMPLATE
        • XML
          • fldtypes_myfield.xml(生成操作设置为“content”)

为了简化对位于 SharePoint 通用 URL `http://{share point site}/_layouts/{resource-path}` 上的资源的引用,该模式还期望在项目结构中找到资源,如下所示

  • 解决方案
    • 项目(或 Web)
      • _layouts
        • resource-folder(可选)
          • resource-folder(可选)
            • file(生成操作设置为“content”)
            • file(生成操作设置为“content”)

下载示例 Web 部件项目以查看这些结构的示例。

关注点

Knit 工具在公开 Visual Studio 关于解决方案维护的所有元数据方面做得非常好。我设想在未来将此工具扩展到包含许多不同的结构和程序集检查模式。

历史

  • 2007 年 12 月 30 日 - 第一个版本。
© . All rights reserved.