Когда MSBuild устанавливает свойство $(ProjectName)?
Я новичок в MSBuild, и я провел некоторую настройку файла проекта WPF, который создаю в Visual Studio 2010 и TFS 2010. Я настроил путь вывода следующим образом:
<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) было значение при его использовании?
Я просто использовал Attrice MSBuild Sidekick для отладки через мой файл сборки, и в самой первой цели, доступной для точки останова (_CheckForInvalidConfigurationAndPlatform), все свойства, похоже, уже установлены. ProjectName уже установлен правильно, но мое свойство OutputPath уже было установлено с использованием пустого значения ProjectName.
Ответы
Ответ 1
Хмм - бит путаницы, который я буду пытаться разобраться
-
Не используйте $(ProjectDir) - используйте $(MSBuildProjectDir) - расположение вашего csproj в исходном дереве и задано MSBuild.exe как зарезервированное свойство. Я не думаю, что $(ProjectDir) доступен до тех пор, пока Microsoft.Common.Targets не будет импортирован (что сделано Microsoft.Csharp.targets). Оценка свойств всегда выполняется "на месте" внутри файла, а не когда все Импорты завершены. Это может объяснить, почему вы видите свойство как действительное в инструменте SideKick.
-
Также используйте $(MSBuildProjectName) (который, я думаю, рассмотрит вашу проблему)
-
Я не уверен в VS2010 и TFS2010 (так как это использует MSBuild 4.0 и, без сомнения, новый TeamBuild), но в 2008 году довольно сложно в рамках .csproj выяснить, была ли ваша сборка вызвана из команды line/IDE или из TeamBuild. Я пытаюсь сказать, что я не думаю, что $(TeamBuildOutDir) доступен в вашем csproj. Обычно я тестирую свойство $(TeamBuildConstants), поскольку это свойство передается, когда teambuild называет ваш файл proj. YMMV, так как я еще не играл с 2010 годом.