【问题标题】:Using a Team City environment variable to override a project property使用 Team City 环境变量覆盖项目属性
【发布时间】:2011-05-25 19:23:48
【问题描述】:

我有一个名为 Version 的 C# 项目属性定义为

<Version Condition="$(Version)==''">1.2.3.4<Version>

1.2.3.4 是默认值。

我有一个 Team City 系统属性,也称为版本,设置为覆盖。因此,在 Team City 的自定义运行对话框中,我可以为 Version 指定一个值,然后使用该值。这很好用。

但是,如果我在 Team City 中将参数留空,默认值仍会被空白(null?)覆盖。如果我删除 Team City 参数,则使用默认值。

条件不正确吗?如何将 Team City 属性设置为空白,并且仅在我输入一些值时才覆盖?

【问题讨论】:

    标签: msbuild teamcity


    【解决方案1】:

    在 OP 发表评论后更新答案:

    来自文档:

    MSBuild 允许您设置属性 从命令行使用 /property 或 /p 命令行开关。 收到的属性值 命令行覆盖属性值 在项目文件和属性中设置 从环境继承的值 变量。

    所以你可以在 TeamCity 配置中设置一个属性 $(VersionTC) 并检查该属性是否为空并设置版本

    <Version>$(VersionTC)<Version>
    <Version Condition="'$(VersionTC)'==''">1.2.3.4<Version>
    

    (所以你先将Version设置为VersionTC,然后看是否为空并设置默认)

    看看这个blog post 解释这一切。


    试试下面的方法:

    <Version Condition=" '$(Version)'=='' ">1.2.3.4<Version>
    

    注意$(Version) 周围的' '(单引号)

    【讨论】:

    • @Spider M9 - 这只是为了清楚起见。你没有注意到 $(Version) 周围的额外'' 吗?
    • 两个变量的解决方案 Version / VersionTC 有点乱,但对我来说比在目标中移动它更好。
    • @jbemt48 - Nant 很好地处理了这些情况!我还以为南特是垃圾!
    【解决方案2】:

    Team City 可能还在命令行传递参数,只是带了一个空值,如中,

    /p:Version=""
    

    或类似的东西。您看到的症状是由于 MSBuild 如何处理被覆盖的属性。当在命令行上指定时,属性将采用该值,无论它是否也在静态(文件中的全局,而不是目标内部)PropertyGroup 声明中声明。因此,您的 Version 声明以及正在检查空字符串的 Condition 将被完全跳过。

    解决此问题的一种方法是将包含 $(Version) 声明及其 Condition 的 PropertyGroup 移动到首次使用它的目标内。 MSBuild 将允许从目标内在运行时创建的“动态”属性覆盖命令行属性的值。

    如果你运行这个命令行...

    > msbuild My.proj /t:Ver /p:Version=""
    

    ...并且有这个目标...

    <Target Name="Ver">
      <PropertyGroup>
        <Version Condition="'$(Version)' == ''">1.2.3.4<Version>
      </PropertyGroup>
      <Message Text="Version: '$(Version)'" />
    </Target>
    

    ...您将获得显示 1.2.3.4 的版本,而 PropertyGroup 在目标之外,它将保留空值。

    【讨论】:

    • 除非您使用 ,否则即使您移动到目标内也无法使用。查看我的更新答案
    • 在目标内移动 PropertyGroup 是现在(几乎)过时的 CreateProperty 任务的 4.0 等效语法。它会起作用的,试试吧!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多