officesharepoint:Office Space: 通过 STSDEV 简化 SharePoint 开发

  本文举例源代码或素材下载

Office Space: 通过 STSDEV 简化 SharePo<img src='/icons/68927int.gif' /> 开发目录

  RootFiles 目录

  自动生成解决方案包

  STSDEV 入门

  使用 MSBuild 创建自定义生成目标

  扩展 STSDEV 实用

  我 从 2005 年夏天开始开发 Windows® SharePo® Services (WSS) 3.0 和 Microsoft® Office SharePo Server (MOSS) 2007从那时起我已经创建了数以百计新类库项目并手动对其进行了配置以开发各种类型 SharePo 组件如“功能”、“应用页面”、“页面模板”和“Web 部件”等

  不久以后我又开始标准化解决方案中文件和文件夹公用项目结构这些解决方案都是我使用面向 SharePo 开发 Visual Studio® 2005 创建但是这是个痛苦过程:对于每个项目仅创建作为起点基本结构就要花费 5到十分钟时间而各项目的间除项目名区别以外源文件几乎完全相同

  许多开发人员在进行 SharePo 开发时还会面临另个艰巨问题那就是创建必需文件以生成测试和部署时所需解决方案包文件 (.wsp)和许多其他 SharePo 开发人员我也习惯了手动创建和更新 manest.xml 文件和 .ddf 文件来生成自己解决方案包

  在过去年中直在和其他些 SharePo MVP(包括 John Holliday、Andrew Connell 以及 Scot Hillier 等)合作为实现同个目标他们都提出了非常相似但又略有区别架构我们讨论了有关设计和实现代码生成器构思它可以为新 Visual Studio 项目和解决方案自动产生所需全部源文件最终目标当然是为启动和运行新 SharePo 开发项目提供更快思路方法

  在创建了可生成具有公用文件夹结构每个新 Visual Studio 解决方案代码生成器后才有可能编写所需代码来重新生成产生解决方案包 .wsp 文件所需 manest.xml 文件和 .ddf 文件这样就避免了手动修改 manest.xml 或 .ddf 文件需要

  本月专栏将介绍个名为 STSDEV.EXE 概念验证应用演示了如何为 SharePo 开发创建简单代码生成器STSDEV 是个控制台应用它非常便于开发 MOSS 2007 组件另外它能够以可重复方式生成代码这就使得为遵循最佳实战 SharePo 开发生成 Visual Studio 解决方案成为可能

  在本月专栏中目标是讨论如何使用 STSDEV 实用创建和扩展 Visual Studio 项目为 SharePo 开发创造有效灵活环境此处所概述思路方法非常灵活它既可以用于 Visual Studio 2005也可以用于 Visual Studio 2008而且当需要从个版本 Visual Studio 移动到另个版本时此思路方法还非常容易迁移

  RootFiles 目录

  要想了解 SharePo 开发中有关部署工作原理其中个重要方面就是要知道需要将模板文件复制到前端 Web 服务器上哪个位置大多数文件都必须部署到各个前端 Web 服务器上个名为 SharePo RootFiles 目录内在 WSS 3.0 中此目录位于:

C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12  请看下图 1查看在 RootFiles 目录中嵌套子目录在绝大多数情况下需要部署自定义模板文件目录都是 TEMPLATE 目录但有时也需要将文件部署到其他些子目录中如 ISAPI 目录(部署自定义 Web 服务时)和 Resources 目录(需要部署具有全局资源 .resx 文件时)

Office Space: 通过 STSDEV 简化 SharePo<img src='/icons/68927int.gif' /> 开发

  Figure 1文件夹在 RootFile 中

  TEMPLATE 目录还包含数个重要子目录例如每个自定义功能都需要其自己命名目录位于 FEATURES 目录中其中包含名为 feature.xml 特征指令清单应用页面应被复制到 LAYOUTS 目录内子目录中

  自动生成解决方案包

  在 MOSS 2007 开发中使用解决方案包部署所有自定义模板和组件这是个最佳实战实际上如果您曾遇到过无法通过解决方案包部署组件类型则在设计和部署基于 SharePo 解决方案时应考虑加以避免它会影响在生产或分段环境中安装、维护和升级开发工作能力

  开发 WSS 3.0 或 MOSS 2007 时应配置 Visual Studio 项目以生成自己解决方案包并应在任何项目开发周期中提早完成我曾发现有许多开发人员将创建测试用解决方案包工作推迟到开发生命周期晚期这样做可能会引发些问题和无法预料延迟最好做些额外工作来配置 Visual Studio 项目以立即生成解决方案包并使用解决方案包部署来执行所有测试

  那么如何配置 Visual Studio 项目才能自动生成代表解决方案包 .wsp 文件呢?您可以有多种选择:例如您可以编写 MAKECAB.EXE 实用批处理文件来生成 .wsp 文件然后在 Visual Studio 中通过生成事件来不过虽然此思路方法提供了种快捷简易途径来通过 Visual Studio 生成流程自动运行命令但是使用自定义生成目标会更加灵活而且更易于维护

  STSDEV 实用设计用于创建 Visual Studio 解决方案以便直接在 Visual Studio 开发环境中运行许多特定于 SharePo 命令序列每当 STSDEV 实用创建个新项目时它都会通过多种区别配置来执行此操作并会向每种配置中添加个 MSBuild 自定义生成目标这样就可以仅在配置的间进行切换然后再运行标准 Visual Studio 生成命令来执行特定生成目标此目标包含在 SharePo 开发中使用常用命令序列如使用 MAKECAB.EXE 实用生成解决方案包然后使用 STSADM.EXE 实用在本地场中对其进行安装和部署

  STSDEV 入门

  先让我们快速了解下 STSDEV 实用工作原理开始时您可以运行 STSDEV 而不传递任何参数实用将弹出个对话框提示用户选择要生成 SharePo 开发解决方案类型(请参见图 2)

Office Space: 通过 STSDEV 简化 SharePo<img src='/icons/68927int.gif' /> 开发

  Figure 2使用 STSDEV 创建 Visual Studio 解决方案

  STSDEV 实用在设计时充分考虑了可扩展性每种可用解决方案类型基本上都是个解决方案提供通过它实现名为 IsolutionProvider、特定于 STSDEV 接口非常简单:

  public erface ISolutionProvider {
   Title { get; }
   void InitializeSolution;
   void AddSolutionItems;
  }
  此设计旨在使高级 SharePo 开发人员能够通过创建其自己解决方案提供来轻松扩展 STSDEV然后这些提供可以为特殊方案生成 Visual Studio 项目或用来满足特殊公司标准和原则

  但是使用 STSDEV 创建每个解决方案和项目会始终共享公用结构和用于生成输出解决方案包标准部署文件集STSDEV 实用还会创建具有标准配置集和自定义生成目标各个 Visual Studio 解决方案允许开发人员自动化在开发期间需要用到许多操作如安装、部署或收回当前项目解决方案包

  为了得到更好思路方法让我们检查下使用空解决方案提供生成 HelloWorld 解决方案结构如图 3 所示STSDEV 生成个名为 HelloWorld.sln 解决方案文件和个名为 HelloWorld.csproj 项目文件这可以使用 Visual Studio 2005 解决方案格式或 Visual Studio 2008 解决方案格式来创建另外还要注意STSDEV 实用使用标准类库项目类型创建 Visual Studio 项目这会有利于将 Visual Studio 2005 项目升级到 Visual Studio 2008

Office Space: 通过 STSDEV 简化 SharePo<img src='/icons/68927int.gif' /> 开发

  Figure 3HelloWorld 项目结构

  STSDEV 实用会使用其标准项目结构创建个名为 DeploymentFiles 文件夹和另个名为 RootFiles 文件夹DeploymentFiles 文件夹包含 4个文件用于生成、部署和调试输出解决方案包:

  Manest.xml 解决方案包 manest 对 SharePo 而言是必不可少必须将其内置于输出解决方案包文件中(例如 HelloWorld.wsp)

  SolutionPackage.ddf 个菱形定义文件在 MAKECAB.EXE 实用中用作输入来生成解决方案包文件

  SolutionConfig.xml 个用于 STSDEV 文件可跟踪重新生成 manest.xml 和 SolutionPackage.ddf 所需其他解决方案元数据此元数据包括解决方案 ID GUID、输出解决方案包名称以及可选其他集部署信息如 SafeControl 条目和自定义“代码访问安全性”(CAS) 设置

  Microsoft.SharePo.targets 个包含 MSBuild 格式自定义生成目标文件可用在 SharePo 开发中

  虽然 DeploymentFiles 文件夹始终包含这 4个文件但是 RootFiles 文件夹内容却随着所选解决方案类型区别而变化在您创建空解决方案时RootFiles 文件夹最初并不包含任何文件或文件夹但是RootFiles 文件夹是您添加各个模板文件位置该模板文件在每个前端 Web 服务器 RootFile 目录中都需要进行部署

  每次将新文件添加到 RootFiles 文件夹时都需要更新 manest.xml 文件以及 SolutionPackage.ddf不过在您每次重新生成项目时STSDEV 实用可以为更新这些文件提供便利它借助 RefreshDeploymentFiles 命令来实现此目该命令通过枚举它在 RootFiles 目录中找到文件夹和文件来重新生成 manest.xml 和 SolutionPackage.ddf 文件

  我们来看个举例创建空解决方案时manest.xml 文件如下所示:

<Solution
 SolutionId="24F91DED-8BA7-4633-8BA0-4C9B2A4387D7"
 ReWebServer="True"
 xmlns="http://schemas.microsoft.com/sharepo/" >
 
</Solution>
  同样SolutionPackage.ddf 文件如下所示:

; Generated by STSDEV at 1/7/2008 8:42:21 AM
.OPTION EXPLICIT
.Set CabinetNameTemplate=HelloWorld.wsp
. DiskDirectoryTemplate=CDROM
.Set CompressionType=MSZIP
.Set UniqueFiles=off
.Set Cabinet=on
.Set DiskDirectory1=DeploymentFiles
DeploymentFilesmanest.xml
  但是如果在 RootFiles 文件中添加些新文件夹然后将个图像文件(如 AfricanPith32.g)复制到其中会发生什么情况呢?下次运行 Visual Studio 生成命令时会有个自定义生成目标 STSDEV 实用并执行 RefreshDeploymentFiles 命令manest.xml 随即被更新如下所示:

<Solution
 SolutionId="24F91DED-8BA7-4633-8BA0-4C9B2A4387D7"
 ReWebServer="True"
 xmlns="http://schemas.microsoft.com/sharepo/" >
 <!--TEMPLATE files-->
 <TemplateFiles>
  <TemplateFile
   Location="IMAGESHelloWorldAfricanPith32.g" />
 </TemplateFiles>
</Solution>
  SolutionPackage.ddf 文件将被更新以包括:

...
;*** Solution manest
DeploymentFilesmanest.xml
.Set DestinationDir=IMAGESHelloWorld
RootFilesTEMPLATEIMAGESHelloWorldAfricanPith32.g
  尽管 RefreshDeploymentFiles 命令能够确定要添加到 manest.xml 和 SolutionPackage.ddf 文件但仍需跟踪有关解决方案自身其他元数据以及任何应在解决方案包内部署因此STSDEV 在最初就被设计为生成个名为 SolutionConfig.xml XML 元数据文件并在重新生成 manest.xml 和 SolutionPackage.ddf 时候读取此文件内容

  SolutionConfig.xml 文件最基本版本如下所示:

<Solution> <SolutionId>24F91DED-8BA7-4633-8BA0-4C9B2A4387D7</SolutionId>
 <SolutionName>HelloWorld</SolutionName>
 <ReWebServer>True</ReWebServer>
 <AssemblyDeployment>False</AssemblyDeployment>
</Solution>
  如您所见SolutionConfig.xml 文件将跟踪解决方案 ID GUID、解决方案名称以及个用于在 manest.xml 中添加指令名为 ReWebServer 布尔值它可以控制在部署、升级或收回输出解决方案包后WSS 是否在每个前端 Web 服务器上运行 IISRESET

  SolutionConfig.xml 还包含个名为 AssemblyDeployment 元素此元素可通过 RefreshDeploymentFiles 命令读取利用它可添加有关个或多个需要在输出解决方案包中部署配置以及所需集配置信息

  例如如果通过选择空解决方案 (C# assembly) 创建了 HelloWorld 项目则 SolutionConfig.xml 文件状态应如图 4 所示 2进制文件和元数据信息随后将被添加到 manest.xml 和 SolutionPackage.ddf 中用于进行集部署

Office Space: 通过 STSDEV 简化 SharePo<img src='/icons/68927int.gif' /> 开发Figure4Deploying an Assembly with SolutionConfig.xml

<!-- SolutionConfig.xml file for an Empty Solution with C# assembly -->
<Solution>
 <SolutionId>24F91DED-8BA7-4633-8BA0-4C9B2A4387D7</SolutionId>
 <SolutionName>HelloWorld</SolutionName>
 <ReWebServer>True</ReWebServer>
 <AssemblyDeployment>True</AssemblyDeployment>
 <!--Assembly files-->
 <Assemblies>
  <Assembly Location="HelloWorld.dll"
       DeploymentTarget="GlobalAssemblyCache">
   <SafeControls>
    <SafeControl Assembly="HelloWorld, [full 4-part assembly name]"
           Namespace="HelloWorld"
           TypeName="*"
           Safe="True" />
   </SafeControls>
  </Assembly>
 </Assemblies>
</Solution>
  使用 MSBuild 创建自定义生成目标

  STSDEV 并不使用批处理文件而是充分利用 MSBuild 功能来创建可集成到 Visual Studio 解决方案中自定义生成目标特别要指出STSDEV 将在包含自定义生成目标 DeploymentFiles 文件夹中创建个名为 Microsoft.SharePo.targets 文件这就使得利用在 SharePo 开发中通用完整命令集来创建每个新解决方案成为可能图 5 提供了为每个新项目生成自定义生成目标列表

Office Space: 通过 STSDEV 简化 SharePo<img src='/icons/68927int.gif' /> 开发Figure5Custom Build Targets

目标 介绍说明
DebugBuild 生成项目输出集 DLL 调试版本后此命令将刷新解决方案部署文件然后使用 MAKECAB.EXE 生成输出解决方案包 .wsp 文件
DebugInstall 此命令使用 STSADM –addsolution 操作将解决方案包 .wsp 文件安装到本地场解决方案包存储区中
DebugDeploy 此命令使用 STSADM –deploysolution 操作在场中部署解决方案包
DebugUpgrade 此命令使用 STSADM –upgradesolution 操作升级解决方案包
DebugQuickCopy 此命令执行简单复制命令将解决方案 RootFiles 文件夹内容复制到本地 Web 服务器 WSS RootFiles 目录中
DebugRetract 此命令使用 STSADM –retractsolution 操作从场中收回解决方案包
DebugDelete 此命令使用 STSADM –deletesolution 操作从本地场解决方案包存储区中删除解决方案包 .wsp 文件
ReleaseBuild 生成项目输出集 DLL 发行版本后此命令将刷新解决方案部署文件然后使用 MAKECAB.EXE 生成输出解决方案包 .wsp 文件



  请注意使用自定义生成目标会带来安全方面问题每次使用自定义生成目标打开项目或解决方案时 Visual Studio 都会发出警告以提醒开发人员避免受到意外攻击因此当您第次打开使用 STSDEV 实用创建项目时应会看到安全警告信息

  对我而言这是次深入探讨 Microsoft.SharePo.targets 文件内容好机会如果打开此文件您会看到使用类似于图 6 所示结构格式化 XML 文件如您所见MSBuild 需要个顶层 Project 元素在 Project 元素中包含些子元素如 PropertyGroup 和 Target

Office Space: 通过 STSDEV 简化 SharePo<img src='/icons/68927int.gif' /> 开发Figure6Microsoft.SharePo.targets

<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="DebugBuild"
 xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <PropertyGroup>
  <PackageName>HelloWorld.wsp</PackageName>
  <PackageFile>HelloWorld.wsp</PackageFile>
  <WssRootFilesFolder> <!--RootFiles path--> </WssRootFilesFolder>
  <MAKECAB> <!-- MAKECAB.EXE path--> </MAKECAB>
  <STSADM> <!-- STSADM.EXE path--> </STSADM>
  <STSDEV> <!—STSDEV.EXE path--> </STSDEV>
 </PropertyGroup>
<Target Name="DebugBuild">
  <!—custom build target 1 -->
 </Target>
 <Target Name="DebugInstall" DependsOnTargets="DebugBuild">
  <!—custom build target 2 -->
 </Target>
</Project>
  请注意Microsoft.SharePo.targets 顶部 PropertyGroup 部分用于跟踪元数据和值(如单个目标命令中所需文件路径和名称等)您可以看到 Microsoft.SharePo.target 将跟踪输出解决方案包文件名以及实用完全限定文件路径如 MAKECAB 和 STSADM此外还有个属性它可跟踪 STSDEV 自身本地文件路径以便命令目标能够 STSDEV 实用并执行 RefreshDeploymentFiles 命令

  现在就让我们来看下几个生成目标首先我将检查在名为 DebugBuild 生成目标中定义命令如图 7 所示

Office Space: 通过 STSDEV 简化 SharePo<img src='/icons/68927int.gif' /> 开发Figure7DebugBuild Build Target

<Target Name="DebugBuild">
 <Message Text="Refreshing Deployment Files..." Importance="high" />
 <Exec Command="$(STSDEV) /refresh $(TargetName) $(SolutionDir)"
  ContinueOnError="false" />
 <Message Text="Deleting Solution Package File..." Importance="high" />
 <Delete Files="$(ProjectDeploymentFilesFolder)$(PackageFile)"
  ContinueOnError="true" />
 <Message Text="Building Solution Package (Debug Version)"
  Importance="high" />
 <Exec Command="$(MAKECAB) /F
  $(ProjectDeploymentFilesFolder)SolutionPackage.ddf /D
  CabinetNameTemplate=$(PackageFile)" ContinueOnError="false" />
</Target>
  如您所见DebugBuild 目标中个命令将 STSDEV 并传递 /refresh 参数以运行 RefreshDeploymentFiles 命令这将导致 STSDEV 实用重新生成 manest.xml 和 SoutionPackage.ddf 作为解决方案包生成过程部分随后执行个 MSBuild 命令来删除任何现有 .wsp 文件并使用 MAKECAB.EXE 实用重新生成解决方案包还应注意 Message 命令使用它可用于在命令运行时通过 Visual Studio 输出窗口向开发人员显示信息性消息

  所编写 DebugInstall 命令可使用 STSADM 提供 addsolution 操作将新生成解决方案包 .wsp 文件安装到本地场解决方案存储区中还要注意 DependsOnTargets 属性使用它会在每次执行 DebugInstall 目标时首先运行 DebugBuild 目标命令:

<Target Name="DebugInstall" DependsOnTargets="DebugBuild">
<Message Text="Installing Solution..." Importance="high" />
 <Exec Command="$(STSADM) -o addsolution -filename
  $(ProjectDeploymentFilesFolder)$(PackageFile)"
  ContinueOnError="true" />
 <Exec Command="$(STSADM) -o execadmsvcjobs" />
 <Message Text="" Importance="high" />
</Target>
  STSADM 实用所展示许多操作都使用计时器作业异步运行因此还有另外个对 STSADM 它运行 execadmsvcjobs 操作此操作可使命令暂停并等待直到本地 SharePo Web 服务器能够运行完所有挂起计时器作业为止 deploysolution 操作后还会立即在 DebugDeploy 目标中 execadmsvcjobs 操作:

<Target Name="DebugDeploy" DependsOnTargets="DebugInstall">
 <Message Text="Deploying Solution..." Importance="high" />
 <Exec Command="$(STSADM) -o deploysolution -name
  $(PackageName) -local -allowGacDeployment -force" />
 <Exec Command="$(STSADM) -o execadmsvcjobs" />
 <Message Text="" Importance="high" />
</Target>
  现在您已经看到在由 STSDEV 实用生成 Microsoft.SharePo.targets 文件中存在区别自定义生成目标接下来您需要了解如何在 Visual Studio 环境中执行它们这其实非常简单您只需选择和所需生成目标相关联 Visual Studio 配置然后运行标准 Visual Studio 生成命令即可如图 8 所示

Office Space: 通过 STSDEV 简化 SharePo<img src='/icons/68927int.gif' /> 开发

  Figure 8执行 STSDEV 生成生成目标

  用来绑定这些自定义生成目标 MSBuild 技术要求将个 Target 元素添加到 Visual Studio 项目文件中(例如HelloWorld.csproj)STSDEV 会在您每次创建新解决方案时自动完成此操作如果打开其中个 .csproj 文件并查看其底部您会看到类似于图 9 所示 Target 部分

Office Space: 通过 STSDEV 简化 SharePo<img src='/icons/68927int.gif' /> 开发Figure9Targets in a Visual Studio Project

<Target Name="AfterBuild">
 <CallTarget Targets="DebugBuild"
  Condition="'$(Configuration)|$(Platform)' 'DebugBuild|AnyCPU'"/>
 <CallTarget Targets="DebugInstall"
  Condition="'$(Configuration)|$(Platform)' 'DebugInstall|AnyCPU'"/>
 <CallTarget Targets="DebugDeploy"
  Condition="'$(Configuration)|$(Platform)' 'DebugDeploy|AnyCPU'"/>
 <CallTarget Targets="DebugRedeploy"
  Condition="'$(Configuration)|$(Platform)' 'DebugRedeploy|AnyCPU'"/>
 <CallTarget Targets="DebugUpgrade"
  Condition="'$(Configuration)|$(Platform)' 'DebugUpgrade|AnyCPU'"/>
 <CallTarget Targets="DebugQuickCopy"
  Condition="'$(Configuration)|$(Platform)' 'DebugQuickCopy|AnyCPU'"/>
 <CallTarget Targets="DebugRetract"
  Condition="'$(Configuration)|$(Platform)' 'DebugRetract|AnyCPU'"/>
 <CallTarget Targets="DebugDelete"
  Condition="'$(Configuration)|$(Platform)' 'DebugDelete|AnyCPU'"/>
 <CallTarget Targets="ReleaseBuild"
  Condition="'$(Configuration)|$(Platform)' 'ReleaseBuild|AnyCPU'"/>
</Target>
  您会注意到Target 部分名称为 AfterBuild这是个众所周知目标名称在完成每个生成后 Visual Studio 都会自动运行它这将便于您为每个生成目标添加个 CallTarget 命令以及某个条件以根据所选配置执行相应自定义生成目标

  扩展 STSDEV 实用

  STSDEV 实用附带了些举例解决方案提供不过其真正吸引人的处是通过添加自己解决方案提供来扩展 STSDEV如果您想尝试此操作请打开本月专栏所附带 STSDEV 项目源代码并检查部分现有解决方案提供类实现

  如果您打开诸如 SimpleFeatureSolutionProvider.cs 或 WebPartSolutionProvider.cs 的类源文件并遍历 InitializeSolution 和 AddSolutionItems 思路方法中代码您会发现生成解决方案提供件轻而易举事情名为 SolutionBuilder 类包含个公共静态思路方法可用于创建若干个在 SharePo 开发项目中所需通用文件您还会发现些解决方案提供(如 SimpleFeatureSolutionProvider.cs 中个提供)可和用户进行交互能够使用通过 Windows 窗体创建模式对话框提示用户所需其他配置项

  我希望您作为名 SharePo 开发人员能觉得 STSDEV 实用既有教育意义又对您日常生活有所帮助此实用是 SharePo 开发人员社区产品您可以随时通过 CodePlex 网站WebSite获取其最新版本源代码网址为 codeplex.com/stsdev在 CodePlex STSDEV 站点上您还会发现些其他资源(如系列介绍性屏幕广播)可帮助您快速掌握和运行此实用欢迎您提供反馈并发布些您在 SharePo 开发工作中创建任何解决方案提供举例

Tags:  sharepoint2007 sharepoint sharepoint开发 officesharepoint

延伸阅读

最新评论

发表评论