2013-02-08 57 views
2

我在ccnet.config中使用CruiseControl.NET和devenv来自动构建VS 2005 .NET解决方案。该解决方案包含对多个项目的引用,这些项目相互依赖以及包含第三方dll和其他dll的库文件夹,这些dll是从我创建的项目编译而来的。CruiseControl.NET,SVN和多个依赖关系

我遇到的问题是试图设置我的ccnet.config文件,以便在开始devenv任务之前从SVN获取.NET sln文件和Library文件夹中每个项目的最新更新。

有人可以帮助或指出我在正确的方向,因为我似乎无法在网上找到任何东西?

下面是我的ccent.config文件,我使用的预处理器的,以避免重复,我会重用这对其他解决方案文件是相似的结构:

<cruisecontrol xmlns:cb="urn:ccnet.config.builder"> 

    <cb:define MainTrunk="svn://mySvnUrl"/> 
    <cb:define WorkingDir="C:\Svn\"/> 
    <cb:define SvnExec="C:\Program Files\CollabNet Subversion Client\svn.exe"/> 
    <cb:define ArtifactsDir="\Artifacts"/> 

    <cb:define name="MyProjectName"> 
     <project name="$(ProjectName)" 
       description="$(ProjectName) build"> 

     <triggers> 
     <!-- check the source control every X time for changes, 
      and run the tasks if changes are found --> 
      <intervalTrigger 
        name="continuous" 
        seconds="500" 
        buildCondition="IfModificationExists" 
        initialSeconds="5"/> 
     </triggers> 

     <sourcecontrol type="svn"> 

      <trunkUrl>$(MainTrunk)/$(ProjectName)/trunk</trunkUrl> 

      <workingDirectory>$(WorkingDir)$(ProjectName)</workingDirectory> 

      <executable>$(SvnExec)</executable> 

     </sourcecontrol> 

     <tasks> 
       <devenv> 
        <solutionfile>$(WorkingDir)$(ProjectName)\$(ProjectName).sln</solutionfile> 
        <configuration>Debug</configuration> 
        <executable>C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com</executable> 
        <!--<buildTimeoutSeconds>10</buildTimeoutSeconds>--> 
       </devenv> 

     </tasks> 

     <publishers> 
      <xmllogger /> 
      <artifactcleanup cleanUpMethod="KeepLastXBuilds" 
          cleanUpValue="50" /> 
     </publishers> 

     </project> 
    </cb:define> 

    <cb:scope ProjectName="ProjectA"> 
     <cb:MyProjectName/> 
    </cb:scope> 

</cruisecontrol> 

UPDATE:询问后问题,我开始考虑解决这个问题的方法是检查相关项目的修改,如果有变化,然后触发构建VS解决方案文件ProjectA。所以我已经相应地更新了我的ccnet.config(见下文)。然后,我会将这个应用于我的VS sln中的依赖项目。

如果有人能够看一看,并且让我知道我是否朝着正确的方向前进,

<cruisecontrol xmlns:cb="urn:ccnet.config.builder"> 
    <!-- This is your CruiseControl.NET Server Configuration file. Add your projects below! --> 
    <cb:define MainTrunk="svn://SvnUrl"/> 
    <cb:define WorkingDir="C:\Svn\"/> 
    <cb:define SvnExec="C:\Program Files\CollabNet Subversion Client\svn.exe"/> 
    <cb:define ArtifactsDir="\Artifacts"/> 

    <cb:define name="MyProjectName"> 
     <project name="$(ProjectName)" 
       description="$(ProjectName) build"> 

     <triggers> 


      <projectTrigger project="Libraries"> 
      <triggerStatus>Success</triggerStatus> 
      <innerTrigger type="intervalTrigger" 
          seconds="120" 
          buildCondition="ForceBuild" /> 
      </projectTrigger> 

     </triggers> 

     <sourcecontrol type="svn"> 

      <trunkUrl>$(MainTrunk)/$(ProjectName)/trunk</trunkUrl> 

      <workingDirectory>$(WorkingDir)$(ProjectName)</workingDirectory> 

      <executable>$(SvnExec)</executable> 

     </sourcecontrol> 

     <tasks> 
       <devenv> 
        <solutionfile>$(WorkingDir)$(ProjectName)\$(ProjectName).sln</solutionfile> 
        <configuration>Debug</configuration> 
        <executable>C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com</executable> 
        <!--<buildTimeoutSeconds>10</buildTimeoutSeconds>--> 
       </devenv> 

     </tasks> 

     <publishers> 
      <xmllogger /> 
      <artifactcleanup cleanUpMethod="KeepLastXBuilds" 
          cleanUpValue="50" /> 
     </publishers> 

     </project> 
    </cb:define> 

    <cb:scope ProjectName="ProjectA"> 
     <cb:MyProjectName/> 
    </cb:scope> 

    <project name="Libraries"> 
     <triggers> 
      <intervalTrigger name="continuous" seconds="60" buildCondition="IfModificationExists" initialSeconds="5"/> 
     </triggers> 
     <sourcecontrol type="svn">      
      <trunkUrl>svn://SvnUrl/Libraries</trunkUrl> 
      <workingDirectory>C:\Svn\Libraries</workingDirectory> 
      <executable>C:\Program Files\CollabNet Subversion Client\svn.exe</executable>   
     </sourcecontrol> 
    </project> 

</cruisecontrol> 
+0

你遇到什么问题,当您使用提到的配置? – metalheart

+0

@metalheart - 配置没有问题,因为在构建工作中,但如果我更改我的Libraries文件夹并检入SVN,构建服务器将无法从SVN获取最新版本的Libraries文件夹,因为它没有定义在配置中。我如何告诉它获取最新的Libraries文件夹,然后触发ProjectA的构建?谢谢。 – creativeincode

+0

是项目干线内部还是外部的库文件夹? – metalheart

回答

1

只要你包括在每个项目的根的第三方库通过对项目躯干指向库文件夹的svn:externals属性,使用下面的开关sourcecontrol配置块中:

<checkExternals>True</checkExternals> 

这样CC.NET也会在库文件夹中修改时触发编译。

您可能还需要:

<checkExternalsRecursive>True</checkExternalsRecursive> 
+0

感谢金属之心。不幸的是,我没有配置我的项目根目录通过svn:externals包含第三方库。我已经修改了配置并在上面发布。你认为我提出的是可行的吗?谢谢。 – creativeincode

+1

@creativeincode:似乎对我来说(但你必须自己检查),你可能也有兴趣阅读[this](http://stackoverflow.com/questions/1273619/how-do-i-setup-multiple -triggers-for-cruisecontrol-net/1276263#1276263)作为替代品(可能不那么复杂) – metalheart

+0

这似乎是我所追求的,谢谢你的帮助! – creativeincode