Использование переменной среды Team City для переопределения свойства проекта - PullRequest
5 голосов
/ 25 мая 2011

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

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

1.2.3.4 является значением по умолчанию.

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

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

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

Ответы [ 2 ]

6 голосов
/ 25 мая 2011

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

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

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

Таким образом, вы можете просто установить свойство $ (VersionTC) в конфигурации TeamCity и проверить,свойство пустое или нет и задайте версию

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

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

Посмотрите наэто сообщение в блоге , объясняющее все это.


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

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

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

4 голосов
/ 26 мая 2011

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

/p:Version=""

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

Одним из способов решения этой проблемы является перемещение вашей 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 за пределами цели она сохранит пустое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...