Номер сборки Tfs2010 и версии файла сборки и цели MSBuild - PullRequest
3 голосов
/ 02 октября 2010

Я прочитал статью Джона Роббинса TFS 2010 Build Number и версии файла сборки: полностью синхронизирован только с MSBuild 4.0 , и мне интересно, как лучше интегрировать это.

Для загрузки статьи предусмотрено два файла, один из которых является целевым файлом, а другой - файлом proj.

В файле целей есть ряд задач, чтобы очистить номер сборки на основе номера сборки Tfs (тот же, что использовался для сборок) и записать этот номер в какое-то место (назовите его BuildNumberFile) для использования другим проектом. файлы.

Файл proj очень прост. Он просто импортирует вышеупомянутый файл целей, а затем объявляет цель с именем «Все», а также объявляет DefaultTargets для элемента Project как «Все».

    <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 объявлять элемент Include для расположения, где находится BuildNumberFile, даже если он не существует до времени компиляции?
  • Имеют ли ItemGroups и Include объекты DependsOnTargets или что-то такое, что позволяет им убедиться, что файл существует до их сборки?
  • Все ли содержимое файла csproj, использующее это, должно быть обернуто в цель, которая выражает DependsOnTargets для BuildNumberFile?

Спасибо!

1 Ответ

1 голос
/ 03 октября 2010

Я думаю, что я понял это, но два человека продвинули мой вопрос, поэтому я отвечу на него здесь:

  • Вы можете убедиться, что цель выполнена, выразивзависимость от него от другой цели.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 в конце.

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

...