Я довольно новичок в 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.
Да, вы правы - ProjectDir устанавливается (непосредственно из MSBuildProjectDir, на самом деле) в Microsoft.Common.Targets. Об этом я многое узнал. Я предполагаю, что моя собственная путаница проистекает из того факта, что я еще не понял последовательность common.targets, csharp.targets, рассматриваемый файл csproj и т. Д. 2. Я получил имя проекта из страницы с предварительной сборкой страницы свойств проекта - мне нужно выяснить, доступно ли MSBuildProjectName для сборки команды. Откуда появляется MSBuildProjectName? Любая идея, как она поставляется? – bwerks
3. Видимо, злокачественный и неэффективный IsDesktopBuild был заменен $ (BuildingInsideVisualStudio), но я предполагаю, что это увидело свойство в моем журнале сборки.Что касается TeamBuildOutDir, вы правы - он не установлен в обычной VS-сборке, поэтому вы реагируете действительно только на основе своего существования. Я получил эту идею от http://blogs.msdn.com/aaronhallberg/archive/2007/06/07/preserving-output-directory-structures-in-orcas-team-build.aspx. – bwerks
+1: Я просто потратил весь день на избиение головы над '$ (ProjectName)' еще не установленным. Это научит меня не проверять переполнение стека сначала ... –