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
2. MSBuild.targets, definition of the path of dll reference and other tasks which would be executed at build time.
3. Xml.Encoding.ttinclude, xml header which would be output to app.config
4. Common.Definitions.ttinclude, definition of variables/common configure sections for the whole system(impact all components/subsystems)
5. MSBuild.Definitions.ttinclude, definition of configure variables particularly for current components instead of the whole system.
Part 2 . Demo.
1. App.Config.ttinclude, which is the template of app.config
"Settings" is the static filed defined in "Common.Definitions.ttinclude".
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".
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" #>
相关文章推荐
- 配置GITHUG&入门(2)
- 从0开始玩安全--Python篇--Python入门指导 & 案例Unixshadow密码破解
- Text&nbsp;Kit学习(入门和进阶)
- [转]T4模版引擎之基础入门
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- SpringBoot入门(三)--数据库操作&&Spring-data-jpa的使用
- Python入门&题目的思考
- Cocos2d-x跨Android&iOS平台开发入门
- Ruby on Rails教程 和Ruby&Rails 入门大全,对新手很有用(转)
- Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
- 一个 Android程序员的小程序入门学习笔记『二』(template 模版的使用注意)
- Swift入门———getter & setter
- (4)Android入门——android四大组件基础介绍及打电话,发短信简单应用 &单元测试
- Python入门的36个例子 之 32 -> OOP – Inheritance 继承
- windows下Gulp入门详细教程 &&gulp安装失败的原因(红色)
- matlab入门教程三 ----- 函数运用&&循环&&判断
- git &github 快速入门
- O'Reilly精品图书推荐:数据科学入门
- 实时开发框架Meteor基础入门系列<一>--安装与HelloWorld
- JNI Java 入门篇——传递&&接收基本数据类型