这是我遇到的一个非常奇怪的问题。在我的构建过程中,我有将在某些文件上运行的自定义脚本。这些脚本之一将在创建新文件时重写部分原始文件。下面是目标:
<Target Name="GenerateWSHooksTarget" Outputs="%(AllFoundItems.Hooks)" Condition="'$(FoundFiles)'=='true'">
<ReadLinesFromFile File="%(AllFoundItems.FullPath)">
<Output TaskParameter="Lines" ItemName="FileOutputEscaped"/>
</ReadLinesFromFile>
<ItemGroup>
<FileOutputEscaped>
<Escaped>%(FileOutputEscaped.Identity)</Escaped>
<Unescaped>$([MSBuild]::Unescape('%(FileOutputEscaped.Identity)'))</Unescaped>
</FileOutputEscaped>
<FileOutput Include="@(FileOutputEscaped->'%(Unescaped)')" />
</ItemGroup>
<WSHooks ClassName="%(AllFoundItems.Classname)" ImportName="$(MSBuildProjectName)" FileData="@(FileOutput)">
<Output TaskParameter="NewFileData" ItemName="WSHooksOutput"/>
<Output TaskParameter="RewriteFileData" ItemName="WSRewriteOutput"/>
<Output TaskParameter="Changed" ItemName="WSHooksChanged"/>
</WSHooks>
<Message Importance="Normal" Text="Changed: @(WSHooksChanged)"/>
<WriteLinesToFile File="%(AllFoundItems.Hooks)" Lines="@(WSHooksOutput)" Overwrite="True" />
<WriteLinesToFile File="%(AllFoundItems.FullPath)" Lines="@(WSRewriteOutput)" Overwrite="True" Condition="@(WSHooksChanged)=='true'" />
</Target>
它经历了4个基本步骤。
- 从文件中读取所有行
- 从读取中取消转义行。
- 将未转义的输出传递给自定义任务。
- 将自定义任务的输出写入文件。
在将行传递给自定义任务之前的某处,它们被修改。它将声明从Trade Trade = new Trade()
to更改Trade trade = new Trade()
(我意识到大写变量是不好的做法,这只是我构建期间发生的一个示例。)构建还自动更正了一个类从ProductionFoecast
to ProductionForecast
。
我有一种感觉 StyleCop 或 FxCop 正在以某种方式运行,但我没有看到它正在运行。我也在导入 MSBuildExtensions 任务文件,但现在只使用它进行搜索。
关于在我的自定义任务中获取文件之前修改我的文件的任何想法?
编辑:我想强调的是,这只发生在变量的声明中。因此,当它更改Trade
为trade
它只发生一次时,其余的出现Trade
将保持原样。这自然会破坏构建。