Я пытаюсь настроить свое решение с помощью настраиваемой цели 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 и командной строки в последовательность.
Между 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), а затем журнал расскажет вам больше.
$(BuildingInsideVisualStudio)
, я не знал об этом.