Cannot reference dependency assemblies in T4 template when using TransformOnBuild

后端 未结 4 825
忘掉有多难
忘掉有多难 2021-01-15 04:20

We\'re trying to use T4 with Visual Studio 2010 (SP1) to build scripts for another language that are based upon some of our existing C# classes. I\'m hoping for the followin

相关标签:
4条回答
  • 2021-01-15 04:47

    I created a seperate solution that contained my needed referenced assemblies. The I had my buildscript build the reference solution first, then transform the templates, then build the solution containing the generated code.

    0 讨论(0)
  • 2021-01-15 04:49

    Unfortunately, the msbuild T4 host doesn't yet support embedded macro or msbuild variables in assembly names.

    However, it does support Windows environment variables "%foo%", so although it means some machine-level setup, you can get something that works across in-IDE and build time transforms.

    0 讨论(0)
  • 2021-01-15 04:50

    My understanding is that Visual Studio 2013 will finally solve this problem, but that doesn't do me much good as I'm still on Visual Studio 2012. After a lot of effort I finally ran across a solution.

    In the project that has the template you wish to run, add the following as a pre-build step on the Build Events tab of the project properties page.

    set textTransformPath="%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe"
    if %textTransformPath%=="\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe" set textTransformPath="%CommonProgramFiles%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe"
    set ProjectDir=$(ProjectDir)
    %textTransformPath% "%ProjectDir%StringGenerator.tt"
    

    The first two lines take care of the differences between locating TextTransform.exe on 32-bit and 64-bit systems. The third line is the key. I need the path to the project location inside my template, so I set a local environment variable equal to the value of the build's $(ProjectDir) property. Inside my template, just use the following:

    var projectDir = Environment.GetEnvironmentVariable("ProjectDir");
    

    This has solved my issue.

    0 讨论(0)
  • 2021-01-15 04:59

    If you want to reference dependency assemblies within a T4 script using macros and have text templating succeed during build-time, then you have to use project properties.

    Within your project:

      <Import Project="$(ProgramFiles)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\TextTemplating\Microsoft.TextTemplating.targets" />
      <PropertyGroup>
        <T4ProjectDir>$(ProjectDir)</T4ProjectDir>
      </PropertyGroup>
      <ItemGroup>
       <T4ParameterValues Include="T4ProjectDir">
        <Value>$(T4ProjectDir)</Value>
        <Visible>false</Visible>
       </T4ParameterValues>
      </ItemGroup>
    

    Where the path to your text templating environment may be different.

    Then use $(T4ProjectDir) as you would use any other macro in your text template.

    Or you could also simply refer to existing properties:

      <ItemGroup>
       <T4ParameterValues Include="ProjectDir">
        <Value>$(ProjectDir)</Value>
        <Visible>false</Visible>
       </T4ParameterValues>
      </ItemGroup>
    
    0 讨论(0)
提交回复
热议问题