2013-05-09 77 views
0

在我们的网络代理店,我们有多个客户。我们使用SVN,但我们不使用CI。我想改变这一点并设置CC.NET,但是我很难将其解决,因为我无法确定最佳方法。我有机会以正确的方式重组事情,我想接受它,但我无法制定出“理想”的结构。理想cruisecontrol.net多种解决方案/回购/项目的svn目录结构

大部分客户具有结构简单,例如一个存储库包含每个客户端的一个解决方案/无论我从长远来看选择什么,都应该很容易为这些小型项目建立起来。

然而,我们的一位客户是更大的,使用多个存储库,解决方案和网站在某些情况下共享跨多个存储库的公共库。另外,这个客户的一些解决方案有项目引用,实际的项目只不过是很少改变的包装。对我而言,构建这些项目是有意义的,然后只需包含Assembly引用。

我目前想这样下面的结构,但我怀疑它是复杂的事情不是帮助,特别是多重组件级别的更多。我认为我应该删除顶层的程序集,这些程序集将位于任何客户端存​​储库之外,并且接受MVC或NUnit将不得不存储在每个客户端下的多个文件夹中。我还需要在开发人员机器上考虑这个结构,而不仅仅是构建服务器。

D:/Projects 

    Tools 
     // Folders containing dlls and libraries relating to the 
     // CI build process, e.g. FXCop, StyleCop settings, etc. 

    Assemblies 
     // third party/common assemblies referenced by multiple clients, 
     // e.g. NUnit, MVC: 

     [VendorName] 
      [LibraryName] 
       [VersionNumber] 

    [ClientName] 
     [Assemblies] (Possibly a new SVN repository?) 
      // Third party assemblies that are used only by this client. 
      // and also where the client's own shared assemblies will live 
      // after a successful build, for other Projects to reference. 

      [ThirdPartyVendor] 
       [ThirdPartyLibrary] 
      [ClientName] 
       [ProjectName.dll] 

     [Library/Website] 
      ProjectName.sln 
      CC.NET project build scripts 
      [ProjectName] // The main codebase 
      [ProjectName.Tests] // Unit Tests 
      [Artifacts] // CC.NET Artifacts 
      [Documentation] // For XML Docs that will be built nightly 

的想法是,当库建立并完成相关测试,如果其他项目依赖于它,它会生成的DLL复制到客户端的组件文件夹,使更新后的版本提供给任何其他项目是取决于它。

我是否过于复杂的东西?这种设置的理想repo/solution/project /目录结构是什么?

回答

0

结构

我没有在你的确切情况,但一旦我们有类似的情况,我认为 - 我们曾经为同一个客户多个项目。这些项目实际上是相似的 - 它们具有相似或相同的文件夹结构,它们大多使用相同的外部库等等。

在某些时候,我们也决定让所有这些库在一个地方,让他们提供给所有项目。所以在我们的例子中,我们有以下结构:

Client_name/ 
-- References 
-- -- Internal 
-- -- External 
-- Project 1 
-- -- ... 
-- Project 2 
-- -- ... 

那么对于我们使用的svn每个项目:特征的外部,在这里我们引用需要在引用该项目,并提供任何额外的库。
内部是为我们自己的图书馆。外部为第三方。

这种方式,我们可以控制我们所有的依赖于单一的地方。当然,更新每个项目中的特定引用是手动过程 - 这是可以的,因为我们希望确保新库不会构建任何东西,有时我们需要一些修改版本等,因此每个项目的自动更新是没有真正的建议。虽然可能很容易做到。

后来,其中一些内部引用被转换为nuget包,构建后我们将它们放在共享位置,在Visual Studio中单击即可轻松更新。

CCNET

另一个要考虑的是不同的项目CCNET配置。由于我们每个人都有相似的结构,因此复制每个项目并修改几个属性(解决方案文件名,存储库路径等)很容易,甚至有一些简单的应用程序可以为我执行此操作。

但是现在,我会用更多的巡航控制系统的预处理能力和变量定义和压倒一切的。

这意味着所有的每个项目更改,并覆盖它们为每个项目的属性建立一些基本的模板。这样,您可以轻松地添加具有类似配置的新项目。

对于我来说,这一点是至关重要的,因为如果你有多个项目,每个项目建立不同然后CI迅速失控,并导致不好的事情。所以一致性是关键。或者是为我们:)

0

组件 //多个客户端引用的第三方/公共组件, //例如, NUnit的,MVC:

[VENDORNAME] [库名称] [VERSIONNUMBER]

你已经打开了被誉为 “如何处理我的二进制依赖” 蠕虫即可。

并试图找到一个处理该问题的SVN解决方案。

所以你想弄清楚快速修复?或者你准备好投入一些时间了吗?

.......

“常春藤”从阿帕奇一直在处理二进制依赖问题,因为2005年“的NuGet”登上了几年前。

让我们来看一个简单的例子。

您有一个名为“MyPDFHelper.dll”(最初版本1.0.0.1)第三方库。 您有2个解决方案,每个解决方案包含3个项目。 (VS.sln和.csproj)。

Sln1, CSProjA, CSProjB, CSProjC 
Sln2, CSProjW, CSProjX, CSProjY 

Sln1/CSProjA depends on MyPDFHelper.dll, 1.0.0.1. 
Sln2/CSProjX depends on MyPDFHelper.dll, 1.0.0.1. 

PDFHelper发布MyPDFHelper.dll 1.0.0.2的新版本。没有突破的变化,一切都很酷。

PDFHelper发布MyPDFHelper.dll 2.0.0.1的新版本。 随着变化。

上Sln2/CSProjX开发人员希望使用MyPDFHelper.dll,2.0.0.1。 但是这将如何影响没有计划从1.0.0.1更新的Sln1/CSProjA。

显然,您已经看到此问题,因为您有[VersionNumber]。

但这是一个哲学问题。 SVN是为源代码(基本上是文本文件)还是源代码和二进制存储库的组合创建的?

Ivy和Nuget是BINARY存储库。

现在,我使用常春藤(即使在微软的世界),因为我解决了依赖性问题之前的短语'Nuget'曾经发出。

......

这是一个稍微不同的问题,但类似。

您有相同的“应用程序”项目。

Sln1, CSProjA, CSProjB, CSProjC 
Sln2, CSProjW, CSProjX, CSProjY 

但是你也有一个.sln“框架”一块。 假设它是封装良好的电子邮件发送代码。

MyCompany.EmailLibrary.sln MyCompany.EmailLibrary.csproj 它建立成MyCompany.EmailLibrary.dll

Sln1/CSProjB uses MyCompany.EmailLibrary.dll. 
Sln2/CSProjX uses MyCompany.EmailLibrary.dll. 

当您在自己的框架件重大更改,会发生什么?

.........

所以简而言之,

而不是把代码放到你的源代码库,你

“发布”在我们的例子中的二进制库

MyPDFHelper.dll, 1.0.0.1. would be published 
MyPDFHelper.dll, 1.0.0.2. would be published 
MyPDFHelper.dll, 2.0.0.1. would be published 

,然后将每个项目“依赖在“MyPDFHelper.dll上,它会有一些配置值,说”我想使用这个版本的MyPDFHelper.dll“。

常春藤符号会像

“1.0.0+” 或 “1+”。

当2.0.0.1是“发布”时,Sln2的配置可以更改为“2.0.0+”。 Sln1配置保持不变,“1.0.0+”

这样,每个Sln(1和2)将“检索”符合他们需要的MyPDFHelper.dll版本。 最终(当开发人员选择这样做时)Sln1可以更改为“2.0.0+”,但开发人员可以在他/她想要时处理重大更改,而不是其他开发人员放置新的第三方dll时进入源代码控制。

.........

现在,当涉及到MyCompany.EmailLibrary.dll。 基本上,每次创建MyCompany.EmailLibrary.sln时,都会将新构建放入二进制存储库。如果你所做的只是bug修复,那么你总是可以发布(并覆盖)版本“1.0.0.1”,但我更愿意使用递增数字发布。

MyCompany.EmailLibrary.dll v 1.0.0.333 
MyCompany.EmailLibrary.dll v 1.0.0.334 
MyCompany.EmailLibrary.dll v 1.0.0.444 

(数字不”的事情,只是他们递增事实。

.........

我会检查出Nuget(带有私有存储库)或Ivy(使用COMMAND LINE选项)。

我没有给你一个确切的解决方案,而是我向您介绍的二进制库的概念。

===================编辑

至于 “源代码结构”,我这样做:

\DotNet\src\v20Base\v20\ 
\DotNet\src\v20Base\v20\Applications\ 
\DotNet\src\v20Base\v20\Framework\ 
\DotNet\src\v20Base\v20\ThirdParty\ 


\DotNet\src\v20Base\v35\ 
\DotNet\src\v20Base\v35\Applications\ 
\DotNet\src\v20Base\v35\Framework\ 
\DotNet\src\v20Base\v35\ThirdParty\ 


\DotNet\src\v40Base\v40\ 
\DotNet\src\v40Base\v40\Applications\ 
\DotNet\src\v40Base\v40\Framework\ 
\DotNet\src\v40Base\v40\ThirdParty\ 

\DotNet\src\v40Base\v45\ 
\DotNet\src\v40Base\v45\Applications\ 
\DotNet\src\v40Base\v45\Framework\ 
\DotNet\src\v40Base\v45\ThirdParty\ 



Example Application 
\DotNet\src\v40Base\v40\Applications\ 
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\ 
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\SodaManagerSolution.sln 
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\Pres.AspNet\ 
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\Pres.WPF\ 
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\BusinessLogic\ 
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\DataLayer\ 
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\SqlScripts\ 

Example Framework 
\DotNet\src\v40Base\v40\Framework\ 
\DotNet\src\v40Base\v40\Framework\MyCompany.EmailLibrary\ 
\DotNet\src\v40Base\v40\Framework\MyCompany.EmailLibrary\MyCompany.EmailLibrary.sln 
\DotNet\src\v40Base\v40\Framework\MyCompany.EmailLibrary\MyCompany.EmailLibrary.csproj 

DOTNET的3.5 (和3.0)在2.0之后是“覆盖”。因此,3.5解决方案可以使用2.0 dll而没有问题。 4.0是一个新的CLR,因此新的“v40Base”。

它可能感觉过度杀伤,但是当框架在一个大的源代码库中改变.......它开始混淆哪个项目可以引用哪个其他项目。

相关问题