Различное поведение сборки Visual Studio (2010) и MSBuild из командной строки

1

Я пытаюсь настроить свое решение с помощью настраиваемой цели MSBuild, которая изменяет атрибуты AssemblyVersion и AssemblyFileVersion и помещает либо номер сборки из CI, либо просто увеличивает текущее значение единицы, если мы строим локальную машину. Я поместил эту пользовательскую цель в зависимость от стандартной цели BeforeBuild поэтому она должна выполняться перед каждой сборкой:

  <Target Name="BeforeBuild" DependsOnTargets="VersionTag" />

И я испытываю следующую проблему. Когда я строю из командной строки, все хорошо, и файлы AssemblyInfo.cs изменяются до сборки, а новые номера версий поступают на вновь созданные сборки.

Но когда я строю из Visual Studio, сборки получают старые номера версий, а файлы AssemblyInfo.cs изменяются после фактической сборки. Окно "Выход" показывает что-то вроде этого - обратите внимание, что перед сообщением "Сборка начато" отображаются предупреждения компиляции и сообщение "Скомпилировать завершено":

------ Rebuild All started: Project: CommonModel, Configuration: Debug Any CPU ------
C:\Applications\Domain\CommonModel\History\CommonHistory.cs(7,42): warning CS0108: 'Domain.CommonModel.History.CommonHistory.Parent' hides inherited member 'Domain.CommonModel.Common.Parent'. Use the new keyword if hiding was intended.
C:\Applications\Domain\CommonModel\Common.cs(36,35): (Related location)

Compile complete -- 0 errors, 14 warnings
Build started 6/5/2014 6:40:00 PM.
CoreClean:
  Deleting file "C:\Applications\Domain\CommonModel\bin\Debug\Domain.CommonModel.dll.config".
  Deleting file "C:\Applications\Domain\CommonModel\bin\Debug\Domain.CommonModel.dll".
  Deleting file "C:\Applications\Domain\CommonModel\bin\Debug\Domain.CommonModel.pdb".

. . .

Зная, что VS использует MSBuild на заднем плане, я ожидал такого же поведения для обоих типов построений, по крайней мере, с последовательностью основных событий. Так что теперь я немного смущен, если есть шанс привести VS и командной строки в последовательность.

Теги:
visual-studio
msbuild
version

1 ответ

0
Лучший ответ

Между MSBuild и VS существует много различий. Для одного, многие.targets файлы, в том числе те, которые поставляются с.NET/VS, имеют материал с Condition="'$(BuildingInsideVisualStudio)' == 'true'". Кроме того, VS принимает множество ярлыков при генерации дерева зависимостей решения.

Что касается вашей проблемы: мне не нравится практика переопределения таких целей, как BeforeBuild. Что, если 2 человека сделали это? Последний переписывал бы первый. Вместо этого используйте функцию MSBuild 3 и более позднюю версию BeforeTargets - в вашем случае у вас будет только ваша цель:

<Target Name="VersionTag" BeforeTargets="BeforeBuild">(...)

... И, возможно, это также исправит вашу проблему.

Если нет, вы можете увеличить уровень ведения журнала MSBuild (Tools => Options => Projects and Solutions => Build and Run), а затем журнал расскажет вам больше.

  • 0
    Я не думаю, что это будет исправлено, если фаза MSBuild произойдет позже, чем какая-либо другая фаза внутри VS. Но я приму ваш ответ. Во всяком случае, у меня нет лучшего. Спасибо за ответ и за это условие $(BuildingInsideVisualStudio) , я не знал об этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню