Visual Studio(2010)与MSBuild命令行构建的不同行为

本文关键字:构建 命令行 MSBuild Studio 2010 Visual | 更新日期: 2023-09-27 18:07:03

我试图用自定义MSBuild目标自定义我的解决方案,该目标修改AssemblyVersionAssemblyFileVersion组装属性,并将CI的构建号或仅增加当前值,如果我们在本地机器上构建。我已经将自定义目标作为BeforeBuild标准目标的依赖项,因此它应该在每次构建之前执行:

  <Target Name="BeforeBuild" DependsOnTargets="VersionTag" />

我正在经历以下问题。当我从命令行构建时,事情很好,AssemblyInfo.cs文件在构建之前被修改,新版本号来到新构建的程序集。

但是当我在Visual Studio内构建时,程序集正在获得旧版本号,并且AssemblyInfo.cs文件在实际构建之后被修改。输出窗口显示了类似这样的内容-请注意编译警告和"编译完成"消息在"构建开始"消息之前显示:

------ Rebuild All started: Project: CommonModel, Configuration: Debug Any CPU ------
C:'Applications'Domain'CommonModel'History'CommonHistory.cs(7,42): warning CS0108: 'Domain.CommonModel.History.CommonHistory.Parent' hides inherited member 'Domain.CommonModel.Common.Parent'. Use the new keyword if hiding was intended.
C:'Applications'Domain'CommonModel'Common.cs(36,35): (Related location)
Compile complete -- 0 errors, 14 warnings
Build started 6/5/2014 6:40:00 PM.
CoreClean:
  Deleting file "C:'Applications'Domain'CommonModel'bin'Debug'Domain.CommonModel.dll.config".
  Deleting file "C:'Applications'Domain'CommonModel'bin'Debug'Domain.CommonModel.dll".
  Deleting file "C:'Applications'Domain'CommonModel'bin'Debug'Domain.CommonModel.pdb".
. . .

知道VS在后台使用MSBuild,我期待两种构建相同的行为,至少与核心事件的顺序。所以现在我有点困惑,如果有机会把VS和命令行构建到一致性。

Visual Studio(2010)与MSBuild命令行构建的不同行为

MSBuild和vs之间有许多不同之处。首先,许多.target文件,包括. net/vs自带的文件,都有Condition="'$(BuildingInsideVisualStudio)' == 'true'"的内容。此外,VS在生成解决方案的依赖树时采用了许多捷径。

至于你的问题:我不喜欢像BeforeBuild这样覆盖目标的做法。如果是两个人做的呢?后者将覆盖前者。相反,使用MSBuild 3和更高版本的BeforeTargets功能-在您的情况下,您只需将目标设置为:

<Target Name="VersionTag" BeforeTargets="BeforeBuild">(...)

…也许这也能解决你的问题。

如果没有,你可以增加MSBuild日志记录级别(工具=>选项=>项目和解决方案=>构建和运行),然后日志将告诉你更多。