Номер сборки Tfs2010 и версии файлов сборки и целевые объекты MSBuild
-
27-09-2019 - |
Вопрос
Я читал статью Джона Роббинса Номер сборки TFS 2010 и версии файлов сборки:Полностью синхронизирован только с MSBuild 4.0, и мне интересно, как лучше всего это интегрировать.
Загружаемая статья содержит два файла, один из которых является файлом targets, а другой - файлом proj.
Целевой файл содержит ряд задач по извлечению номера сборки на основе номера сборки Tfs (того же, который использовался для сборок) и записи этого номера в некоторое местоположение (назовем его BuildNumberFile) для использования другими файлами proj.
Файл proj очень прост.Он просто импортирует вышеупомянутый целевой файл, а затем объявляет целевой объект с именем "All", а также объявляет DefaultTargets для элемента Project как All.
<Project ToolsVersion="4.0" DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!-- The two required properties so the Wintellect.TFSBuildNumber tasks knows your major and minor values.-->
<TFSMajorBuildNumber>3</TFSMajorBuildNumber>
<TFSMinorBuildNumber>1</TFSMinorBuildNumber>
</PropertyGroup>
<Import Project="Wintellect.TFSBuildNumber.targets"/>
<!-- Just ask for the version information files you need. These are here to show all the diffent ones in
Wintellect.TFSBuildNumber.Targets. You can change the names -->
<Target Name="All"
DependsOnTargets="WriteSharedCSharpAssemblyVersionFile;
WriteSharedVBAssemblyVersionFile;
WriteSharedCPPCLIAssemblyVersionFile;
WriteSharedCPPAssemblyVersionFile;
WriteSharedWiXAssemblyVersionFile;
WriteSharedTextAssemblyVersionFile;"/>
</Project>
У меня есть два вопроса по этому поводу:
- Я все еще изучаю MSBuild.Если имя целевого объекта не указано нигде в целевых объектах, выполняется ли целевой объект?Как мне убедиться, что эта цель запущена?
- Предполагается ли, что файлы csproj объявляют включаемый элемент для местоположения, в котором находится BuildNumberFile, даже если он не существует до времени компиляции?
- Есть ли у ItemGroups и Include DependsOnTargets или что-то еще, что позволяет им убедиться в существовании файла перед сборкой?
- Предполагается ли, что все содержимое файла csproj, использующего это, обернуто в целевой объект, который выражает DependsOnTargets для BuildNumberFile?
Спасибо!
Решение
Я думаю, что я с этим разобрался, но два человека продвинули мой вопрос, поэтому я отвечу на него здесь:
Вы можете гарантировать, что целевой объект запущен, выразив зависимость от него от другого целевого объекта.Microsoft.Common.targets предоставляет две цели - BeforeBuild и AfterBuild - специально для переопределения в целях настройки.Я обнаружил, что самым простым способом сделать это было
<Target Name="BeforeBuild" DependsOnTargets="WriteSharedCSharpAssemblyVersionFile" />
где WriteSharedCSharpAssemblyVersionFile - это целевой файл, объявленный при загрузке по ссылке в исходном сообщении.Кроме того, если вы новичок в MSBuild, эта цель BeforeBuild должна быть объявлена после импорта Microsoft.CSharp.targets, но шаблон csproj по умолчанию поможет вам в этом.Целевой объект WriteSharedCSharpAssemblyVersionFile действительно должен записывать файл в какое-то центральное расположение, поскольку при создании решения все целевые объекты выполняются только один раз.Все проекты должны ссылаться на файл из этого расположения, даже если он не существует, поскольку к моменту начала компиляции (или, что более важно, к моменту разрешения ссылок) цель BeforeBuild будет запущена, и файл будет на месте.
- В моей структуре у меня есть эти файлы управления версиями в папке непосредственно под корневой папкой филиала.Кроме того, поскольку создаваемый файл сгенерирован, я создаю его в выходной каталог.Кажется немного странным ссылаться на данные из выходных данных, но это сохраняет неизменность наличия всех продуктов сборки в одном месте, так что выходной каталог может быть удален как средство выполнения очистки.
В MSBuild элементы представляют собой входные данные в систему (обычно файлы), поэтому странно думать о них в зависимости от целей.После некоторого изучения этот вопрос не имеет большого смысла.В любом случае, ответ - нет.
Все содержимое файла действительно не должно быть в одном целевом объекте - все, что требуется, это импортировать Wintellect.Файл TFSBuildNumber.targets находится в начале вашего файла csproj, а в конце объявляется зависимость BeforeBuild от файла WriteSharedCSharpAssemblyVersionFile.
Надеюсь, это поможет!