如何在使用TeamCity时将这个常见属性传递给MSBuild?

14
我正在使用TeamCity Visual Studio运行程序。我想添加一个在Visual Studio中无法访问的设置。
/Property:FileAlignment=4096

我直接在构建步骤的 "命令行参数" 中输入了文本。 构建日志显示错误:

MSBuild命令行参数包含"/ property:"或"/ p:"参数,请改用构建参数。

我不明白如何从TeamCity向 MSBuild 提供此信息并消除此警告!

1. 我应该使用哪种参数?

有3种:

  • 配置参数
  • 系统属性
  • 环境变量。

我不想要环境或系统变量,因为我不希望此构建依赖于任何外部内容。 我现在将尝试使用 Config,但我不确定是否填写正确。

2. 如何确定是否实际使用了此参数?

构建日志似乎只有可导航/可折叠的类似xml的级别和它们的程序,并未提到构建参数。


那是我最初在评论中添加问题的项目。我的问题没有在那里得到回答。我表达不清楚吗?或者我应该在那里发布一个“答案”作为问题? - AnneTheAgile
嗨,Anthony,谢谢!我决定我的问题不同,因为我不是要让变量在msbuild预/后构建脚本中替换,而是传递给msbuild本身的命令行。因为这个特殊的命令产生的结果很少,所以很难验证它是否正常工作。我在想也许我应该先尝试一个更明显的选项,看看它是否可行。但还是不确定如何做...(因此,对我来说,这个问题似乎不是一个小细节,但也许我是错的。) - AnneTheAgile
4个回答

14

您应该使用“系统属性”。不用担心名称,这只是TeamCity的称呼方式。它们是普通属性。您可以在“编辑配置设置> 7.构建参数”中添加它们。

例如,您可以按以下方式添加系统属性:

名称:system.FileAlignment

类型:系统属性(system.)

值:4096

请注意,TeamCity将坚持使用“system.”前缀。这无关紧要,因为MSBuild脚本仍将其视为$(FileAlignment)。


直到我意识到“配置参数”不是“系统属性”(它们没有.system前缀),我才感到非常困惑。如果需要,您可以轻松地从“配置参数”创建“系统属性”。 - Dave Andersen

4
团队城市文档将构建参数定义为“传递通用或特定于环境的设置到构建脚本中的便捷方式”。配置参数提供了一种覆盖从模板继承的构建配置中的某些设置的方法。它们永远不会传递到构建中。系统和环境参数提供给您的构建脚本。环境变量实际上是在系统上设置的(我找不到任何文档)。系统参数被传递到脚本引擎中。

TeamCity自动向实际命令行提供系统变量(看起来Visual Studio运行程序运行msbuild.exe而不是devenv.exe)。我猜想TeamCity正在构建一个类似的命令。

cmd> msbuild.exe my-solution.sln /p:FileAlignment=4096

我在命令行上尝试了一下,只是为了确保它能够正常工作(我添加了/v:diagnostic标志)。诊断详细信息使msbuild将所有属性打印到控制台。我验证了其中的FileAlignment=4096

/FileAlignment属性似乎是任何.csproj文件中自动存在的特殊属性。所以你应该可以顺利进行。您可以通过单击任何构建并查看“构建参数”选项卡来检查传递给构建的实际参数。有一个显示“代理上的实际参数”的部分。


1

问题已经解决。具体来说,安东尼在命令行中使用MSBuild告诉了我们如何解决这个问题。根据与微软的一张工单,也可以使用devenv在命令行中解决该问题,语法如下:

 devenv ..\..\mysolution.sln /Rebuild /Property:Config=Release;Platform=AnyCPU;Filealignment=512

我想要的是让Teamcity的“Visual Studio Build”接受参数。实现方法如下:在命令行参数框中输入:
/Property:FileAlignment=filealignment v:diag

然后,构建参数的输出选项卡显示:

User Defined Parameters
Name                    Value passed to build
system.filealignment    512
system.verbosity        diagnostic

0

你好Anthony,感谢您的回复! 是的,对于我来说,在命令行上使用msbuild也很好用,项目文件可以存储FileAlignment属性。在我们的情况下,经过与Microsoft的讨论,似乎需要我在命令参数中指定解决方案级别或构建级别的对齐方式,除了修复项目(我已经完成了修复)。

我在GUI项(/Build Step / Command line parameters/)上指定的任何参数都不会出现在选项卡/Build Parameters/上。当然,有些根本无法编译。

此外,我还遇到了更奇怪的行为,使用 /verbosity:diagnostic 与 /verbosity:minimal 相比,minimal 竟然会导致更长的构建日志!似乎 diagnostic 在一个特殊任务中隐藏了细节,这个任务属于 Teamcity ,不是我的问题; [16:24:05]: 在项目“C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets”中覆盖目标“SatelliteDllsProjectOutputGroup”,以来自项目“C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.WinFX.targets”的目标“SatelliteDllsProjectOutputGroup”。 我正在苦苦挣扎,因为由 Teamcity 生成的构建输出日志非常适合用作 TreeView。这对于 SLN 构建有效,但是使用任何 bat 文件都无法生成漂亮的(xml 格式,可能)树形格式的日志文件。
如果您有更多想法,我非常愿意听取,并感谢您的编辑! :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接