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

使用 Sandcastle、NAnt 和 CruiseControl.NET 生成 MSDN 风格的文档

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.81/5 (12投票s)

2006 年 9 月 4 日

CPOL

5分钟阅读

viewsIcon

82610

使用 CruiseControl.NET 运行 Sandcastle 的 NAnt 任务

Sample Image - ccnetsandcastle.jpg

引言

本文介绍了使用 Sandcastle 通过 NAnt(一种脚本语言)生成 MSDN 风格文档的步骤。这些脚本是为从 CruiseControl.NET 项目启动而开发的,但您也可以轻松地直接从 NAnt 启动它们。

背景

Sandcastle 是微软新的 MSDN 风格文档生成器。Sandcastle 组件通过反射收集有关您的程序集的信息,并将其与源代码中的 XML 注释结合。输出是一组 HTML 页面,您可以选择将其编译为 CHM 或 HxS 格式。本文提出的 NAnt 脚本是 CruiseControl.NET 项目的一部分,并密切遵循了在此官方 Sandcastle 博客文章中详细阐述的 12 个生成 CHM 的步骤,并在上图中有图形表示。

准备工作

提出的 NAnt 脚本集将在以下假设下工作

  • 您要为其生成文档的应用程序已成功编译。您的程序集存储在一个目录中,该目录的路径存储在名为 ${bin.intern.dir} 的 NAnt 属性中。
  • 提取的 XML 文档文件位于由 ${documentation.dir} 属性引用的目录中——它们是通过使用您喜欢的编译器的 /doc 命令行参数生成的。
  • 所有依赖的第三方程序集(例如 Infragistics、Composite UI Application Block、Liquid XML Library、Wilson OR Mapper)都位于一个目录中,该目录的路径存储在 ${bin.extern.dir} 属性中。

代码

属性部分

为了保持构建脚本的核心部分的可读性和可维护性,让我们先为所有固定的目录、可执行文件和 XSL 转换路径创建一些属性。

<!-- Directories -->
<property name="sandcastle.dir"
          value="F:\Program Files\Sandcastle" />
<property name="sandcastle.workingdir" 
          value="${projects.dir}\${CCNetProject}\SandcastleWorkingDir" />
<property name="sandcastle.output.dir" 
          value="${sandcastle.workingdir}\Output" />
<!-- Executables -->
<property name="sandcastle.mrefbuilder.exe" 
          value="${sandcastle.dir}\productiontools\mrefbuilder.exe" />
<property name="sandcastle.buildassembler.exe" 
          value="${sandcastle.dir}\productiontools\buildassembler.exe" />
<property name="sandcastle.xsltransform.exe" 
          value="${sandcastle.dir}\productiontools\xsltransform.exe" />
<!-- Transformations -->
<property name="sandcastle.addoverloads.xsl" 
          value="${sandcastle.dir}\ProductionTransforms\AddOverloads.xsl" />
<property name="sandcastle.addguidfilenames.xsl" 
          value="${sandcastle.dir}\ProductionTransforms\AddGuidFilenames.xsl" />
<property name="sandcastle.reflectiontomanifest.xsl" 
          value="${sandcastle.dir}\ProductionTransforms\ReflectionToManifest.xsl" />
<property name="sandcastle.reflectiontochmproject.xsl" 
          value="${sandcastle.dir}\ProductionTransforms\ReflectionToChmProject.xsl" />
<property name="sandcastle.reflectiontochmcontents.xsl" 
          value="${sandcastle.dir}\ProductionTransforms\ReflectionToChmContents.xsl" />
<property name="sandcastle.reflectiontochmindex.xsl" 
          value="${sandcastle.dir}\ProductionTransforms\ReflectionToChmIndex.xsl" />
<!-- Help Compiler -->
<property name="hhc.exe" overwrite="false" 
          value="F:\Program Files\HTML Help Workshop\hhc.exe" />

创建空工作目录

NAnt 项目中的第一个任务是创建空工作目录。

<!-- Create or Cleanup Working Directory -->
<mkdir dir="${sandcastle.workingdir}" 
    if="${not directory::exists(sandcastle.workingdir)}" />
<delete>
   <fileset basedir="${sandcastle.workingdir}">
      <include name="**\*" />
   </fileset>
</delete>

准备 BuildAssembler 的输入

创建实际 HTML 文档的 Sandcastle 组件是所谓的 BuildAssembler。它需要三个输入文件:

  1. reflection.xml
  2. sandcastle.config
  3. manifest.xml

以下步骤将创建这些文件:

创建配置文件

此 NAnt 任务会将原始的 sandcastle.config 文件复制到工作目录。原始文件中的相对路径将替换为固定路径,我们将内置的对 comments.xml 文件的引用替换为对包含我们自己的程序集 XML 文档的文件夹的引用。

<!-- Copy configuration file, and hard code references -->
<copy file="${sandcastle.dir}/Presentation/Configuration/Sandcastle.config"
      tofile="${sandcastle.workingdir}/Sandcastle.config"> 
   <filterchain> 
      <replacestring from="&quot;..\..\" to="&quot;${sandcastle.dir}\" /> 
      <replacestring from="&quot;..\" to="&quot;${sandcastle.dir}\Examples\" />
      <replacestring from="&quot;comments.xml" to="&quot;${documentation.dir}\*.xml" /> 
   </filterchain> 
</copy>

创建初始反射文件

MRefBuilder 是 Sandcastle 的核心控制台应用程序之一。它使用反射创建一个 XML 文件,该文件描述了一组程序集的内部结构。其完整的命令行包含:

  • 程序集列表(支持通配符)。
  • /out:XML 输出文件。
  • /dep:逗号分隔的依赖程序集列表(允许通配符)。
  • /internal+|- 指定是否生成内部 API 和外部 API。
<!-- Run MRefBuilder (introspection on assemblies) to create basic Reflection XML -->
<exec program="${sandcastle.mrefbuilder.exe}" workingdir="${sandcastle.workingdir}"> 
   <arg value="${bin.intern.dir}/*.dll" />
   <arg value="${bin.intern.dir}/*.exe" />
   <arg value="/out:reflection.org1.xml" />
   <arg value="/dep:${bin.extern.dir}\*.dll" />
</exec>

MRefBuilder 生成的文件 -reflection.org- 包含两种类型的 XML 元素:

  • <assembly>:程序集元数据(版本、描述、公司等)。
  • <api>:命名空间、类型、成员、构造函数等。

创建最终的 Reflection.xml 文件

这些任务创建最终的 Reflection.xml 文件,其中包含所有必需的信息,但没有任何表示。使用 Sandcastle 的 XSLTransform 工具,我们在 reflection.org 文件上应用两个 XSL 转换。

  • 原始的列表方法和构造函数是扁平的,首先我们必须按重载对这些主题进行分组。
  • 然后,我们为每个主题添加 HTML 文件的名称。

可以将两个转换分步应用,但我将其分开以便于验证结果。

<!-- Create final Reflection XML -->
<!-- Regroup overloads -->
<exec program="${sandcastle.xsltransform.exe}" workingdir="${sandcastle.workingdir}">
   <arg value="reflection.org1.xml" />
   <arg value="/xsl:&quot;${sandcastle.addoverloads.xsl}&quot;" />
   <arg value="/out:reflection.org2.xml" />
</exec>
<!-- Create filenames for html documents -->
<exec program="${sandcastle.xsltransform.exe}" workingdir="${sandcastle.workingdir}">
   <arg value="reflection.org2.xml" />
   <arg value="/xsl:&quot;${sandcastle.addguidfilenames.xsl}&quot;" />
   <arg value="/out:reflection.xml" />
</exec>

如果您想将此目录暴露给您的应用程序的最终用户,那么您可能不会使用 GUID 作为文件名。我建议创建一个自己的转换作为 addguidfilenames.xsl 的替代方案。

创建清单

所谓的 Manifest 又是另一个 XML 文件。它是 Topic 条目的列表,每个 <api> -element 在 reflection.xml 中对应一个条目。

<!-- Create Manifest (list of Topics) -->
<exec program="${sandcastle.xsltransform.exe}" workingdir="${sandcastle.workingdir}">
   <arg value="/xsl:&quot;${sandcastle.reflectiontomanifest.xsl}&quot;" />
   <arg value="reflection.xml" />
   <arg value="/out:manifest.xml" />
</exec>

生成 HTML 文档

准备输出环境

输出目录有四个子文件夹。BuildAssembler 工具将在 html 子文件夹中生成其文档,artscriptsstyles 文件夹是从安装中复制的。它们包含必要的脚本、样式表和图像,以使文档具有 MSDN 的外观和感觉。

<!-- Create Output Environment -->
<mkdir dir="${sandcastle.output.dir}" /> 
<mkdir dir="${sandcastle.output.dir}/html" /> 
<copy todir="${sandcastle.output.dir}"> 
    <fileset basedir="${sandcastle.dir}/Presentation"> 
        <include name="art/*" /> 
        <include name="scripts/*" /> 
        <include name="styles/*" /> 
    </fileset> 
</copy>

生成 HTML 文档

BuildAssembler 是一个通用的控制台应用程序。它将 XML 文档(reflection.xml)通过一个组件管道(如转换器、文件创建器、流程控制器等)。管道是通过 sandcastle.config 构建的,并为每个主题(即 manifest.xml 中的每个条目)执行。BuildAssembler 的命令行包含对 manifest.xml 文件和 sandcastle.config 的引用。对 reflection.xml 和包含 XML 源文档的文件的链接存储在 config 文件中。

<!-- Run BuildAssembler (create html topic files) -->
<exec program="${sandcastle.buildassembler.exe}" workingdir="${sandcastle.workingdir}" >
   <arg value="manifest.xml" />
   <arg value="/config:Sandcastle.config" />
</exec>

此过程的输出是一个目录,其中包含每个主题的链接 HTML 文件。artsscriptsstyles 文件夹中的文件应用了 MSDN 的外观和感觉。文档功能齐全,其余过程是可选的。

生成 CHM 文件

接下来的任务通过 HTML Help Workshop 将当前的 Output 目录转换为单个 CHM 文件。

创建 HTML Help Compiler 的输入

HTML Help compiler 需要三个输入文件:

  1. 一个包含内容的.*hhp文件),
  2. 一个包含目录(.*hhc)的文件。
  3. 一个索引文件(.*hhk)。

这些输入文件都是 XML 文件,可以通过在 reflection.xml 上应用 XSL 转换来生成。

<!-- Create html Help project -->
<exec program="${sandcastle.xsltransform.exe}" workingdir="${sandcastle.workingdir}">
   <arg value="/xsl:&quot;${sandcastle.reflectiontochmproject.xsl}&quot;" />
   <arg value="reflection.xml" />
   <arg value="/out:&quot;${sandcastle.output.dir}\test.hhp&quot;" />
</exec>
<!-- Create html Help project Table Of Contents -->
<exec program="${sandcastle.xsltransform.exe}" workingdir="${sandcastle.workingdir}" >
   <arg value="/xsl:&quot;${sandcastle.reflectiontochmcontents.xsl}&quot;" />
   <arg value="reflection.xml" />
   <arg value="/arg:html=Output\html" />
   <arg value="/out:&quot;${sandcastle.output.dir}\test.hhc&quot;" />
</exec>
<!-- Create html Help project Index -->
<exec program="${sandcastle.xsltransform.exe}" workingdir="${sandcastle.workingdir}" >
   <arg value="/xsl:&quot;${sandcastle.reflectiontochmindex.xsl}&quot;" />
   <arg value="reflection.xml" />
   <arg value="/out:&quot;${sandcastle.output.dir}\test.hhk&quot;" />
</exec>

编译帮助项目

最后,我们通过 Microsoft HTML Help Compiler (v1.4) 将项目编译为 CHM 文件。我不得不将 failonerror 设置为 false 以忽略非零的返回值。

<!-- Generate CHM file -->
<exec program="${hhc.exe}" 
      commandline="test.hhp" 
      workingdir="${sandcastle.output.dir}" 
      failonerror="false"/>

历史

  • 2006 年 9 月 4 日:本文的初始版本

关于 Diederik Krols

Diederik Krols 是一位 .NET 架构师和培训师。作为一名认证的 Scrum Master,他拥抱所有能够尽可能保持开发速度和质量,并将开销降至最低的工具。他在 Real Developer Network 上发布了许多关于 CruiseControl.NET 和开源 N*Stack(NAnt、NUnit、NCover 等)其他组件的文章。他的 个人博客 包含有关反模式的文章。

© . All rights reserved.