2012-10-30 20 views
9

私のプロジェクトでいくつかの.ttファイルを処理するT4テンプレートがあります。コード変換プロセスを支援するために定義したカスタムクラスもいくつかあります。ビルド中のT4コード生成、カスタムアセンブリ参照

<#@ template language="C#" hostspecific="True" debug="True" #> 
<#@ output extension="cs" #> 
<#@ assembly name="System.Core.dll" #> 
<#@ assembly name="$(TargetDir)\MyDependency.dll" #> 

これはVisual Studioで動作しますが、これは$(TargetDir)を正しく定義するVSマクロを持っています。

ここで、ビルドプロセス中にコード生成プロセスを実行したいと思います。

<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:\プログラムファイル (x86の)\ MSBuildの\マイクロソフト\ VisualStudioを\ TextTemplating \ V10.0 \ Microsoft.TextTemplating。ターゲット (407): アセンブリ参照 '$(TargetDir)\ MyDependency.dll'を解決しようとしているときにホストが例外をスローしました。変換 は実行されません。次の例外がスローされました: System.IO.FileLoadException:指定されたアセンブリ名またはコードベースが無効 でした。 (HRESULTからの例外:0x80131047) System.Reflection.AssemblyName.nInit(RuntimeAssembly &アセンブリ、 ブールforIntrospection、ブールraiseResolveEvent)で System.Reflection.AssemblyName.nInitで() Microsoft.VisualStudio.TextTemplating.GlobalAssemblyCacheHelper.GetLocationで Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferencesでMicrosoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost.ResolveAssemblyReferenceで(文字列 厳密な名前)(文字列 assemblyReference)(ITextTemplatingEngineHost ホスト、TemplateProcessingSessionセッション)。行= -1、列= -1

明らかにチームビルドコンテキストでは$(TargetDir)が解決されません。

ビルド構成のプロパティグループにTargetDirを追加しようとしましたが、無駄です。この値は、T4コードジェネレータのコンテキストに渡されません。

私は環境変数を使いたくありません。

チームビルドのコンテキストで$(TargetDir)を正しく設定するにはどうすればよいですか?

+0

オレグSychは、MSBuildの統合について書いた: ます。http://www.olegsychを。com/2010/04/understanding-t4-msbuild-integration /#IncludeFolders。私はそれがあなたの問題を解決するかどうかは分からないが、それはその話題に関するかなり良いガイドであるようだ。 – FuleSnabel

+0

ええ、そこにサイコロ.. –

答えて

4

Visual Studioによって$(OutputPath)が定義されている場所が表示されません。あなたのプロジェクトであなたのアイテムで$(TargetDir)を試しましたか?次に、T4ファイルのアセンブリ宣言から$(TargetDir)\を削除できます。

私はちょうど仕事に似た何かを得る可能性のスルーを経て、今日または明日のブログ投稿をしています。

だから:あなたのcsprojで

<ItemGroup> 
    <T4ReferencePath Include="$(TargetDir)" /> 
</ItemGroup> 

、そしてあなたのT4ファイル内

<#@ assembly name="MyDependency.dll" #> 

+0

ここに約束のブログ記事です。遅れて申し訳ありません! http://netitude.bc3tech.net/2013/06/15/t4-gotchyas-in-your-environment/ – bc3tech

関連する問題