MSBuild 自动更正变量定义,而无需被告知

本文关键字:被告 定义 变量 MSBuild | 更新日期: 2023-09-27 18:36:07

这是我遇到的一个非常奇怪的问题。在我的构建过程中,我有将在某些文件上运行的自定义脚本。其中一个脚本将在创建新文件时重写原始文件的一部分。这是以下目标:

<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 个基本步骤。

  1. 读入文件中的所有行
  2. 从读取中取消转义行。
  3. 将未转义的输出传递给自定义任务。
  4. 将自定义任务的输出写入文件。

在将行传递给自定义任务之前的某个位置,它们会被修改。它将声明从 Trade Trade = new Trade() 更改为 Trade trade = new Trade()(我意识到资本变量是一种不好的做法,这只是我构建期间发生的一个例子。该版本还自动将类从 ProductionFoecast 更正为 ProductionForecast

我有一种感觉,StyleCop或FxCop正在以某种方式运行,但我没有看到它正在运行。我也在导入MSBuildExtensions任务文件,但现在只使用它进行搜索。

在自定义任务中获取文件之前,关于修改文件的任何想法?

编辑:我想强调的是,这只发生在变量的声明上。因此,当它Trade更改为trade它只发生一次时,其余的Trade发生将保持原样。自然,这会破坏构建。

MSBuild 自动更正变量定义,而无需被告知

因此,

到目前为止,我的解决方案是直接在自定义任务中读取文件。这不是一个非常好的解决方案,因为它不能解释为什么 MSBuild 变得有知觉并开始纠正拼写,但这是一个解决方法。我将不回答这个问题,希望有人能解释实际情况。