2010-06-18 36 views
7

使用MSBuild作为build runner的无痛/可维护方式是什么? (原谅这篇文章的长度)好习惯:如何重用.csproj和.sln文件为CI创建MSBuild脚本?

我只是在TeamCity上(我必须说是令人敬畏的w.r.t.学习曲线和开箱即用功能)。我有一个SVN> MSBuild> NUnit> NCover组合工作。

我很好奇大中型项目是如何使用MSBuild的 - 我刚刚将MSBuild指向了我的主sln文件。 几年前,我和NAnt一起度过了一段时间,我发现MSBuild有些迟钝。文档对于初学者来说太密集/详细。

MSBuild似乎有一些特殊的魔法来处理.sln文件;我试图手工编写一个自定义构建脚本,按顺序链接/包含.csproj文件(这样我就可以进行自定义的构建前任务)。然而它抛出了(引用重复的目标进口)。我假设大多数开发人员不想去搞乱msbuild proj文件 - 他们会改变.csproj和.sln文件。是否有一些工具/ MSBuild任务可以从我不知道的现有.sln + .csproj文件中反向设计新脚本?

如果我正在使用MSBuild来完成编译步骤,那么我还可以使用Nant与MSBuild的exec任务来编译解决方案?我有这种唠叨的感觉,我失去了一些明显的东西。

我在这里的最终目标是拥有一个MSBuild的构建脚本

  • 其构建的解决方案
  • 充当构建脚本,而不是一个编译步骤。允许自定义前/后任务。 (例如,要求nunit运行一个nunit项目(这似乎还没有通过teamcity网络用户界面支持))
  • 保持了开发者对解决方案进行更改的方式。没有冗余;不应该要求开发人员在2个地方进行相同的更改
+0

我的解决方案是否适合您,还是您更专注于TeamCity? – Filburt 2010-06-21 12:25:28

+0

@Filburt - 对不起..有偏差/需要更多的时间来实践Sayed的博客文章 - 我想我正在寻找的是''任务。从主脚本中分叉msbuild。我的主要需求是避免在构建脚本中重复解决方案/ proj配置,但仍然能够添加前/后构建定制任务 – Gishu 2010-06-21 12:48:19

回答

7

我没有尝试TeamCity,但确实为我们的新BizTalk项目设置了构建环境。

Sayed Ibrahim Hashimimy own question before starting out的优秀建议后,我创建了一套MSBuild .proj和.targets脚本。

核心

您要执行实际构建步骤中央.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本身由a.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> 

将其组合在一起

你居然会用的MSBuild执行将导入您的配置.proj,您的项目(源代码文件)和Core(拉,构建和部署命令)

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

    <Import Project="Project.targets"/> 

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

使用这种方法,我能够重用包含源代码来构建我的一些50个项目在许多不同的组合,而不是建立VS解决方案组他们.targets。

我希望你会发现这个有用的 - 如果你有兴趣,我可以添加更多的细节。

+0

嗨Filburt请你看看http://stackoverflow.com/questions/34059733/多提示路径合的csproj文件从 - 一个文本文件变量 – ansar 2015-12-21 09:28:44