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=""$(_TransformExe)" "%(_TextTransform.FullPath)" -r "$(_RoslynDllPath)"" Condition="'%(_TextTransform.Identity)' != ''" />
</Target>
使用上面的代码,.tt文件总是在转换,编译DLL需要几分钟。是否有一种方法可以在MSBuild中做到这一点,仅在SomePoco.cs文件仅修改时进行转换?
有没有别的方法可以让我完成我想要的?
确保为目标指定了Inputs
和Outputs
属性。
在您的特定情况下,您似乎在目标中获得了其中一个输入的名称,因此您不能在封闭目标的Input属性中使用它。一种变通方法是将_TextTransform项目组的定义移到目标之外。
我最终做的是使用ITaskItem[]作为输入参数之一,在那里我使用c#来找出文件的最后修改,并确定是否需要以这种方式生成