Номер сборки Tfs2010 и версии файлов сборки и целевые объекты MSBuild

StackOverflow https://stackoverflow.com/questions/3844379

Вопрос

Я читал статью Джона Роббинса Номер сборки 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.

Надеюсь, это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top