Поделиться через


Управление местом размещения двоичных файлов системой построения

Процесс построения по умолчанию (определенный в DefaultTemplate.xaml) помещает все компилируемые им двоичные файлы из всех проектов кода в один каталог. В некоторых случаях может потребоваться организовать двоичные файлы в более организованную и дробную структуру.

В этом разделе описаны методы создания пользовательского процесса построения, который размещает двоичные файлы в созданной пользователем структуре каталогов. Используя те же принципы, можно настраивать процесс построения различным образом. В этом разделе содержится описание следующих методов:

  • Настройка части процесса построения, связанной с рабочим процессом Windows. Здесь можно настроить большую часть аспектов процесса построения, кроме компиляции и обработки двоичных файлов. В частности, в этом разделе описано выполнение следующих действий:

    • Создание пользовательского процесса построения путем изменения копии шаблона по умолчанию (DefaultTemplate.xaml).

    • Объявление и использование аргументов для передачи данных в рабочий процесс.

    • Объявление и использование переменных для сбора и передачи данных через рабочий процесс.

    • Изменение того, как рабочий процесс использует действие MSBuild для вызова MSBuild.

    • Загрузка файла на сервер построения и использование действия ConvertWorkspaceItem, чтобы сделать файл доступным процессу построения.

  • Настройка части процесса построения, относящейся к MSBuild. Внося изменения в эту часть, можно более эффективно настраивать компиляцию и обработку двоичных файлов. В частности, в этом разделе описано выполнение следующих действий:

    • Передача аргументов в MSBuild и последующее их использование в проектах кода для изменения процесса компиляции и обработки двоичных файлов.

    • Настройка централизованной библиотеки общего кода собственных элементов MSBuild пользователя, например групп свойств или целей. Настройка библиотеки такого типа позволит команде легче повторно использовать и изменять ключевые участки логики процесса построения.

Примечание

Этот раздел покрывает три типа проектов кода: C#, C++ и Visual Basic.Эти методы также можно использовать для других типов проектов кода.

Содержание раздела

  • Необходимые разрешения

  • Размещение скомпилированных двоичных файлов процессом построения по умолчанию

  • Организация скомпилированных двоичных файлов с помощью логики, внедренной в каждый проект кода

    • Общие сведения о процессе

    • Общие сведения об этапах процесса

    • Создание определения построения и пользовательского шаблона процесса построения CustomOutputDirInline

    • Внедрение логики размещения по папкам в проект кода

  • Организация скомпилированных двоичных файлов с помощью логики, заданной двумя централизованными файлами

    • Общие сведения о процессе

    • Общие сведения об этапах процесса

    • Создание файлов общего кода MSBuild, содержащих логику размещения по папкам

    • Создание определения построения и пользовательского шаблона процесса построения CustomOutputDirImport

    • Обновление определения построения OurTeamBuild

    • Импорт логики размещения по папкам в проект кода

  • Следующие шаги

Необходимые разрешения

Для выполнения описанных в этом разделе процедур требуются следующие разрешения со значением Разрешить:

  • Изменение определения построения.

  • Извлечение и Возврат для соответствующих каталогов системы управления версиями.

  • Постановка построений в очередь.

Дополнительные сведения см. в разделе Разрешения Team Foundation Server.

Размещение скомпилированных двоичных файлов процессом построения по умолчанию

Вне зависимости от деления на проекты кода и решения процесс построения по умолчанию размещает все скомпилированные двоичные файлы в одном подкаталоге вашего транзитного каталога. Например, вы работаете со следующими решениями и проектами кода:

  • Решение А

    • CPPWin32ConsoleApp (консольное приложение Visual C++)

    • CSharpConsoleApp (консольное приложение Visual C#)

  • Решение Б

    • VBConsoleApp (консольное приложение Visual Basic)

На следующей схеме показано, как и где MSBuild размещает двоичные файлы после компиляции в ходе процесса, определенного в файле DefaultTemplate.xaml.

Поток по умолчанию

Организация скомпилированных двоичных файлов с помощью логики, внедренной в каждый проект кода

Можно указать, чтобы скомпилированные двоичные файлы размещались в структуре подкаталогов, совпадающей со структурой решений и проектов кода.

Общие сведения о процессе

На следующей схеме показано высокоуровневое представление реализации подобного процесса построения.

Поток с внедренной пользовательской логикой вывода

Общие сведения об этапах процесса

Вкратце, для создания такого типа пользовательского процесса построения на основе DefaultTemplate.xaml необходимо выполнить следующие действия:

  • Шаг 1 Шаблон процесса построения и определение построения

    • Создайте определение построения (например, с именем OurTeamBuild). На вкладке Процесс укажите в качестве основы для определения построения новый шаблон процесса построения (например, с именем CustomOutputDirInline.xaml).

    • В файле CustomOutputDirInline.xaml выполните в экземпляре действия Run MSBuild for Project, компилирующего код, следующие действия.

      • Отключите свойство OutDir действия Run MSBuild for Project, удалив его значение из строки.

        Примечание

        Если этого не сделать, свойство OutDir переопределит любую пользовательскую логику структуры каталогов, реализованную в проекте кода.

      • Возьмите значение строки, содержащее транзитный каталог агента построения, из переменной BinariesDirectory и передайте его в качестве аргумента в MSBuild (например, с именем TeamBuildOutDir).

  • Шаг 2 Проекты кода

    • В каждом проекте кода, компиляция которого выполняется с помощью OurTeamBuild, создайте соответствующий элемент (OutputPath или OutDir), определяющий структуру подкаталогов, создаваемую в транзитном каталоге.

Эти шаги подробно описаны в следующих подразделах.

Создание определения построения и пользовательского шаблона процесса построения CustomOutputDirInline

Создавая определение построения с опорой на шаблон нового процесса построения, вы закладываете основу процесса построения.

Создание определения построения и шаблона процесса построения

  1. Создание определения построения.

    1. На вкладке Общие введите имя определения построения (например, OurTeamBuild).

    2. На вкладке Процесс добавьте решение, построение которого нужно выполнить.

      Дополнительные сведения см. в разделе Создание базового определения построения.

  2. На вкладке Процесс определения построения OurTeamBuild укажите для поля "Шаблон процесса построения" новый шаблон процесса построения с именем CustomOutputDirInline.xaml, основанный на шаблоне по умолчанию (DefaultTemplate.xaml).

    Дополнительные сведения см. в разделе Создание пользовательского шаблона процесса построения и работа с ним.

  3. В обозревателе управления исходным кодом откройте командный проект и перейдите в каталог, содержащий ваши шаблоны процесса построения.

    По умолчанию это подкаталог BuildProcessTemplates.

  4. Извлеките файлы, после чего дважды щелкните файл CustomOutputDirInline.xaml, созданный ранее в ходе этой процедуры.

  5. В конструкторе рабочих процессов найдите второй экземпляр действия Run MSBuild for Project, расположенный в следующей структуре:

    1. Последовательность (Sequence) >

    2. Выполнение в агенте (AgentScope) >

    3. Попробуйте откомпилировать, протестировать и связать наборы изменений и рабочие элементы (TryCatch [Try]) >

    4. Последовательность (Sequence) >

    5. Компиляция, тестирование и сопоставление наборов изменений и рабочих элементов (Parallel) >

    6. Попробуйте откомпилировать и протестировать TryCatch [Try] >

    7. Компиляция и тестирование Sequence >

    8. Для каждой конфигурации в BuildSettings.PlatformConfigurations ForEach [Body] >

    9. Компиляция и тестирование для конфигурации Sequence >

    10. Если BuildSettings.HasProjectsToBuild If [Then] >

    11. Для каждого проекта в BuildSettings.ProjectsToBuild ForEach [Body] >

    12. Попробуйте откомпилировать проект TryCatch [Try] >

    13. Компиляция проекта Sequence >

    14. Выполнение MSBuild для проекта MSBuild

    Дополнительные сведения об использовании этой структуры см. в разделе Перемещение по сложным рабочим процессам Windows.

  6. Щелкните правой кнопкой мыши действие Run MSBuild for Project, затем щелкните Свойства.

  7. В области Свойства удалите данные из поля OutDir, задав свойству в качестве значения пустую строку.

  8. В области Свойства присвойте свойству CommandLineArguments следующее значение:

    String.Format("/p:SkipInvalidConfigurations=true;TeamBuildOutDir=""{0}"" {1}",
    BinariesDirectory, MSBuildArguments)
    
  9. Сохраните CustomOutputDirInline.xaml.

  10. В обозревателе управления исходным кодом верните изменения, внесенные в этот файл.

Внедрение логики размещения по папкам в проект кода

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

Примечание

Встроить эту логику непосредственно в рабочий процесс невозможно, поскольку рабочий процесс DefaultTemplate.xaml не запускает компилятор MSBuild для всех проектов по очереди.Вместо этого он вызывает MSBuild один раз для компиляции всех решений и проектов.

Внедрение логики размещения по папкам

  1. В обозревателе управления исходным кодом откройте решение, построение которого выполняется с помощью определения построения OurTeamBuild.

  2. Добавьте нужный элемент выходного каталога к каждому проекту в решении. В проектах управляемого кода, например Visual C# или Visual Basic, нужное свойство называется OutputPath. В проектах Visual C++ — OutDir. Для каждого проекта в решении выполните следующие действия:

    1. В обозревателе решений щелкните проект правой кнопкой мыши. Если команда Отменить загрузку проекта доступна, щелкните ее.

    2. Щелкните проект правой кнопкой мыши и выберите команду Изменить имя_проекта.

    3. Выполните одно из следующих действий.

      • Если вы работаете с проектом управляемого кода, например Visual C# или Visual Basic, добавьте элемент OutputPath. Необходимо разместить элемент после последнего элемента OutputPath, существующего в проекте, как показано в примере:

        <Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003 ...">
         ...
        <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86'">
         ...
         <OutputPath>bin\Debug\</OutputPath>
         ...
        </PropertyGroup>
        <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
         ...
         <OutputPath>bin\Release\</OutputPath>
         ...
        </PropertyGroup>
        
        <PropertyGroup Condition="$(TeamBuildOutDir) != '' ">
        <OutputPath>$(TeamBuildOutDir)\$(SolutionName)\$(MSBuildProjectName)\$(Configuration)</OutputPath>
        </PropertyGroup>
        
      • Если вы работаете с проектом Visual C++, добавьте элемент OutDir. Необходимо разместить этот элемент до элемента, импортирующего Microsoft.Cpp.targets, как показано в примере:

        <Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003 ...">
        ...
        
        <PropertyGroup Condition="$(TeamBuildOutDir) != '' ">
         <OutDir>$(TeamBuildOutDir)\$(SolutionName)\$(MSBuildProjectName)\$(Configuration)\</OutDir>
        </PropertyGroup>
        
        <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
        </Project>
        
    4. Сохраните проект кода.

  3. В обозревателе решений щелкните решение правой кнопкой мыши и выберите команду Вернуть.

  4. Повторите описанные шаги для каждого решения, построение которого выполняется с помощью определения построения OurTeamBuild.

Организация скомпилированных двоичных файлов с помощью логики, заданной двумя центральными файлами

При поддержке множества проектов кода можно усовершенствовать процесс, описанный в предыдущем разделе, если элементы OutputPath и OutDir хранятся в двух общих файлах. Этот подход упрощает изменение структуры подкаталогов транзитного каталога. Требуется изменять два централизованных файла вместо изменения каждого проекта кода.

Общие сведения о процессе

На следующей схеме показано высокоуровневое представление реализации подобного процесса построения.

Поток с импортированной пользовательской логикой вывода

Общие сведения об этапах процесса

Вкратце, для создания такого типа пользовательского процесса построения на основе DefaultTemplate.xaml необходимо выполнить следующие действия:

  • В обозревателе управления исходным кодом создайте каталог (например, с именем $/OurTeam/BuildProcessMSBuild) для вашего общего кода MSBuild. В этом каталоге следует создать и сохранить файлы MSBuild, определяющие структуру каталогов, которая будет создана в ваших транзитных каталогах.

  • Шаг 1 Шаблон процесса построения и определение построения

    • Обновите определение построения (например, с именем OurTeamBuild), выполнив следующие действия:

      • На вкладке Рабочая область выберите каталог $/OurTeam/BuildProcessMSBuild.

      • На вкладке Процесс укажите в качестве основы для определения построения новый шаблон процесса построения (например, с именем CustomOutputDirImport.xaml).

    • Выполните следующие действия в файле CustomOutputDirImport.xaml:

      • Объявите LocalPathToMSBuildCode как переменную String, область действия которой ограничена действием Run On Agent.

      • Объявите аргумент ServerPathToMSBuildCode.

        После создания аргумента необходимо изменить определение OurTeamBuild. На вкладке Процесс введите в качестве значения параметра процесса построения $/OurTeam/BuildProcessMSBuild.

      • В действии Run on Agent > перед действием Try Compile, Test, and Associate Changesets and Work Items [Try] добавьте действие ConvertWorkspaceItem для преобразования аргумента ServerPathToMSBuildCode в локальный путь агента построения, который может быть обработан MSBuild. Присвойте это значение переменной LocalPathToMSBuildCode.

      • В экземпляре действия Run MSBuild for Project, компилирующем код, выполните следующие действия:

        • Отключите свойство OutDir действия Run MSBuild for Project, удалив его значение из строки.

          Примечание

          Если этого не сделать, свойство OutDir переопределит любую пользовательскую логику структуры каталогов, реализованную в проекте кода.

        • Возьмите значение строки, содержащее транзитный каталог агента построения, из переменной BinariesDirectory и передайте его в качестве аргумента в MSBuild (например, с именем TeamBuildOutDir).

        • Передайте значение переменной LocalPathToMSBuildCode в качестве аргумента в MSBuild (например, с именем CommonMSBuildCode).

  • Шаг 2 Проекты кода

    • В каждом проекте кода, который компилируется с использованием определения построения OurTeamBuild, добавьте в соответствующее место элемент <Import />.

Эти шаги подробно описаны в следующих подразделах.

Создание файлов общего кода MSBuild, содержащих логику размещения по папкам

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

Создание файлов

  1. В обозревателе управления исходным кодом выполните один из следующих шагов:

    • Перейдите в каталог, используемый для хранения общего кода MSBuild.

    • Создайте каталог для хранения общего кода MSBuild, например с именем $/OurTeam/BuildProcessMSBuild.

  2. Если ссылка Не сопоставлен отображается рядом с меткой Локальный путь в верхней части обозревателя управления исходным кодом, щелкните ссылку, чтобы сопоставить каталог на сервере с нужным каталогом вашей локальной рабочей области.

  3. Создайте, сохраните и верните в $/OurTeam/BuildProcessMSBuild следующие файлы:

    • Файл, содержащий логику транзитного каталога для проектов управляемого кода, например кода Visual C# или Visual Basic (например, с именем ManagedCodeProjectOutDir.targets).

      <Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup Condition="$(TeamBuildOutDir) != '' ">
       <OutputPath>$(TeamBuildOutDir)\$(SolutionName)\$(MSBuildProjectName)\$(Configuration)</OutputPath>
      </PropertyGroup>
      </Project>
      
    • Файл, содержащий логику транзитного каталога для проектов кода Visual C# (например, с именем CPPCodeProjectOutDir.targets).

      <Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup Condition="$(TeamBuildOutDir) != '' ">
       <OutDir>$(TeamBuildOutDir)\$(SolutionName)\$(MSBuildProjectName)\$(Configuration)\</OutDir>
      </PropertyGroup>
      </Project>
      

Создание определения построения и пользовательского шаблона процесса построения CustomOutputDirImport

Можно использовать повторно определение построения, созданное ранее в этой теме и названное OurTeamBuild. Оно будет основано на новом шаблоне процесса построения с некоторыми изменениями.

Создание определения построения и шаблона процесса построения

  1. В диалоговом окне Сред. Командный обозреватель щелкните правой кнопкой мыши OurTeamBuild, затем выберите команду Изменить.

  2. Перейдите на вкладку Процесс, после чего укажите для поля "Шаблон процесса построения" новый шаблон процесса построения с именем CustomOutputDirImport.xaml, основанный на шаблоне по умолчанию (DefaultTemplate.xaml).

    Дополнительные сведения см. в разделе Создание пользовательского шаблона процесса построения и работа с ним.

  3. В обозревателе управления исходным кодом откройте командный проект и перейдите в каталог, содержащий ваши шаблоны процесса построения. По умолчанию это подкаталог BuildProcessTemplates.

  4. Извлеките файлы, после чего дважды щелкните файл CustomOutputDirImport.xaml, созданный ранее в ходе этой процедуры.

  5. В конструкторе рабочих процессов найдите действие Run on Agent, расположенное в следующей структуре:

    1. Последовательность (Sequence) >

    2. Выполнение в агенте (AgentScope) >

    Дополнительные сведения об использовании этой структуры см. в разделе Перемещение по сложным рабочим процессам Windows.

  6. В нижней части окна щелкните Аргументы.

  7. В области Аргументы создайте аргумент с именем ServerPathToMSBuildCode.

  8. В области Свойства установите флажок IsRequired.

  9. В нижней части окна щелкните Переменные.

  10. В области Переменные объявите переменную с именем LocalPathToMSBuildCode, типом String и областью действия Run On Agent.

  11. Перетащите действие ConvertWorkspaceItem из раздела Операции Team Foundation Build панели элементов в положение между действиями Initialize Workspace и If CreateLabel.

    Примечание

    Если раздел Операции Team Foundation Build не отображается на панели элементов, добавьте его вручную из сборки Microsoft.TeamFoundation.Build.Workflow.dll.Дополнительные сведения см. в разделе How to: Add Activities to the Toolbox.

  12. Щелкните правой кнопкой мыши действие ConvertWorkspaceItem, затем щелкните Свойства.

  13. В области Свойства установите следующие значения свойств:

    • Отображаемое имя: Get Local Path to MSBuild Code;

    • Ввод: ServerPathToMSBuildCode;

    • Результат: LocalPathToMSBuildCode;

    • Рабочая область: Workspace.

  14. Найдите второй экземпляр действия Run MSBuild for Project, расположенный в следующей структуре:

    1. Последовательность (Sequence) >

    2. Выполнение в агенте (AgentScope) >

    3. Попробуйте откомпилировать, протестировать и связать наборы изменений и рабочие элементы (TryCatch [Try]) >

    4. Последовательность (Sequence) >

    5. Компиляция, тестирование и сопоставление наборов изменений и рабочих элементов (Parallel) >

    6. Попробуйте откомпилировать и протестировать TryCatch [Try] >

    7. Компиляция и тестирование Sequence >

    8. Для каждой конфигурации в BuildSettings.PlatformConfigurations ForEach [Body] >

    9. Компиляция и тестирование для конфигурации Sequence >

    10. Если BuildSettings.HasProjectsToBuild If [Then] >

    11. Для каждого проекта в BuildSettings.ProjectsToBuild ForEach [Body] >

    12. Попробуйте откомпилировать проект TryCatch [Try] >

    13. Компиляция проекта Sequence >

    14. Выполнение MSBuild для проекта MSBuild

    Дополнительные сведения об использовании этой структуры см. в разделе Перемещение по сложным рабочим процессам Windows.

  15. Щелкните правой кнопкой мыши действие Run MSBuild for Project, затем щелкните Свойства.

  16. В области Свойства удалите данные из поля OutDir, задав свойству в качестве значения пустую строку.

  17. В области Свойства присвойте свойству CommandLineArguments следующее значение:

    String.Format("/p:SkipInvalidConfigurations=true;CommonMSBuildCode=""{0}"";TeamBuildOutDir=""{1}"" {2}",
    LocalPathToMSBuildCode, BinariesDirectory, MSBuildArguments)
    
  18. Сохраните CustomOutputDirImport.xaml.

    В обозревателе управления исходным кодом верните изменения, внесенные в этот файл.

Обновление определения построения OurTeamBuild

Далее необходимо изменить определение построения OurTeamBuild.

Обновление определения построения

  1. В командном обозревателе разверните командный проект, с которым работаете, разверните папку Построения, щелкните правой кнопкой мыши определение построения OurTeamBuild, и выберите команду Редактировать определение построения.

  2. Перейдите на вкладку Рабочая область и добавьте запись со следующими значениями:

    • Состояние: Активно;

    • Папка системы управления версиями: $/OurTeam/BuildProcessMSBuild;

    • Папка агента построения: $(SourceDir)\BuildProcessMSBuild.

  3. Перейдите на вкладку Процесс и введите $/OurTeam/BuildProcessMSBuild в поле ServerPathToMSBuildCode.

  4. Сохраните определение построения.

Импорт логики размещения по папкам в проект кода

После создания определения построения и пользовательского шаблона процесса построения необходимо обновить проекты кода, импортировав в них логику структуры каталогов.

Импорт логики размещения по папкам

  1. В обозревателе управления исходным кодом дважды щелкните решение, построение которого выполняет OurTeamBuild.

  2. Для каждого проекта в решении выполните следующие действия:

    1. В обозревателе решений щелкните проект правой кнопкой мыши. Если команда Отменить загрузку проекта доступна, щелкните ее.

    2. Щелкните проект правой кнопкой мыши и выберите команду Изменить имя_проекта.

    3. Выполните одно из следующих действий.

      • Если вы работаете с проектом управляемого кода, например Visual C# или Visual Basic, добавьте элемент Import после последнего элемента OutputPath, уже существующего в проекте, как показано в примере:

        <Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003 ...">
         ...
        <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86'">
         ...
         <OutputPath>bin\Debug\</OutputPath>
         ...
        </PropertyGroup>
        <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
         ...
         <OutputPath>bin\Release\</OutputPath>
         ...
        </PropertyGroup>
        
        <Import Condition=" $(CommonMSBuildCode) != ''" Project="$(CommonMSBuildCode)\ManagedCodeProjectOutDir.targets"/>
        
      • Если вы работаете с проектом Visual C++, добавьте элемент Import до элемента, импортирующего Microsoft.Cpp.targets, как показано в примере:

        <Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003 ...">
        ...
        <Import Condition=" $(CommonMSBuildCode) != ''" Project="$(CommonMSBuildCode)\CPPCodeProjectOutDir.targets"/>
        
        <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
        </Project>
        
    4. Сохраните проект кода.

  3. В обозревателе решений щелкните решение правой кнопкой мыши и выберите команду Вернуть.

  4. Повторите описанные шаги для каждого решения, построение которого выполняется с помощью определения построения OurTeamBuild.

Следующие шаги

В завершение можно выполнить следующие задачи:

  • Изменить логику размещения по папкам. Вы можете изменить предложенное в этой теме содержимое элементов OutputPath и OutDir в соответствии с требованиями команды.

  • Сохранить настроенный проект кода в виде шаблона. Можно автоматически включать пользовательскую логику MSBuild в новые проекты, создаваемые вашей командой. В обозревателе решений щелкните проект кода, откройте меню Файл и щелкните Экспорт шаблона.

Дополнительные ресурсы

Дополнительные сведения можно получить в следующих разделах веб-сайта Майкрософт:

См. также

Основные понятия

Использование обозревателя управления исходным кодом

Создание рабочей области для работы с командным проектом

Другие ресурсы

Справочные сведения о MSBuild