繁体   English   中英

Visual Studio(2010)内部版本与MSBuild从命令行的不同行为

[英]Different behavior of Visual Studio (2010) build vs MSBuild from command line

我正在尝试使用自定义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和命令行构建保持一致,那么现在我有些困惑。

MSBuild和VS之间有很多区别。 例如,许多.target文件,包括.NET / VS随附的文件,都带有Condition="'$(BuildingInsideVisualStudio)' == 'true'" 此外,VS在生成解决方案的依赖关系树时采取了许多捷径。

至于您的问题:我不喜欢覆盖诸如BeforeBuild目标的做法。 如果有2个人这样做,该怎么办? 后者将覆盖前者。 而是使用MSBuild 3和更高版本的BeforeTargets功能-在您的情况下,您只需将目标设置为:

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

...也许这也可以解决您的问题。

如果不是,则可以提高MSBuild日志记录级别(工具=>选项=>项目和解决方案=>生成并运行),然后该日志将告诉您更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM