我计划从现有的代码库中用Java创建3个版本的软件。什么是最佳做法?我应该为每个版本创建一个不同的项目吗?还有用于管理版本的任何工具吗?
答案 0 :(得分:1)
我的第一个想法是尽可能保留单个代码库并使用某种标志进行切换。
如果不可能的话,我会尝试保持尽可能多的相同,并让较大的项目使用较小的项目作为子项目,如果可能的话自动启用某些功能 - 例如,每个项目都可以拥有它自己的主,不同的构建可能只调用设置标志以启用功能的不同主电源。
如果您的旗帜是最终的,它甚至应该避免将不必要的代码拉入您的项目中。
最后,最糟糕的情况是,Subversion中有3个分支。
编辑:
你让我对此有了更多的考虑,我认为我找到了更好的解决方案。
我想我会把它分成四个项目,将所有“常见”的东西组合成一个基础项目和不同的东西,我会扩展到其他三个项目 - 所以让我们说你有基础,演示,薪酬和商业项目..
如果三者可能不同,您将从其中一个演示/付费/业务类提供该功能。例如,如果付费版本具有新菜单项,则您的某个对象中可能包含getMenuItems。它将返回一个菜单树,您可以将其放在菜单栏中。演示版本的项目会少一些。
通过这种方式,你的“Base”永远不知道它正在运行哪个版本,它只是使用对象。
为了得到物品,我有一个工厂。工厂看起来像这样:
private String[] availablePackages={"business", "pay", "demo"};
public getMenuClass() {
Class c;
for(String package : availablePackages) {
try {
c=Class.forName("com.meh.myapp."+package+".MenuClass");
} catch... {
// No package by that name
}
if(c != null) {
return c.newInstance();
}
}
// Something went wrong, no instance found.
上升气流是你应该首先尝试实例化com.meh.myapp.business.MenuClass,然后尝试... pay.MenuClass finally ... demo.MenuClass。
这应该允许您通过简单地运送不同的罐子来改变您的配置 - 如果您决定只运送演示和主罐子,您将获得一个演示应用程序。通过运送薪水罐,您将获得付费应用程序。
请注意,您很可能希望企业将其大部分工作委托给“付费”,并“付费”将其大部分工作委托给“演示”,但演示知道没有业务或支付,而“主”只反映其他三个人。
这将是一个很好的解决方案,因为不需要配置 - 实际上,您只需要运送pay jar来从demo升级到pay,主要和演示罐都可以重复使用并保持在他们所在的位置
答案 1 :(得分:0)
理想的方法是将您的应用划分为“核心”,“其他内容”,“更多其他内容”并将这些依赖项组合在一起。不过,根据您的代码库,这可能会有很多工作。
如果使用SVN进行源代码管理,则可以从现有代码库为每个版本创建3个分支。一般人们试图避免这种情况,例如如果您需要修复这些分支中的常见错误,则需要在其中一个分支中修复该错误,然后将其合并到其余分支。也许其他源代码库可以更好地处理这种情况,但对于SVN,我想这是唯一的方法。
至于管理版本,我们使用maven。如果你采用“核心”,“附加内容”,“更多附加内容”方法,maven可以提供帮助,因为它可以非常干净地跟踪每个组件的版本(使用pom)。
编辑:比尔的建议可能是最实用的。如果你使用final标志,那么编译器应该抛弃无法访问的代码。