2010-04-15 5 views
14

Я довольно новичок в 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) оценивается как '' во время сборки, что создает странные результаты. Выполняя некоторую отладку, она выглядит так, как если бы значение $ (имя_проекта) было задано к моменту выполнения BeforeBuild, но мое свойство OutputPath оценивает его до этой точки.

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

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

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

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

ответ

24

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

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

+0

Да, вы правы - ProjectDir устанавливается (непосредственно из MSBuildProjectDir, на самом деле) в Microsoft.Common.Targets. Об этом я многое узнал. Я предполагаю, что моя собственная путаница проистекает из того факта, что я еще не понял последовательность common.targets, csharp.targets, рассматриваемый файл csproj и т. Д. 2. Я получил имя проекта из страницы с предварительной сборкой страницы свойств проекта - мне нужно выяснить, доступно ли MSBuildProjectName для сборки команды. Откуда появляется MSBuildProjectName? Любая идея, как она поставляется? – bwerks

+1

3. Видимо, злокачественный и неэффективный IsDesktopBuild был заменен $ (BuildingInsideVisualStudio), но я предполагаю, что это увидело свойство в моем журнале сборки.Что касается TeamBuildOutDir, вы правы - он не установлен в обычной VS-сборке, поэтому вы реагируете действительно только на основе своего существования. Я получил эту идею от http://blogs.msdn.com/aaronhallberg/archive/2007/06/07/preserving-output-directory-structures-in-orcas-team-build.aspx. – bwerks

+3

+1: Я просто потратил весь день на избиение головы над '$ (ProjectName)' еще не установленным. Это научит меня не проверять переполнение стека сначала ... –

Смежные вопросы