首先,Subversion(以及现在的所有其他版本)不是源代码控制管理器(我一直认为SCM意味着软件配置管理),而是版本控制系统。这意味着它们存储了对你存储在其中的内容的更改,它不必是源代码,它可以是图像文件,位图资源,配置文件(文本或xml),各种东西。构建的二进制文件不应被视为此列表的一部分的原因只有 1 个,这是因为您可以重新构建它们。
但是,想想为什么还要将已发布的二进制文件存储在那里。
首先,它是一个帮助您的系统,而不是告诉您应该如何构建应用程序。让计算机为你工作,而不是反对你。因此,如果存储二进制文件占用空间怎么办 - 您拥有数百千兆字节的磁盘空间和超快速的网络。将二进制对象存储在那里已经不是什么大不了的事情了(而十年前它可能是一个问题 - 这也许就是为什么人们认为SCM中的二进制文件是一种不好的做法)。
其次,作为开发人员,您可能习惯于使用系统来重建应用程序的任何版本,但可能使用它的其他人(例如qa,test,support)可能不会。这意味着你需要一个替代系统来存储二进制文件,实际上,你已经有了这样一个系统,它是你的SCM!利用它。
第三,您假设您可以从源代码重建。显然,您将所有源代码存储在那里,但您没有存储编译器,库,sdk以及所需的所有其他依赖项。当有人走过来问我“你能为我构建我们2年前发布的版本吗,客户对那个版本有问题”时会发生什么。2年是永恒的,你甚至有你当时使用的编译器吗?当您签出所有源代码后发现新更新的 sdk 与您的源代码不兼容并失败并出现错误时,会发生什么情况?您是否擦除了开发框并重新安装了所有依赖项以构建此应用程序?你还记得所有的依赖关系是什么吗?!
最后一点是最重要的一点,为了节省几k的磁盘空间,你可能会花费自己几天甚至几周的痛苦。(Sod定律还说,无论你需要重建哪个应用程序,都将是最晦涩难懂的,难以设置的依赖关系的应用程序,你曾经很高兴摆脱)
因此,将二进制文件存储在SCM中,不要担心琐事。
PS.我们将每个项目的所有二进制文件都放在它们自己的“release”目录中,然后当我们想要更新机器时,我们使用一个特殊的“setup”项目,该项目仅由svn:externals组成。导出安装项目,您就完成了,因为它提取了正确的内容并将其放入正确的目录结构中。