Nant:使用svn-externals构建项目

时间:2009-09-13 03:07:15

标签: svn build-process nant project-structure svn-externals

使用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

我使用subversion svn-externals属性拉入子项目。所以我的工作副本是这样的:

/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
          ...

1 个答案:

答案 0 :(得分:0)

你的问题的答案当然是“它取决于”。

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

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

如果你这样做,你将使用DLL引用。这将子项目与主项目分离。这是我的方式,特别是如果这些子项目被其他项目引用。

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

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