Использование переменной среды Team City для переопределения свойства проекта

#msbuild #teamcity

#msbuild #teamcity

Вопрос:

У меня есть свойство проекта C # с именем Version, определенное как

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

Значение по умолчанию — 1.2.3.4.

У меня есть системное свойство Team City, также называемое Version, настроенное на переопределение. Итак, в пользовательском диалоговом окне запуска в Team City я могу указать значение для версии, и это значение будет использовано. Это работает нормально.

Однако, если я оставлю параметр пустым в Team City, значение по умолчанию по-прежнему будет заменено пустым (null?). Если я удалю параметр Team City, будет использоваться значение по умолчанию.

Является ли условие неверным? Как я могу настроить, чтобы свойство Team City было пустым и переопределялось только в том случае, если я введу какое-то значение?

Ответ №1:

Обновленный ответ после комментария OP:

Из документов:

MSBuild позволяет задавать свойства из командной строки с помощью переключателя командной строки /property или /p. Значения свойств, полученные из командной строки, переопределяют значения свойств, установленные в файле проекта, и значения свойств, унаследованные от переменных среды.

Итак, вы можете просто установить свойство $ (VersionTC) в конфигурации TeamCity и проверить, является ли это свойство пустым или нет, и установить version

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

( таким образом, сначала вы устанавливаете Version значение VersionTC . Затем проверьте, пустое ли оно, и установите значение по умолчанию)

Взгляните на это сообщение в блоге, объясняющее все это.


Попробуйте что-то вроде приведенного ниже:

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

Обратите внимание на ' ' (одинарные кавычки) вокруг $(Version)

Комментарии:

1. @Spider M9 — это было только для наглядности. Разве вы не заметили дополнительные '' значения, окружающие $(Version)?

2. Решение с двумя вариантами Version / VersionTC немного запутанное, но для меня будет работать лучше, чем перемещение этого внутри целевого объекта.

3. @jbemt48 — Nant очень хорошо справляется с подобными ситуациями! И я думал, что Nant — это дерьмо!

Ответ №2:

Team City, вероятно, все еще передает параметр в командной строке, просто с пустым значением, как в,

 /p:Version=""
  

или что-то подобное. Симптом, который вы видите, связан с тем, как MSBuild обрабатывает переопределенные свойства. При указании в командной строке свойство будет принимать это значение независимо от того, объявлено оно также в статическом (глобальном в файле, а не внутри целевого объекта) объявлении PropertyGroup. Таким образом, ваше объявление версии с условием проверки на наличие пустой строки полностью пропускается.

Один из способов обойти это — переместить вашу PropertyGroup, содержащую объявление $(Version) с его условием, внутрь целевого объекта, где оно впервые используется. 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 вне целевого объекта, она сохранит пустое значение.

Комментарии:

1. и это не сработает даже у вас, если вы переместитесь в пределах целевого объекта, если вы не используете <CreateProperty> . Смотрите мой обновленный ответ

2. Перемещение PropertyGroup внутри целевого объекта является эквивалентным синтаксисом 4.0 для теперь (почти) устаревшей задачи CreateProperty. И это сработает, попробуйте!