Когда MSBuild устанавливает свойство (ProjectName) $?

Я довольно плохо знаком с MSBuild, и я сделал некоторую настройку на файле проекта WPF, что я создаю и в Visual Studio 2010 и в 2010 TFS. Я настроил выходной путь следующим образом:

<OutputPath Condition=" '$(TeamBuildOutDir)' == '' ">$(SolutionDir)build\binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath>
<OutputPath Condition=" '$(TeamBuildOutDir)' != '' ">$(TeamBuildOutDir)binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath>

Это позволяет мне создавать к централизованному двоичному каталогу при построении на рабочем столе и позволяет TFS находить двоичные файлы, когда сборки CI работают.

Однако кажется, что в обоих случаях, свойство (ProjectDir) $ оценивает к '' во время изготовления, которое создает странные результаты. Делая некоторую отладку, появляется, как будто $ (ProjectName) установлен к тому времени, когда BeforeBuild выполняется, но что мое свойство OutputPath оценивает его до той точки.

<ProjectNameUsedTooEarly Condition=" '$(ProjectName)' == '' ">true</ProjectNameUsedTooEarly>

Предыдущее свойство находится в той же группе свойства как мое свойство OutputPath. В цели BeforeBuild $ (ProjectNameUsedTooEarly) оценивает к истинному, но $ (ProjectName) оценивает к названию проекта как нормальное той точкой.

Что я могу сделать, чтобы гарантировать, что $ (ProjectName) имеет значение, когда я использую его?

Я просто использовал Кореша MSBuild Attrice для отладки через мой файл типа "build", и в самой первой цели, доступной для точки останова (_CheckForInvalidConfigurationAndPlatform) все свойства, кажется уже, установлены. ProjectName уже установлен правильно, но мое свойство OutputPath было уже установлено с помощью пустого значения ProjectName.

15
задан Peter Mortensen 25 July 2019 в 23:25
поделиться

1 ответ

Хмм - здесь происходит небольшая путаница, в которой я постараюсь разобраться

  1. ​​Не используйте $ (ProjectDir) - используйте $ (MSBuildProjectDir) - это местоположение вашего csproj в дереве исходных текстов и устанавливается MSBuild.exe как зарезервированное свойство. Я не думаю, что $ (ProjectDir) доступен до тех пор, пока Microsoft.Common.Targets не будет импортирован (что выполняется Microsoft.Csharp.targets). Оценка свойств всегда выполняется «на месте» в файле, а не после завершения всех операций импорта. Это может объяснить, почему вы видите это свойство как действительное в инструменте SideKick

  2. . Аналогичным образом используйте $ (MSBuildProjectName) (который, я думаю, решит вашу проблему)

  3. Я не уверен насчет VS2010 и TFS2010 (поскольку он использует MSBuild 4.0 и, без сомнения, новый TeamBuild), но в 2008 году в рамках .csproj было довольно сложно определить, была ли ваша сборка вызвана из командной строки / сборки IDE или из TeamBuild. Я пытаюсь сказать, что не думаю, что $ (TeamBuildOutDir) доступен в вашем csproj. Обычно я тестирую свойство $ (TeamBuildConstants), поскольку это свойство передается , когда teambuild вызывает ваш файл proj. YMMV, поскольку я еще не играл с 2010 годом ..

25
ответ дан 1 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: