2009-09-13 79 views
1

使用Subversion和Nant进行构建。我有一个主要项目取决于几个子项目。子项目在subversion中存在为单独的项目。Nant:使用svn-externals构建项目

我的问题是: 应在主要项目中的恶性生成脚本编译所有引用的子项目和本身?或者子项目知道如何构建自己,我以某种方式从主构建文件中调用子项目构建文件,并以某种方式将所有输出组装到主项目构建输出中?

我目前有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 

我在各分项工程使用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 
      ... 

回答

0

的回答你的问题当然是“看情况”。

你不说什么是你如何引用你的解决方案中的“子项目”,或者如果他们被其他解决方案(主项目)使用?他们是项目参考?如果是这样,那么不能打电话给MSBuild来构建解决方案。这将基于这些依赖关系构建所有子项目。我只能假设你是这样设置的。

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

如果你这样做,你会使用DLL引用。这将您的主项目中的子项目分离出来。这是我会走的路,特别是如果这些子项目被其他项目引用。

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

另外,如果您使用某些类型的配置项(如CC.Net),则不会提及。如果您确实需要修改任何子项目,可以触发重建主项目。

+0

库项目被其他“主”项目使用。他们是项目参考。 两件事情:1.图书馆经常变化。 2.我认为传统的看法是不要为你有源代码的东西存储二进制文件。 – User 2009-09-24 04:57:32

+0

这取决于。对于我来说,不要在一个以上的解决方案中引用一个项目。 我认为共享库不是主要项目的一部分。所以,就像把我的Crystal报告DLL放入svn一样,我也把我的内部框架DLL放在那里。此外,DLL引用使您可以更好地控制与每个项目一起使用的那个库的版本。当然,你可以做到以上,而不是把二进制文件放入svn。把他们放在网络共享上。 – PilotBob 2009-09-25 16:32:35

+0

“对于我而言,在多个解决方案中不参考项目会覆盖”我不确定我理解这一点。只是为了澄清,当我使用“项目”这个术语时,我的意思是说它在一般意义上不是在视觉工作室的意义上。所以在我看来,按照定义,一个类库“项目”(实际上是它自己的解决方案)旨在用于多个解决方案。 – User 2009-09-28 04:47:07