【问题标题】:MSBuild autocorrects variable definitions without being told toMSBuild 自动更正变量定义而不被告知
【发布时间】:2013-10-18 14:58:53
【问题描述】:

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

<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]::Unescape() 导致了问题。我刚刚用转义行编写了一个新文件,它们包含了更改。是否有某种类型的 Target 会在 BeforeBuild 之前运行,它会劫持读取并将其指向具有修改内容的文件?
  • 好的。我想我可能刚刚取得了突破。我认为这个问题源于ReadLinesFromFile。我使用了$([System.IO.File]::ReadAllText(%(AllFoundItems.FullPath))),它没有在没有通知我的情况下更改变量名。所以我将尝试创建一个自定义读取任务,看看是否能解决我的问题。

标签: c# msbuild


【解决方案1】:

所以到目前为止,我的解决方案是直接在自定义任务中读取文件。这不是一个很好的解决方案,因为它没有解释为什么 MSBuild 变得有意识并开始纠正拼写,但它是一种解决方法。我不会回答这个问题,希望有人能解释实际发生的事情。

【讨论】:

  • 很明显,MSBUILD 还没有变得有知觉。您已经告诉它运行其他正在修改文件的工具。尝试运行procmon 以找出正在修改文件的内容,或许还可以了解修改的性质。
猜你喜欢
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多