CodeSmith基础(七)

本文翻译的内容为 CodeSmith 控制台指南。
很多人仅仅知道 CodeSmith 像一个图形应用程序,或者可能是一个 Visual Studio 的附件,但是通过 CodeSmith 的控制台应用程序还有好多其他的使用方法。控制台应用程序是很有价值的,因为可以通过它去生成脚本,或者其他一些自动工具。这篇文档的目的就是要告诉你怎样使用它的控制台应用程序并且如何去定义变量和参数。
Basic Usage
大多数情况下是用控制台应用程序来创建一个模板,一个属性文件,然后保存输出的文件。这有一个很好的例子介绍将合并模版的处理过程放到一个过程中,就像使用 NAnt 工具。
首先我们要确定完成一个什么样的模版,为这个模板创建一个什么样的 XML 属性文件。 XML 属性文件提供在执行模版是需要的各个属性。生成一个属性文件最简单的方法是在 CodeSmith Explorer 中打开一个模版,填写属性,点击生成按钮 generate ,然后再点击 Save Property Set XML 按钮。这个按钮会在点击完生成按钮后找到,在 Save Output Copy Output 按钮旁边。然后系统提示输入保存 XML 属性文件的文件名,下面看一个 ArrayList.cst 模版创建的 XML 属性文件。
 1 <? xml version="1.0" encoding="us-ascii" ?>
 2 < codeSmith >
 3              < propertySet >
 4                          < property  name ="Accessibility" > Public </ property >
 5                          < property  name ="ClassName" > PersonArray </ property >
 6                          < property  name ="ItemType" > Person </ property >
 7                          < property  name ="ItemValueType" > False </ property >
 8                          < property  name ="ItemCustomSearch" > False </ property >
 9                          < property  name ="KeyName" > PersonID </ property >
10                          < property  name ="KeyType" > int </ property >
11                          < property  name ="IncludeInterfaces" > True </ property >
12                          < property  name ="IncludeNamespaces" > False </ property >
13              </ propertySet >
14 </ codeSmith >
就像看到的一样,也可以手动创建这个文件,但是使用 CodeSmith Explorer 会更简便。
现在我们有了这个 XML 文件,我们继续看一下如何去执行这个模版并是用控制台工具保存结果。首先我们需要是用 /template 参数去声明我们要是用的模版,像这样:
C:\Program Files\CodeSmith\v3.0>cs /template:Samples\Collections\ArrayList.cst
在这个例子中我们使用了 ArrayList.cst 模版,它存储在本地的 Samples\Collections 文件夹下。下一步我们要去声明我们在最后一步需要创建的 XML 文件,我们是用 /propertyset 参数去实现。
C:\Program Files\CodeSmith\v3.0>cs /template:Samples\Collections\ArrayList.cst  /propertyset:PersonArray.xml
这个 /property 参数用来指定我们的 XML 属性文件。最后一个我们需要用的参数是 /output 参数,用来指定输出怎样被保存。
C:\Program Files\CodeSmith\v3.0>cs /template:Samples\Collections\ArrayList.cst /propertyset:PersonArray.xml /out:test.cs
使用 /out 参数指定将结果输出到一个叫 test.cs 文件中保存。执行这个命令后,模板将开始运行,使用属性文件将结果输出到 test.cs 文件保存。
这是大多数情况下有效使用控制台。
 
Merging Output
在各种代码生成中最大的挑战就是将生成的代码和开发人员编写或修改的代码区分开。控制台对这个问题提供了一个有效的独特的解决方案,使用一个指定的参数在当前已存在的代码文件中需要将模板生成的代码添加的地方指定一块区域。
下面是一个简单的代码文件,包含了我们要添加生成代码的区域。
1 using  System;
2
3 namespace  Entities
4 {
5      GeneratedOrderEntity#region GeneratedOrderEntity
6 
7
8      #endregion
  
9}
我们的目标是将DatabaseSchema\BusinessObject.cst模版生成的代码添加到类文件的GeneratedOrderEntity区域中。和上一个例子一样,使用CodeSmith console控制台应用程序执行这个模版,但是这次要使用另一个参数merge
C:\Program Files\CodeSmith\v3.0>cs /template:Samples\DatabaseSchema\BusinessObjec t.cst /propertyset:OrderEntity.xml /out:OrderEntity.cs /merge:InsertRegion= "RegionName=Sample Generated Region;Language=C#;"
使用 merge 参数我们可以指定区域的名称,在这个例子中是 GeneratedOrderEntity ,然后控制台应用程序将执行模版,并将结果添加到这个区域中。我们来看一下执行完这个指令后生成的代码。
 1 using  System;
 2
 3 namespace  Infozerk.AuthServices.UnitTestSuite
 4 {
 5      GeneratedOrderEntity#region GeneratedOrderEntity
 6      
 7
 8      Order#region Order
 9      /**//// <summary>
10      /// This object represents the properties and methods of a Order.
11      /// </summary>

12      public class Order
13      {
14            protected int _id;
15            protected string _customerID = String.Empty;
16            protected int _employeeID;
17            protected DateTime _orderDate;
18            protected DateTime _requiredDate;
19            protected DateTime _shippedDate;
20            protected int _shipVia;
21
22--为了简短省略了类的其他部分
就像看到的一样,Order类被添加到了我们指定的区域中。在代码文件中使用merge参数生成的内容在其他部分被修改或手写后很容易重新再次生成而不会产生影响。
 
参数介绍Parameter Reference
 
Specifying Output
/out:<file>
指定从模版创建的输出文件的名称。
/out:default
指定这个文件被默认保存成模版是用的名称。
/merge:<mergetype>=<init>
指定模版输出的区域。可以简写为 /m
 
Specifying Input
/template:<file>
选择要执行的模版,简写为 /t
/propertyset:<file>
生成代码时需要使用的 XML 属性文件。简写为 /p
 
Compiler Options
/debug[+|-]
指定模版需要包含的调试信息。(允许在运行模版时进行调试)
/tempfiles[+|-]
指定保留临时文件。(如果在临时文件上调试也可以)
 
Miscellaneous
/help
显示帮助信息。
/nologo
禁止生成器版权信息。

你可能感兴趣的:(基础,职场,休闲,codesmith)