TeamCity 说在 MSBuild 步骤中使用“构建参数”而不是“/property:”。那是啥意思?

Posted

技术标签:

【中文标题】TeamCity 说在 MSBuild 步骤中使用“构建参数”而不是“/property:”。那是啥意思?【英文标题】:TeamCity says to use "Build Parameters" instead of "/property:" in an MSBuild step. What does that mean?TeamCity 说在 MSBuild 步骤中使用“构建参数”而不是“/property:”。那是什么意思? 【发布时间】:2011-09-07 06:58:06 【问题描述】:

我有一个 TeamCity 服务器设置来执行我的 CI 构建。我正在构建和测试 C# 解决方案并运行一些自定义 MSBuild 任务。其中一项任务是在我的构建输出中打印警告...

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

我不明白这是什么意思或如何删除它。它不能很好地谷歌(有或没有错字)。我从命令行(使用/verbosity:diagnostic)运行了任务,但它没有出现,所以我相信这是一个 TeamCity 消息。

MSBuild 任务是

<Target Name="InstallDb">
  <MakeDir Directories="$(DbPath)" />
  <Exec Command="sqlcmd -S .\sqlexpress -i db\OmnyxDatabaseDrop.sql" />
  <Exec Command="sqlcmd -S .\sqlexpress -i db\OmnyxDatabaseCreate.sql -v DbPath=&quot;$(DbPath)&quot;" />
  <Exec Command="sqlcmd -S .\sqlexpress -i db\OmnyxDatabaseProgrammability.sql" />
</Target>

而相关的TeamCity步骤信息是

MSBuild 版本:4.0 MSBuild 工具版本:4.0 运行平台:x64 目标:InstallDb 命令行参数:/property:DbPath=%env.DB_PATH%

【问题讨论】:

@AnneTheAgile 您只需添加一个 TeamCity System 构建参数。它是您提到的 3 种构建参数之一。您将其命名为 'system.' 并提供所需的值。 TeamCity 会自动将其发送到 MSBuild。您可以在构建报告中检查参数的值。有一个参数选项卡,所有参数都在其中列出。 【参考方案1】:

你必须在配置中的Properties and environment变量下添加Build Parameters

`

因此,在 MSBUild 的 Build Step 的命令行参数中,删除任何指定为 /p: 的属性并将每个属性添加到 Build Parameters(上面的屏幕截图)并给出值

【讨论】:

@Anthony Mastrean 是的 - Build parameters are passed to a build. Build parameters can be of two types: system properties and environment variables. Environment variables are supported by any build runner, however system properties are only available for build runners with property notion. For example, Command line runner does not support properties. 谢谢!这行得通,但我必须访问this doc 才能真正了解实现/用法。 来自团队城市文档:配置参数提供了一种方法来覆盖从模板继承的构建配置中的某些设置。它们永远不会传递给构建。 如果您在相同的构建配置中有两个 MSBuild 步骤使用相同的参数但不同的值,这似乎是一个问题。如果必须在“构建配置”级别定义它们,那么看起来不可能将同一参数的不同值传递给构建步骤。 这会很棒。除了它的一个错误。如果您希望将不同的参数传递给共享相同参数名称的两个不同的构建步骤怎么办?【参考方案2】:

这一切都发生在幕后!你只需要遵循正确的约定。在您的 MSBuild 脚本中,您使用常规变量表示法

$(DbPath)

在 TeamCity 中,您可以定义系统或环境变量

system.DbPath

TeamCity 会自动将其所有系统/环境变量发送到您的 MSBuild 任务,删除“系统”或“环境”部分。而且您不必在 TeamCity 任务中写 /property:DbPath=system.DbPath

【讨论】:

根据the docs,只有system变量被注入到脚本中。 据我了解,environment vars 被设置为构建代理上的实际环境变量。虽然它们可能不会像系统变量一样传递给构建脚本/步骤,但它们可以使用。 MSBuild 必须使用环境变量为 $(MyVar) 提供值,因为我有一个 TeamCity 环境变量,它为我使用 MSBuild 调用的愚蠢的命令行工具提供值。 这是一个非常糟糕的建议,因为如果系统级别的值不同,它可能会导致同时构建并发构建配置的混乱。这是一个隐含的竞争条件。

以上是关于TeamCity 说在 MSBuild 步骤中使用“构建参数”而不是“/property:”。那是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

TeamCity - MSBuild 代码分析

MSBUILD : 错误 MSB1008: teamcity 中只能指定一个项目

obj 目录中的 *.dll.licenses 文件不是使用 TeamCity 中的 msbuild 创建的

Visual Studio 2012 解决方案 TeamCity 中的 MSBuild

MSBuild 工具 2019 未显示在 Teamcity 的下拉列表中

使用 msbuild 我想使用来自 teamcity 的值更新配置文件