我有几个共享常见模块的python项目.到现在为止,我已经......咳嗽......保留公共代码的多个副本并手动同步.但我显然更愿意做别的事情.
它现在在我看来,好像zc.Buildout可能是我需要的.我想我应该做的是将我系统的每个可重用组件放入一个单独的egg中,然后使用buildout将它们组装到项目中.
我也在想,对于任何特定的模块,我应该将单元测试放入一个单独的包或蛋中,这样我就不会在每个项目中安装组件的单元测试副本.我只想在我的库开发的地方进行单元测试,而不是在刚刚使用的地方.
所以也许我想要这样的东西
projects lib1 tests code lib2 tests code app1 tests appcode app2 tests appcode
等等
app1和app2都是独立的应用程序,有自己的代码和测试,但也包括和使用lib1和lib2.和lib1/test,lib1/code,lib2/test,lib2code,app1,app2是分开的鸡蛋.这听起来不错吗?
但是,我现在感到困惑.我假设当我开发app1时,我希望buildout将lib1,lib2和app1的副本放到一个单独的工作目录中,而不是直接将这些库的副本放在app1下.但是,这如何与我的SVN源代码控制一起使用?如果使用buildout动态构造工作目录,它不能是一个实时SVN目录,我可以从中检查更改回存储库?
我是否误解了如何使用buildout?我会更好地采用完全不同的方法吗?如何在项目之间混合源代码控制和模块重用?
更新:感谢两位目前已回答此问题的人.我正在尝试更多这个.
不要将测试与代码分开,需要将两者紧密结合在一起.这并不是说测试占用了那么多的磁盘空间或任何内存!测试对您的图书馆用户非常有益.
对于库包,请在包中包含一个buildout.cfg
和一个bootstrap.py
文件,以便轻松运行测试.例如,参见plone.reload包 ; 请注意它如何使用zc.recipe.testrunner部件创建一个测试脚本,该脚本将自动发现您的测试并运行它们.这样您就可以确保始终测试您的库包!
然后,您的应用程序包只需要测试集成和特定于应用程序的代码.再次,将测试包含在包本身中,您希望在处理代码时不要忘记测试.使用zc.recipe.testrunner
buildout中的部件来发现和运行这些部件.
最后但并非最不重要的是,使用mr.developer来管理您的包.使用mr.developer,您可以将包检出作为它们的工作,或者如果您不需要处理代码,则可以依赖已发布的版本.一个更大的项目将有许多依赖项,其中许多不需要你调整代码.使用mr.developer,您可以随意提取源代码并将其转换为开发阶段,直到您释放该代码为止,您可以再次解除签出.
要查看此类项目构建的实际示例,请参阅Plone核心开发构建.
该sources.cfg
文件包含各种软件包的SCM位置列表,但在您明确激活计划处理的软件包之前,通常会使用已发布的egg版本.checkouts.cfg
列出默认签出的所有包裹; 这些软件包的更改将成为下一版Plone的一部分,尚未发布.如果您使用Plone,您需要这些,因为您不能忽略这些更改.并testing.cfg
列出了需要测试,如果你想测试的Plone,一个大名单的所有软件包.
请注意,Plone的来源来自各种各样的地方.一旦开始使用buildout和mr.developer来管理包,您就可以随时随地提取源代码.