我有一个T4模板,可以处理我项目中的几个.tt文件。我还有一些我定义的自定义类来帮助代码转换过程。
<#@ template language="C#" hostspecific="True" debug="True" #>
<#@ output extension="cs" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="$(TargetDir)\MyDependency.dll" #>
这在Visual Studio中有效,我有一个VS宏,它可以正确定义$(TargetDir)。
现在,我想在构建过程中执行代码生成过程。我补充说:
<TransformOnBuild>true</TransformOnBuild>
<OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
<IncludeDslT4Settings>true</IncludeDslT4Settings> <ItemGroup>
<T4ReferencePath Include="$(OutputPath)" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />
我的构建运行,但我得到:
C:\ Program Files (86)\的MSBuild \微软\ VisualStudio的\ TextTemplating \ V10.0 \ Microsoft.TextTemplating.targets (407):主持人在尝试解决问题时抛出异常 程序集引用'$(TargetDir)\ MyDependency.dll'。转型 不会运行。抛出以下异常: System.IO.FileLoadException:给定的程序集名称或代码库是 无效。 (来自HRESULT的异常:0x80131047)at System.Reflection.AssemblyName.nInit(RuntimeAssembly&amp; assembly, Boolean forIntrospection,Boolean raiseResolveEvent)at System.Reflection.AssemblyName.nInit()at Microsoft.VisualStudio.TextTemplating.GlobalAssemblyCacheHelper.GetLocation(字符串 strongName)at Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost.ResolveAssemblyReference(字符串 assemblyReference)at Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences(ITextTemplatingEngineHost host,TemplateProcessingSession session)。 Line = -1,Column = -1
显然,它无法解决团队构建环境中的$(TargetDir)
。
我尝试将TargetDir添加到我的构建配置的属性组中,但无济于事。该值不会传递到T4代码生成器的上下文。
我不想使用环境变量。
如何在Team Build上下文中正确设置$(TargetDir)
?
答案 0 :(得分:4)
我没有看到visual studio定义$(OutputPath)的位置。你在项目中的项目中尝试过$(TargetDir)吗?然后你可以从T4文件中的Assembly声明中删除$(TargetDir)\。
我只是通过一系列可能来获得类似工作的东西,今天或明天都会做一篇博客文章。
所以:
<ItemGroup>
<T4ReferencePath Include="$(TargetDir)" />
</ItemGroup>
你的csproj中的和
<#@ assembly name="MyDependency.dll" #>
在您的T4文件中