Version control 我应该将生成的代码存储在源代码管理中吗

Version control 我应该将生成的代码存储在源代码管理中吗,version-control,code-generation,Version Control,Code Generation,这是我参加的一场辩论。我想得到更多的意见和观点 我们有一些在构建时生成的类来处理DB操作(在这个特定的例子中,使用亚音速,但我认为这对于这个问题不是很重要)。在Visual Studio中将生成设置为预生成步骤。因此,每次开发人员(或正式构建过程)运行构建时,都会生成这些类,然后将它们编译到项目中 现在有人声称,如果您得到的代码与您自己的环境中生成的代码不匹配,那么将这些类保存在源代码管理中可能会导致混乱 我想有一种方法来追溯代码的历史,即使它通常被视为一个黑匣子 有争论或反驳吗 更新:我问这

这是我参加的一场辩论。我想得到更多的意见和观点

我们有一些在构建时生成的类来处理DB操作(在这个特定的例子中,使用亚音速,但我认为这对于这个问题不是很重要)。在Visual Studio中将生成设置为预生成步骤。因此,每次开发人员(或正式构建过程)运行构建时,都会生成这些类,然后将它们编译到项目中

现在有人声称,如果您得到的代码与您自己的环境中生成的代码不匹配,那么将这些类保存在源代码管理中可能会导致混乱

我想有一种方法来追溯代码的历史,即使它通常被视为一个黑匣子

有争论或反驳吗


更新:我问这个问题,因为我真的相信有一个明确的答案。看看所有的回答,我可以高度肯定地说,没有这样的答案。决策应基于多个参数。阅读下面的答案可以很好地指导你在决定这个问题时应该问自己的问题类型


出于上述原因,我现在不会选择一个可接受的答案。

将其置于源代码控制中。将您编写的所有内容的历史记录提供给未来的开发人员的好处超过了在同步后偶尔重建的小痛苦

我会支持你。如果您使用的是一个连续集成过程,该过程检查代码、修改版本号、构建软件并对其进行测试,那么将代码作为存储库的一部分就更简单、更容易了


此外,它是您从软件存储库中获取的每个“快照”的一部分。如果它是软件的一部分,那么它就应该是存储库的一部分。

将其保存在源代码管理中是一件麻烦事,不值得这么做

您必须在每次构建时进行提交,以使其具有任何价值


通常,我们将生成的代码(idl、jaxb之类的东西)放在我工作的源代码管理之外,这从来都不是问题

每当我想在自己的个人repo上显示对源代码树的更改时,所有“生成的文件”都会显示为已更改,需要修改

我希望有一个更清晰的修改列表,只包括执行的真实更新,而不是自动生成的更改


删除它们,然后在构建之后,在每个生成的文件上添加一个“忽略”。

我认为您应该避免向源代码管理添加任何生成的代码(或其他工件)。如果生成的代码与给定输入的代码相同,那么您只需签出要区分的版本,并生成代码进行比较。

我真的认为您不应该签入它们


当然,生成的代码中的任何更改都可能是噪声-环境之间的更改,或者是其他原因导致的更改-例如,数据库中的更改。如果数据库的创建脚本(或任何其他依赖项)在源代码管理中,那么为什么还需要生成的脚本呢?

一般规则是,但如果生成代码需要时间(由于数据库访问、web服务等原因)然后,您可能希望在源代码管理中保存一个缓存的版本,并为每个人省去痛苦

您的工具还需要意识到这一点,并在需要时处理从源代码管理中签出的问题,因为太多的工具决定无缘无故地从源代码管理中签出。
一个好的工具将使用缓存的版本,而不接触它(也不修改文件上的时间步长)


此外,您还需要在生成的代码中添加大的警告,以便人们不要修改该文件,顶部的警告是不够的,您必须每十几行重复一次。

我称之为干燥原则。如果存储库中已有用于在生成时生成这些代码文件的“源文件”,则无需“两次”提交相同的代码


此外,如果某一天代码生成中断,您可以通过这种方式避免一些问题。

我想说是的,您希望将其置于源代码管理之下。从配置管理的角度来看,用于生成软件构建的所有内容都需要控制,以便可以重新创建。我知道生成的代码可以很容易地重新创建,但是可以证明它是不同的,因为两个构建之间的日期/时间戳是不同的。在一些领域,如政府,他们需要很多时间,这就是我们要做的。

我们也不存储生成的DB代码:因为它是生成的,所以您可以在源文件的任何给定版本中随意获取它。存储它就像存储字节码之类的东西


现在,您需要确保在给定版本中使用的代码生成器可用!较新版本可以生成不同的代码…

这样看:您是否将目标文件签入源代码管理?生成的源文件是构建工件,就像对象文件、库和可执行文件一样。他们应该受到同样的对待。大多数人认为,您不应该将生成的对象文件和可执行文件检查到源代码管理中。相同的参数适用于生成的源

如果需要查看生成文件的历史版本,可以同步到其源的历史版本并重新生成


将生成的任何类型的文件检查到源代码管理中类似于数据库非规范化。偶尔会有这样做的理由(通常是为了性能),但这样做必须非常小心,因为一旦数据被非规范化,就很难保持正确性和一致性。

在一些项目中,我将生成的代码添加到