Полезные советы: Как повторно использовать файлы .csproj и .sln для создания сценария MSBuild для CI? - PullRequest
7 голосов
/ 18 июня 2010

Каков безболезненный / поддерживаемый способ использования MSBuild в качестве сборщика?(Простите за длину этого поста)

Я просто пробовал свои силы в TeamCity (что я должен сказать, это потрясающе в плане обучения и из коробки).У меня работает комбо SVN> MSBuild> NUnit> NCover.

Мне было интересно узнать, как в MSBuild используются проекты среднего и большого размера - я только что указал MSBuild на мой файл Main sln.Я провел некоторое время с NAnt несколько лет назад и обнаружил, что MSBuild немного тупой.Документы слишком плотные / подробные для начинающих.

MSBuild, похоже, обладает особой магией для работы с файлами .sln;Я попробовал свои силы в написании собственного сценария сборки вручную, связывая / включая файлы .csproj по порядку (чтобы у меня могли быть пользовательские задачи перед посткомпоновкой).Однако он вырвался (ссылаясь на дублирующийся целевой импорт).Я предполагаю , что большинство разработчиков не захотят возиться с файлами msbuild proj - они будут вносить изменения в файлы .csproj и .sln .Существует ли какая-либо инструментальная задача / задача MSBuild, которая производит обратный инжиниринг нового сценария из существующего файла .sln + его .csproj, о котором я не знаю?

Если я использую MSBuild просто для выполнения шага компиляции, я мог бы также использовать Nant с задачей exec для MSBuild для компиляции решения?У меня есть это ноющее чувство, что я упускаю что-то очевидное.

Моя конечная цель - создать скрипт сборки MSBuild

  • , который создает решение
  • который действует как сценарий сборки вместо этапа компиляции.Позволяет настраивать задачи до и после.(например, вызовите nunit для запуска проекта nunit (который, кажется, еще не поддерживается через веб-интерфейс teamcity))
  • не позволяет разработчикам вносить изменения в решение.Нет избыточности;не нужно, чтобы разработчики делали одно и то же изменение в 2 местах

1 Ответ

7 голосов
/ 18 июня 2010

Я еще не пробовал TeamCity, но настроил среду сборки для нашего нового проекта BizTalk.

Следуя превосходному совету Саид Ибрагим Хашими на мой собственный вопросперед запуском я создал набор сценариев MSBuild .proj и .targets.

Core

Центральный сценарий .targets для фактических шагов сборкиВы хотите выполнить:

<Project DefaultTargets="Deploy" xmlns="...">
    <!-- omitted validation steps, see referenced post for details -->
    <PropertyGroup>
        <PullDependsOn>
            $(ValidateDependsOn);
            Validate;
        </PullDependsOn>
    </PropertyGroup>

    <PropertyGroup>
        <BuildDependsOn>
            $(PullDependsOn);
            PullFromVersionControl;
        </BuildDependsOn>
    </PropertyGroup>

    <PropertyGroup>
        <DeployDependsOn>
            $(BuildDependsOn);
            Build;
        </DeployDependsOn>
    </PropertyGroup>

    <Target Name="PullFromVersionControl" DependsOnTargets="$(PullDependsOn)">
        <Exec Command="..." />
    </Target>

    <Target Name="Build" DependsOnTargets="$(BuildDependsOn)">
        <MSBuild Projects="@(ProjectsToBuild)" />
    </Target>

    <Target Name="Deploy" DependsOnTargets="$(DeployDependsOn)">
        <Exec Command="..." />
    </Target>
</Project>

Вторая основная часть - это цели конфигурации, которые вы найдете в своих файлах .csproj

<Project xmlns="...">
    <PropertyGroup Condition=" '$(Environment)' == 'DEV' ">
        <SomeConfigKey Condition=" '$(SomeConfigKey)' == '' ">Foo</SomeConfigKey>
    </PropertyGroup>

    <PropertyGroup Condition=" '$(Environment)' == 'TEST' ">
        <SomeConfigKey Condition=" '$(SomeConfigKey)' == '' ">Bar</SomeConfigKey>
    </PropertyGroup>
</Project>

Проекты

Единственный .csproj сам по себе представлен файлом .targets с просто набором ItemGroups, которые вам нужны для построения.

<Project xmlns="...">
    <ItemGroup>
        <!-- this group contains the list of items to pull from version control -->
        <Sources Include="@(Sources)" />
        <Sources Include="MyProjectRootDir" />
        <Sources Include="MyDependentProjectRootDir" />
    </ItemGroup>

    <ItemGroup>
        <ProjectsToBuild Include="@(ProjectsToBuild)" />
        <ProjectsToBuild Include="MyProject.csproj" />
    </ItemGroup>
</Project>

Сбор его вместе

.Proj, который вы на самом деле собираетесь выполнить с MSBuild, импортирует вашу конфигурацию, ваш проект (файлы исходного кода) и ядро ​​(команды Pull, Build и Deployment)

<Project DefaultTargets="Deploy" xmlns="...">
    <Import Project="Config.targets"/>

    <Import Project="Project.targets"/>

    <Import Project="Core.targets"/>
</Project>

Используя этот подход, я смогповторно использовать .targets contобъединение источников для создания около 50 моих проектов во многих различных комбинациях вместо создания VS-решений для их группировки.

Надеюсь, вы найдете это полезным - я могу добавить больше деталей, если вам интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...