仅在文件修改时,MSTraild上的TextTransform? (或这样做的替代路线)

时间:2015-05-27 14:08:22

标签: c# msbuild code-generation t4 roslyn

我有一个将TextTransform与MSBuild集成的项目,但我现在认为文件太多而且开发时间正在减慢。

我的过程是,我有一个POCO.cs;我使用Roslyn解析.cs文件来收集一些元数据;将元数据传递给.tt文件,然后生成[Implementation] .cs

以下是与我的问题相关的.csproj文件的一部分:

<PropertyGroup>
  <_CommonProgramFiles>$([System.Environment]::GetEnvironmentVariable('CommonProgramFiles(x86)'))</_CommonProgramFiles>
  <_CommonProgramFiles Condition=" '$(_CommonProgramFiles)' == '' ">$(CommonProgramFiles)</_CommonProgramFiles>
  <TextTransformPath Condition="'$(TextTransformPath)' == ''">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe</TextTransformPath>
  <!-- Initial default value -->
  <_TransformExe>$(TextTransformPath)</_TransformExe>
  <_RoslynDllPath>$(ProjectDir)Lib\RoslynWrapper.dll</_RoslynDllPath>
  <!-- Cascading probing if file not found -->
  <_TransformExe Condition="!Exists('$(_TransformExe)')">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe"</_TransformExe>
  <_TransformExe Condition="!Exists('$(_TransformExe)')">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\11.0\TextTransform.exe"</_TransformExe>
  <_TransformExe Condition="!Exists('$(_TransformExe)')">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\12.0\TextTransform.exe"</_TransformExe>
  <!-- Future proof 'til VS2013+2 -->
  <_TransformExe Condition="!Exists('$(_TransformExe)')">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\13.0\TextTransform.exe"</_TransformExe>
  <_TransformExe Condition="!Exists('$(_TransformExe)')">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\14.0\TextTransform.exe"</_TransformExe>
</PropertyGroup>

<ItemGroup>
  <Compile Include="SomePoco.cs" />
  <Compile Include="Properties\AssemblyInfo.cs" />
  <Compile Include="SomePocoMetadata.cs">
    <AutoGen>True</AutoGen>
    <DesignTime>True</DesignTime>
    <DependentUpon>SomePocoMetadata.tt</DependentUpon>
  </Compile>
</ItemGroup>
<ItemGroup>
  <None Include="SomePocoMetadata.tt">
    <Generator>TextTemplatingFileGenerator</Generator>
    <LastGenOutput>SomePocoMetadata.cs</LastGenOutput>
  </None>
</ItemGroup>

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="TransformOnBuild" AfterTargets="BeforeBuild">
  <Error Text="Failed to find TextTransform.exe tool at '$(_TransformExe)." Condition="!Exists('$(_TransformExe)')" />
  <ItemGroup>
    <_TextTransform Include="@(None)" Condition="'%(None.Generator)' == 'TextTemplatingFileGenerator'" />
  </ItemGroup>
  <!-- Perform task batching for each file -->
  <Exec Command="&quot;$(_TransformExe)&quot; &quot;%(_TextTransform.FullPath)&quot; -r &quot;$(_RoslynDllPath)&quot;" Condition="'%(_TextTransform.Identity)' != ''" />
</Target>

有了上述内容,.tt文件总是在转换,编译DLL需要几分钟的时间。有没有办法在MSBuild中执行此操作,仅在仅修改SomePoco.cs文件时进行转换?

我是否应该采取另一种方法来获得我想要的成就?

2 个答案:

答案 0 :(得分:1)

确保为目标指定@Override public void onBackPressed() { if (mTwoPane) { FragmentMainList newFragment = new FragmentMainList(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // Replace whatever is in the master_container view with the above fragment transaction.replace(R.id.master_container, newFragment); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); // Commit the transaction transaction.commit(); } } Inputs属性。

在您的特定情况下,您似乎获得了目标中某个输入的名称,因此您无法在封闭的Target的Input属性中使用它。解决方法是将_TextTransform项目组的定义移到目标之外。

答案 1 :(得分:0)

我最终做的是使用ITaskItem []作为输入参数之一,在那里我使用C#来计算文件的最后修改并确定我是否需要生成这种方式。