2009-08-25 98 views
0

好了,我有我的构建环境比较复杂的问题,我试图去处理。的MSBuild覆盖依赖

我有一个解决方案文件,其中包含多个由NAnt脚本调用MSBuild构建的C#项目 - 传递MSBuild解决方案文件的名称和将二进制文件复制到的路径。这是因为我想让我的自动化构建环境(CruiseControl.Net)创建一个以修订每个构建命名的文件夹 - 这样我可以很容易地返回到以前的二进制文件出于任何原因。

所以idealy我有一个文件夹的布局像这样

c:\build\nightly\rev1 
c:\build\nightly\rev2 
c:\build\nightly\rev3 
... 
c:\build\nightly\rev10 
etc. 

的问题多数民众赞成出现是我最近添加了最新版本的统一IoC容器到我的项目,直接检查出来MS在线SVN仓库的。发生了什么是我有一个引用Silverlight版本的Unity的Silverlight 3项目,但我也有其他项目(即我的单元测试项目)引用标准(非Silverlight)版本的Unity。

所以会发生什么是自MSBuild的倾销一切都变成一个单一的文件夹统一装配的的Silverlight版本覆盖非Silverlight的版本,因为他们有相同的组件文件名

然后当CruistControl运行,因为他们没有提供适当的相依他们没有我的单元测试了(他们试图加载的显然是行不通的Silverlight的具体统一组装)。

所以我想要做的是:

  • 保持我的期望的输出目录 结构(文件夹\修订)
  • 我不想手动编辑 每一个凸出的文件我有因为这 添加新 项目,以解决

Idealy时很容易出错,我想的MSBuild把一切都变成一个类似的文件夹结构:

nightly\revision1\project1 
nightly\revision1\project2 
nightly\revision1\project3 
... 
nightly\revision2\project1 
nightly\revision2\project2 
nightly\revision2\project3 
etc 

我不能修改统一项目,因为它来自另一个SVN仓库我不能更改提交给它一个不同的文件名。我在这里发现了一个类似的问题,建议的解决方案是使用“主”MSBuild文件,该文件使用自定义任务从解决方案中提取所有项目文件名,然后遍历构建它们的每个项目文件名。我尝试过,但它并没有按照它们的依赖关系构建它们,所以它对我的项目失败了。

帮助?

回答

0

首先,我总是有构建服务器删除旧的工作拷贝,并检查了一个新的副本,以避免与以前的版本陈旧器物任何问题。

接下来我会有恶性或MSBuild的像以前一样与每个版本的构件去他们的本地工作文件夹输出构建的解决方案。

之后,我会从他们的工作路径移动文物,它们的输出路径,这不应该需要通过项目文件挖因为你可以告诉的MSBuild /恶性至working\project1\bin\release\**\*.*复制到artifacts\project1\

这样做的脚本理想情况下应该与源文件一起存储在主文件中,例如build.nant或build.proj在主干的顶层。

0

对于第三方库,我会简单地在存储库中包含DLLs目录。没有比编写一些代码更糟糕的事情,并且由于第三方依赖项的更改而导致您的构建中断,因此不会更糟。

简单地记录你正在使用的库的版本,如果你必须更新他们,你就会有什么突破之前,你甚至检查它在构建一个更好的感觉。

而且,不CC.Net自动处理基于版本的发布版本?我使用TeamCity,它保留了每个构建的工件副本。

我强烈推荐阅读JP Boodhoo的Automating Builds with NAnt博客系列。这是我的出发点,并为我的口味做了很多改变。我还强烈建议查看许多开源项目的构建例子。我从Castle/Nhibernate/Rhino-Tools堆栈的构建中学到了很多东西。