TextTransform上MSBuild只有当文件修改?(或者另一种方法)

本文关键字:或者 另一种 方法 修改 文件 MSBuild TextTransform | 更新日期: 2023-09-27 17:50:51

我有一个项目,集成了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文件仅修改时进行转换?

有没有别的方法可以让我完成我想要的?

TextTransform上MSBuild只有当文件修改?(或者另一种方法)

确保为目标指定了InputsOutputs属性。

在您的特定情况下,您似乎在目标中获得了其中一个输入的名称,因此您不能在封闭目标的Input属性中使用它。一种变通方法是将_TextTransform项目组的定义移到目标之外。

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