在 TeamCity 构建配置中每个构建步骤使用 /p 的正确方法是什么?
What is the proper way of using /p per build step in a TeamCity build configuration?
在 TeamCity 中,我创建了一个包含两个 msbuild 构建步骤的构建配置,它们应该构建一个解决方案 .sln 文件。
我将目标定义为"Build",当我运行构建时,这两个步骤显然都执行标准配置并且都构建调试或发布配置两次。
现在我转到构建步骤设置并找到 CommandLine
参数,对于 Debug
我添加了 /p:Configuration=Debug
,对于 Release
我添加了 /p:Configuration=Release
.
构建它会导致 TeamCity 警告:
MSBuild command line parameters contain "/property:" or "/p:". It is recommended to define System Property on Build Parameters instead.
虽然已经构建了一个调试和一个发布。
我用谷歌搜索了这条消息并创建了两个 System Parameters
:/p:Configuration=Debug
和 /p:Configuration=Release
。
如果我现在将调试命令行更改为 %system.DebugConfig%
并将发布更改为 %system.ReleaseConfig%
,我会得到同样的错误。
直到那时我才真正明白那些系统参数将永远不会自动传递给每个构建步骤。
好的,但是我如何使用系统参数正确定义两个不同的构建步骤来构建调试和发布,或者没有 team city 抱怨在命令行中找到 /p
?
没有办法做到这一点(据我所知,请耐心等待)但有足够的选择:
如果您愿意放弃单独的构建步骤,而是使用单独的构建 - 这通常不会有任何问题,请使用模板:创建一个 build template 在其中添加所有必须的参数是可配置的,比如 Configuration
在你的情况下,并给他们合适的默认值。然后为所需的每个属性组合创建构建配置,并在该配置中覆盖参数。
另一种选择:自己动手。过去我在几个 CI 之间切换,很明显你越依赖 CI 系统的功能,手动测试构建就越难,它就越麻烦通过 CI 系统的 Web 界面或数据库或配置文件进行爬行以找到正确的配置参数,并且向另一个 CI 的过渡变得更加瘫痪。所以有一次我只是放弃了它并编写了几个 msbuild 'master' 脚本,只需单击一下按钮就可以构建所有东西,可以这么说,记住 Joel Test,但在我想要的任何机器上,包括我自己的,根本不需要任何 CI。这让我松了一口气,从那以后我就再也没有回头,现在 CI 配置保持在最低限度。适用于您的案例:如下所示创建一个 msbuild 文件,并在 TC 中创建一个构建步骤,该步骤调用它的构建目标并具有指向实际项目文件的 MyTargetProjectFile 系统参数:
<ItemGroup>
<Configurations Include="Debug;Release"/>
</ItemGroup>
<Target Name="Build">
<MsBuild Projects="$(MyTargetProjectFile)" Targets="Build"
Properties="Configuration=%(Configurations.Identity)"/>
</Target>
还有一个选择:忽略 TeamCity 的警告。我一直不清楚他们为什么坚持这样做,这似乎违反直觉并导致类似这样的问题 :] 具有不同属性的不同构建步骤似乎是一个相当基本的要求,不是吗?我认为我们没有任何不使用 /p 的 msbuild 步骤,并且一切正常。
在 TeamCity 中,我创建了一个包含两个 msbuild 构建步骤的构建配置,它们应该构建一个解决方案 .sln 文件。
我将目标定义为"Build",当我运行构建时,这两个步骤显然都执行标准配置并且都构建调试或发布配置两次。
现在我转到构建步骤设置并找到 CommandLine
参数,对于 Debug
我添加了 /p:Configuration=Debug
,对于 Release
我添加了 /p:Configuration=Release
.
构建它会导致 TeamCity 警告:
MSBuild command line parameters contain "/property:" or "/p:". It is recommended to define System Property on Build Parameters instead.
虽然已经构建了一个调试和一个发布。
我用谷歌搜索了这条消息并创建了两个 System Parameters
:/p:Configuration=Debug
和 /p:Configuration=Release
。
如果我现在将调试命令行更改为 %system.DebugConfig%
并将发布更改为 %system.ReleaseConfig%
,我会得到同样的错误。
直到那时我才真正明白那些系统参数将永远不会自动传递给每个构建步骤。
好的,但是我如何使用系统参数正确定义两个不同的构建步骤来构建调试和发布,或者没有 team city 抱怨在命令行中找到 /p
?
没有办法做到这一点(据我所知,请耐心等待)但有足够的选择:
如果您愿意放弃单独的构建步骤,而是使用单独的构建 - 这通常不会有任何问题,请使用模板:创建一个 build template 在其中添加所有必须的参数是可配置的,比如 Configuration
在你的情况下,并给他们合适的默认值。然后为所需的每个属性组合创建构建配置,并在该配置中覆盖参数。
另一种选择:自己动手。过去我在几个 CI 之间切换,很明显你越依赖 CI 系统的功能,手动测试构建就越难,它就越麻烦通过 CI 系统的 Web 界面或数据库或配置文件进行爬行以找到正确的配置参数,并且向另一个 CI 的过渡变得更加瘫痪。所以有一次我只是放弃了它并编写了几个 msbuild 'master' 脚本,只需单击一下按钮就可以构建所有东西,可以这么说,记住 Joel Test,但在我想要的任何机器上,包括我自己的,根本不需要任何 CI。这让我松了一口气,从那以后我就再也没有回头,现在 CI 配置保持在最低限度。适用于您的案例:如下所示创建一个 msbuild 文件,并在 TC 中创建一个构建步骤,该步骤调用它的构建目标并具有指向实际项目文件的 MyTargetProjectFile 系统参数:
<ItemGroup>
<Configurations Include="Debug;Release"/>
</ItemGroup>
<Target Name="Build">
<MsBuild Projects="$(MyTargetProjectFile)" Targets="Build"
Properties="Configuration=%(Configurations.Identity)"/>
</Target>
还有一个选择:忽略 TeamCity 的警告。我一直不清楚他们为什么坚持这样做,这似乎违反直觉并导致类似这样的问题 :] 具有不同属性的不同构建步骤似乎是一个相当基本的要求,不是吗?我认为我们没有任何不使用 /p 的 msbuild 步骤,并且一切正常。