Java Subversion中二进制文件的替代方案

Java Subversion中二进制文件的替代方案,java,svn,Java,Svn,我的一些同事相信,将构建人工制品提交到subversion存储库是一个好主意。其理由是,通过这种方式,在测试机器上安装和更新很容易——只需“svn up” 我相信有很多重要的论据反对这种不良做法,但我能想到的都是“它占用了更多的空间”之类的蹩脚论据。不这样做的最佳、致命的理由是什么?我们应该采取什么其他方法来代替呢 这是针对Java代码的,如果这有区别的话。所有内容都是从Eclipse编译的(没有自动的PDE构建) 当我说添加构建工件时,我的意思是提交将如下所示: "Added the new

我的一些同事相信,将构建人工制品提交到subversion存储库是一个好主意。其理由是,通过这种方式,在测试机器上安装和更新很容易——只需“svn up”

我相信有很多重要的论据反对这种不良做法,但我能想到的都是“它占用了更多的空间”之类的蹩脚论据。不这样做的最佳、致命的理由是什么?我们应该采取什么其他方法来代替呢

这是针对Java代码的,如果这有区别的话。所有内容都是从Eclipse编译的(没有自动的PDE构建)

当我说添加构建工件时,我的意思是提交将如下所示:

"Added the new Whizbang feature"

 M src/foo/bar/Foo.java
 M bin/Foo.jar

每个代码更改都有相应的生成jar文件。

您的意思是在同一存储库中有源代码和生成结果吗

这是日常构建的一个很好的论据,版本化的构建脚本位于单独的存储库中。存储库中的二进制文件本身并不坏,但源代码+构建结果在我看来很糟糕

如果您构建了多个二进制文件,但没有注意到某个地方的构建中断,那么您最终会得到来自不同版本的二进制文件,并且您正在为一些微妙的bug追踪做好准备


提倡每日独立版本的自动构建脚本,而不仅仅是针对二进制文件+代码

像这样的持续集成服务器能够归档构建工件。“为什么不”对你的论点没有帮助,但至少它是一种选择。

  • Subversion是源代码管理器->二进制文件不是源代码
  • 如果您使用“svn up”命令更新产品,所有具有提交权限的开发人员都可以更新/修改/中断产品

备选方案:使用哈德逊或巡航控制等连续集成。

一个很好的理由是在新机器上快速运行一个可执行文件。特别是如果构建环境需要一段时间来设置。(加载编译器、第三方库和工具等)

在我看来,代码存储库应该只包含源代码以及编译此源代码所需的第三方库(在构建过程中,也可以使用某些依赖关系管理工具检索第三方库)。生成的二进制文件不应与源代码一起检入

我认为您的问题在于没有适当的构建脚本。这就是为什么从源代码构建二进制代码需要一些工作,比如启动eclipse、导入项目、调整类路径等等

如果有构建脚本,可以使用以下命令获取二进制文件:

svn update; ant dist
我认为不将二进制文件与源文件一起签入的最重要原因是存储库的最终大小。这将导致:

  • 存储库更大,版本控制系统服务器上的空间可能太少
  • 版本控制系统服务器和客户端之间存在大量流量
  • 更长的更新时间(假设您从internet执行SVN更新…)
另一个原因可能是:

  • 源代码很容易比较,所以版本控制系统的许多特性都是有意义的。但是你不能轻易地比较二进制文件

在我看来,上述方法也会带来很多开销。如果开发人员忘记更新相应的jar文件怎么办?

根据我的经验,在SVN中存储jar可能会导致混乱。
我认为最好将Jar文件保存在Maven存储库中,如。

这也有好处,您可以使用依赖管理工具,如Maven或Ivy。

二进制文件,尤其是您自己的,但也是第三方的,在SVN这样的源代码管理工具中没有位置

理想情况下,您应该有一个构建脚本来构建您自己的二进制文件(然后可以使用许多优秀的自动构建工具中的一个实现自动化,这些工具可以直接从SVN检查源代码)

对于第三方二进制文件,您需要像Maven2这样的依赖项管理工具。然后,您可以设置一个本地Maven存储库来处理所有第三方二进制文件(或者仅仅依赖公共二进制文件)。本地repo还可以管理您自己的二进制文件

我肯定有重要的论据 反对这种不良做法

您错误地认为将“构建工件”提交到版本控制是个坏主意(除非您的问题措辞错误)。事实并非如此

在版本控制中保留您所称的“构建工件”是可以的,而且确实非常重要。除此之外,您还应该保留编译器和其他用于将源文件集转换为成品的工具

从现在起的五年内,您肯定会使用不同的编译器和不同的构建环境,无论出于何种原因,这些编译器和构建环境可能无法编译今天版本的项目。修复遗留版本中的bug可能是一个简单的小改动,但这会变成一场噩梦,将旧软件移植到当前的编译器和构建工具,只需重新编译一行改动过的源文件

所以,您没有理由如此害怕在版本控制中存储“构建工件”。你可能想做的是把它们放在不同的地方

我建议将它们分开,如:

 ProjectName
 |--- /trunk
 |    |--- /build
 |    |    |--- /bin        <-- compilers go here
 |    |    |--- /lib        <-- libraries (*.dll, *.jar) go here
 |    |    '--- /object     <-- object files (*.class, *.jar) go here
 |    '--- /source          <-- sources (*.java) go here
 |         |--- package1    <-- sources (*.java) go here
 |         |--- package2    <-- sources (*.java) go here
ProjectName
|---/行李箱
||--/build

|| |--/bin检入重要二进制文件违反了源代码/SVN的使用原则,即源代码管理中的文件应具有有意义的差异属性

今天的源文件与昨天的源文件有很大不同;差异将产生一组对人类读者有意义的变化。今天的办公室正面图片与昨天的办公室图片相比,并没有明显的差别

因为像图像这样的东西不具备差异的概念,为什么要将它们存储在一个