您的位置:首页 > 产品设计 > UI/UE

t4 template & MSBuild 入门

2011-09-16 10:28 537 查看
Solution structure.



Part 1. Build files, can be put in an solution folder.

1. Load.targets do necessary remote/local lib loading before build, it's a once for all, it can be build everywherek or custimized in local, more readable and maintainable.

--Load.targets

<?xml version="1.0" encoding="utf-8"?>

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="MSBuild.targets.local"
Condition="Exists('MSBuild.targets.local')"/>
<Import Project="MSBuild.targets"
Condition="!Exists('MSBuild.targets.local')"/>
</Project>


--MSBuild.targets defines the build tasks necessary in build time.


2. MSBuild.targets, definition of the path of dll reference and other tasks which would be executed at build time.

<?xml version="1.0" encoding="utf-8"?>

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<EQTGVersion>2.0.0</EQTGVersion>
<CoreVersion>2.8.1.14</CoreVersion>
<SecurityVersion>2.8.1.14</SecurityVersion>
<RdsVersion>1.16.1.201</RdsVersion>
<DmdsApiVersion>2.8.300649.1</DmdsApiVersion>
<DmdsCoreVersion>2.8.299779.1</DmdsCoreVersion>

<LocalLibraryHome>$(RAZORLOCALLIBROOT)</LocalLibraryHome>
<!--$(RAZORLOCALLIBROOT) is a system Variable, if you dont add it manually, then razor.targets uses ..\lib-->
<LocalLibraryHome Condition="$(LocalLibraryHome)==''">..\..\..\Lib</LocalLibraryHome>

<RazorLibraryHome Condition="$(USERDOMAIN)=='EUR'">\\ldneqtsabd681dv\Packages</RazorLibraryHome>
<RazorLibraryHome Condition="$(USERDOMAIN)=='APAC'">\\apaccmhkdr031.apac.nsroot.net\distribution\Razor\Packages</RazorLibraryHome>
<RazorLibraryHome Condition="$(RazorLibraryHome)==''">\\nasrut151v8cap.nam.nsroot.net\dev_nt_grp4\Razor\Packages</RazorLibraryHome>

<ReleaseRazorLibraryHome>$(RazorLibraryHome)\Released</ReleaseRazorLibraryHome>
<BetaRazorLibraryHome>$(RazorLibraryHome)\Beta</BetaRazorLibraryHome>

<RazorBuildToolsHome Condition="$(RazorBuildToolsHome)==''">C:\RazorBuildTools</RazorBuildToolsHome>

<ThirdPartyLibraryHome Condition="$(USERDOMAIN)=='EUR'">\\ldneqtsabd681dv\Libraries</ThirdPartyLibraryHome>
<ThirdPartyLibraryHome Condition="$(USERDOMAIN)=='APAC'">C:\Razor\lib</ThirdPartyLibraryHome>
<ThirdPartyLibraryHome Condition="$(ThirdPartyLibraryHome)==''">\\nasrut151v8cap.nam.nsroot.net\dev_nt_grp4\Razor\3rd_Party_Libs\Libraries</ThirdPartyLibraryHome>

<RazorLibrarySnk>..\..</RazorLibrarySnk>

<DmdsApiHome>DmdsApi\$(DmdsApiVersion)\Release</DmdsApiHome>
<DmdsApiLibraryHome>$(LocalLibraryHome)\$(DmdsApiHome)</DmdsApiLibraryHome>

<DmdsCoreHome>DmdsCore\$(DmdsCoreVersion)\Release</DmdsCoreHome>
<DmdsCoreLibraryHome>$(LocalLibraryHome)\$(DmdsCoreHome)</DmdsCoreLibraryHome>

<SecurityHome>Security\$(SecurityVersion)\Release</SecurityHome>
<SecurityLibraryHome>$(LocalLibraryHome)\$(SecurityHome)</SecurityLibraryHome>

<RxHome>Microsoft\Reactive Extensions\v1.0.2563.0\Net35</RxHome>
<RxLibraryHome>$(LocalLibraryHome)\$(RxHome)\</RxLibraryHome>

<Log4netHome>log4net\1.2.10.0\bin\net\2.0\debug</Log4netHome>
<Log4netLibraryHome>$(LocalLibraryHome)\$(Log4netHome)\</Log4netLibraryHome>

<RhinoMocksHome>RhinoMocks\3.6.0.0</RhinoMocksHome>
<RhinoMocksLibraryHome>$(LocalLibraryHome)\$(RhinoMocksHome)</RhinoMocksLibraryHome>

<MspecHome>Mspec\0.3.0.0</MspecHome>
<MspecLibraryHome>$(LocalLibraryHome)\$(MspecHome)</MspecLibraryHome>

</PropertyGroup>

<!-- Razor build tools -->
<UsingTask AssemblyFile="$(RazorBuildToolsHome)\Razor.Core.MSBuildTasks.dll" TaskName="ApplyT4Template"/>
<UsingTask AssemblyFile="$(RazorBuildToolsHome)\Razor.Core.MSBuildTasks.dll" TaskName="ApplyT4Templates"/>
<UsingTask AssemblyFile="$(RazorBuildToolsHome)\Razor.Core.MSBuildTasks.dll" TaskName="CopyManyToOne"/>
<UsingTask AssemblyFile="$(RazorBuildToolsHome)\MSBuild.ExtensionPack\3.5.8.0\MSBuild.ExtensionPack.dll" TaskName="MSBuild.ExtensionPack.FileSystem.RoboCopy"/>

<Target Name="SyncFiles" >

<!--Third Party-->
<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="$(ThirdPartyLibraryHome)\$(MspecHome)" Destination="$(LocalLibraryHome)\$(MspecHome)" Files="*.*" Options="/e" ContinueOnError="true" />

<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="$(ThirdPartyLibraryHome)\$(RhinoMocksHome)" Destination="$(LocalLibraryHome)\$(RhinoMocksHome)" Files="*.*" Options="/e"/>
<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="$(ThirdPartyLibraryHome)\$(RxHome)" Destination="$(LocalLibraryHome)\$(RxHome)" Files="*.*" Options="/e"/>
<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="$(ThirdPartyLibraryHome)\$(Log4netHome)" Destination="$(LocalLibraryHome)\$(Log4netHome)" Files="*.*" Options="/e"/>

<!--Beta Beta Beta Beta  $(BetaRazorLibraryHome) -->
<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="$(BetaRazorLibraryHome)\$(DmdsApiHome)" Destination="$(LocalLibraryHome)\$(DmdsApiHome)" Files="*.*" Options="/e"/>
<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="$(BetaRazorLibraryHome)\$(DmdsCoreHome)" Destination="$(LocalLibraryHome)\$(DmdsCoreHome)" Files="*.*" Options="/e"/>
<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="$(BetaRazorLibraryHome)\$(SecurityHome)" Destination="$(LocalLibraryHome)\$(SecurityHome)" Files="*.*" Options="/e" />

</Target>
</Project>


3. Xml.Encoding.ttinclude, xml header which would be output to app.config

<?xml version="1.0" encoding="utf-8"?>


4. Common.Definitions.ttinclude, definition of variables/common configure sections for the whole system(impact all components/subsystems)

<#@ template language="C#v3.5" #>
<#+

const string EnvDev = "DEV";
const string EnvIst = "IST";
const string EnvCi = "CI";
const string EnvQa = "QA";
const string EnvUat = "UAT";
const string EnvProd = "PROD";
const string RegionNam = "NAM";
const string RegionEmea = "EMEA";
const string RegionApac = "APAC";

public static AppDefinitions Settings;

public partial class AppDefinitions
{
public string ServiceQueue;
public Version CLRVersion;
public string Environment;

public static AppDefinitions Base_ApacProd()
{
var appDefinition  = new AppDefinitions()
{
ServiceQueue = "Apac_Prod_Queue",
CLRVersion = new Version(1, 1, 0, 0),
Environment = @"PROD",
};

return appDefinition;
}
}
#>


5. MSBuild.Definitions.ttinclude, definition of configure variables particularly for current components instead of the whole system.

<#+
public partial class AppDefinitions
{
public string EmailAddress;
public string BusinessRegion;

public static AppDefinitions LoadApacProd()
{
var appDefinition = Base_ApacProd();
appDefinition.EmailAddress = @"lefeng.gu@citi.com";
appDefinition.BusinessRegion = @"APAC";

return appDefinition;
}
}
#>


Part 2 . Demo.

1. App.Config.ttinclude, which is the template of app.config

"Settings" is the static filed defined in "Common.Definitions.ttinclude".

<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821 "/>
</configSections>
<appSettings>
<add key="MSBuild.Environment" value="<#= Settings.BusinessRegion #>" />
<# if (Settings.Environment == EnvProd) { #>
<add key="DevEQRMSPassword" value="<#= Settings.Environment #>"/>

<!-- Password for the razor01 functional user when running in a DEV environment.
Remove when running in PROD as the password will be retrieved from the encrypt.txt file -->
<add key ="FunctionalUser.Password" value ="123456" />
<# } #>
</appSettings>
</configuration>


2. App.tt, which will generate the specified config file when saving.

Please pay attention to the relative path of refered template file and the sequence of the files.

"Settings" is the static filed defined in "Common.Definitions.ttinclude".

<#@ output extension="config" #>
<#@ include file="..\Xml.Encoding.ttinclude" #>
<#@ include file="..\Common.Definitions.ttinclude" #>
<#@ include file="..\MSBuild.Definitions.ttinclude" #>
<#
Settings = AppDefinitions.LoadApacProd();
Settings.EmailAddress = "glf2046@163.com";
#>
<#@ include file = "Configuration\App.Config.ttinclude" #>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: