Nant:使用svn外部构建项目

Nant:使用svn外部构建项目,svn,build-process,nant,project-structure,svn-externals,Svn,Build Process,Nant,Project Structure,Svn Externals,使用subversion和Nant进行构建。我有一个主项目,它依赖于几个子项目。子项目在subversion中作为单独的项目存在 我的问题是: 主项目中的nant构建脚本是否应该构建所有引用的子项目及其自身?或者子项目知道如何构建它们自己吗?我从主构建文件调用子项目构建文件,并以某种方式将所有输出组装到主项目构建输出中 我目前有mainproject构建文件来构建所有子项目。也就是说,我在构建文件中为每个子项目设置了nant目标。然而,这似乎在主构建文件和子项目之间创建了紧密耦合。如果我能说“子

使用subversion和Nant进行构建。我有一个主项目,它依赖于几个子项目。子项目在subversion中作为单独的项目存在

我的问题是: 主项目中的nant构建脚本是否应该构建所有引用的子项目及其自身?或者子项目知道如何构建它们自己吗?我从主构建文件调用子项目构建文件,并以某种方式将所有输出组装到主项目构建输出中

我目前有mainproject构建文件来构建所有子项目。也就是说,我在构建文件中为每个子项目设置了nant目标。然而,这似乎在主构建文件和子项目之间创建了紧密耦合。如果我能说“子项目知道如何构建自己”,并要求他们从主项目构建自己并组装输出,那就太好了

作为参考,我的存储库如下所示:

/Repo
  /MainProject
    /trunk
      /doc   <-- documentation
      /lib   <-- binary-only DLLs (usually 3rd party)
      /src   <-- source code for MainProject
      /svn-externals  <-- hold references to other projects in repository
...
  /ClassLib1
    /trunk
      /doc
      /lib
      /src
      /svn-externals
...
  /ClassLib2
    /trunk
      /doc
      /lib
      /src
      /svn-externals
...
  /ClassLibCommon
    /trunk
      /doc
      /lib
      /src
      /svn-externals
/Repo
/主要项目
/树干

/医生你的问题的答案当然是“视情况而定”

您没有说的是您如何引用解决方案中的“子项目”,或者它们是否被其他解决方案(主项目)使用?它们是项目参考资料吗?如果是,请让nant调用MSBuild来生成解决方案。这将基于这些依赖关系构建所有子项目。我只能假设你是这样设置的

就个人而言,如果我有一个看起来像你的设置,我不会使用项目引用,也不会对每个项目的所有代码进行外部设置。我会像对待第三方DLL一样对待这些子项目

如果这样做,您将使用DLL引用。这将使子项目与主项目分离。这就是我要走的路,特别是如果那些子项目被其他项目引用的话

是的,现在你必须做一些其他的决定。。。例如如何在源代码管理中存储这些。您的lib文件夹中可以有externals。。。或者,您可以将DLL的副本放入lib文件夹中。这还取决于您希望如何控制版本控制


另外,您没有提到是否使用了某种类型的CI,例如CC.Net。如果您这样做了,您可以让它在任何子项目被修改时触发主项目的重建

库项目被其他“主”项目使用。它们是项目参考。两件事:1。图书馆经常变化。2.我认为传统的观点是不要为你有源代码的东西存储二进制文件。这要看情况而定。对我来说,不要在一个以上的解决方案中引用一个项目。我认为共享库不是主要项目的一部分。所以,就像把我的Crystal report DLL放到svn中一样,我也把我的内部框架DLL放到那里。此外,DLL引用使您能够更好地控制用于每个项目的库的版本。当然,您可以执行上述操作,而不必将二进制文件放入svn。对我来说,不要在一个以上的解决方案中引用一个项目,我不确定我是否理解这一点。澄清一下,当我使用术语“项目”时,我指的是一般意义上的项目,而不是VisualStudio意义上的项目。因此,在我看来,根据定义,类库“项目”(实际上是它自己的解决方案)旨在用于多个解决方案中。是的,它确实是一个首选项。正如我所说,根据您的描述,我不会在应用程序解决方案中包含共享VS项目的通用代码。我们在svn中包含与第三方LIB相同的二进制文件。因此,构建一个不会触发构建其他。
/MainProject
  /build
  /doc
  /lib
  /src
    /MainProject
  /svn-externals
    /ClassLib1 <-- svn external to svn://xyz/repo/ClassLib1/trunk
      /doc
      /lib
      /src
      /svn-externals
        /ClassLibCommon <- svn external to svn://xyz/repo/ClassLibCommon/trunk
          ...
    /ClassLib2 <-- svn external to svn://xyz/repo/ClassLib2/trunk
      /doc
      /lib
      /src
      /svn-externals
        /ClassLibCommon <- svn external to svn://xyz/repo/ClassLibCommon/trunk
          ...