Когда MSBuild устанавливает свойство $ (ProjectName)? - PullRequest
14 голосов
/ 15 апреля 2010

Я довольно новичок в MSBuild, и я выполнил некоторые настройки для файла проекта Wpf, который создаю как в VS2010, так и в TFS2010.Я настроил выходной путь следующим образом:

<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) оценивается как true, но $ (ProjectName) оценивает имя проекта как нормальное к этому моменту.

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

edit: я только что использовал MSBuild Sidekick Аттриса для отладки через мой файл сборки, и в самой первой цели, доступной для точки останова (_CheckForInvalidConfigurationAndPlatform), все свойства, похоже, уже установлены.ProjectName уже установлено правильно, но мое свойство OutputPath уже было установлено с использованием пустого значения ProjectName.

1 Ответ

24 голосов
/ 16 апреля 2010

Хм - там немного путаницы, с которой я постараюсь разобраться

  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 года ..

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