缩小的CSS是否应该存储在Git中?


10

我使用Gulp从我正在处理的项目的SASS代码中生成缩小的CSS。

我想知道从Git上线时重新生成此缩小的CSS是否被认为是最佳实践...

要么

要将缩小的CSS文件存储在Git中,以便将它们自动实时发布到生产环境,而无需服务器方面的进一步工作?

我很感谢人们对此的想法。谢谢!


缩小的CSS / js / etc只有一个地方。应该存储:/dev/null
R .. GitHub STOP HELPING ICE

(这是因为您的Web服务器完全具备使用压缩传输的能力。)
R .. GitHub停止帮助ICE

同时存储压缩和未压缩的CSS意味着您现在拥有同一事物的两个版本。哪个是规范版本?可以很容易地设想一个开发人员更新压缩的CSS而另一个更新未压缩的CSS的场景。您的两个资产现在已经分开。当然,过程应该避免这种情况,但是这是现实的前景,例如,团队中有新开发人员。
Qwerky

Answers:


13

“这取决于。” 对于正常的开发跟踪,没有。但是,对于云和DevOps部署,这通常很方便,甚至是必需的。

在大多数情况下, @ptyx是正确的。确实,他的“不”可以更加强调。像“不,不!天哪! ”之类的东西

为什么不将缩小或压缩的资产存储在Git等源代码控制系统中?

  1. 它们几乎可以通过您的构建过程从源代码快速地重新生成。存储压缩资产基本上是将相同的逻辑内容存储两次。它违反了“不要重复自己”(又称DRY)原则。

  2. 从哲学上讲却不那么实际,但更实际的原因是,最小化/优化的资产在存储在Git中时可压缩性很差。源代码控制系统通过识别所存储的每个文件的不同版本之间的更改(“增量”)来工作。为此,他们会将最新文件与先前版本“差异化”,并使用这些增量来避免存储文件每个版本的完整副本。但是,在“最小化/优化”步骤中进行的转换通常会消除差异/增量算法使用的相似点和航路点。最简单的例子是删除换行符和其他空格。由此产生的资产通常只是一条长线。Web构建过程的许多部分,例如BabelUglifyJSBrowserifyLessSass / SCSS积极地改变资产。它们的输出是微扰的。较小的输入变化会导致输出的重大变化。结果,diff算法经常会相信每次都看到几乎完全不同的文件。结果,您的存储库将更快地增长。您的磁盘可能足够大,网络也足够快,这不是一个大问题,尤其是如果有必要将缩小/优化的资产存储两次的话-尽管基于第1点,多余的副本可能只是100%没有意义肿。

但是,有一个主要例外:DevOps /云部署。许多云供应商和DevOps团队使用Git和类似工具不仅跟踪开发更新,而且还积极部署其应用程序和资产以测试和生产服务器。在这个角色中,Git能够有效确定“哪些文件已更改?”的能力。与更精确地确定“每个文件中发生了什么变化”一样重要。如果Git必须为缩小/优化的资产做几乎完整的文件副本,那会比原本要花费更长的时间,但是没什么大不了的,因为它仍然做得很好,有助于避免在每个项目上都复制“项目中的每个文件”部署周期。

如果您将Git用作部署引擎,则在Git中存储最小化/优化的资产可能会从“否”切换。令人满意。的确,例如,如果您在要部署到的服务器/服务上缺少可靠的构建/后处理机会,则可能需要这样做。(在这种情况下,如何对开发和部署资产进行分段是一个单独的蠕虫罐。到目前为止,足以知道可以通过几种方法进行管理,包括使用单个统一存储库,多个分支,子存储库,甚至多个重叠存储库。 )


1
这次真是万分感谢!非常感激。我将其标记为答案,因为它似乎要好得多了。
康纳·葛尼

1
git不只存储增量。SVN可以,但是git使用更复杂的机制来存储文件。有人告诉您它存储了每个文件的完整副本,但是据我了解,这也是不正确的。我不会尝试了解它的作用,因为我自己还不清楚。
jpmc26 '16

我认为您可以通过以下方式实现细微差别:“仅将新的增量存储”为类似于“,并使用这些增量以避免存储文件的每个版本的完整副本”。这将使您的观点正确无误,并避免研究任何给定的源代码控制系统如何完成此问题。
jpmc26 '16

DevOps可以仅使用git挂钩来自动触发已部署服务器上的缩小,从而获得两全其美吗?
Buttle Butkus

@ButtleButkus取决于部署的服务器上的。要依赖于后挂钩,您必须1 /假设目标上存在适当的编译器,压缩程序和优化程序,或者2 /在运行后挂钩之前加载它们。1 /是骰子。2 /在每次部署中都会带来负载成本/延迟。它还引入了新的可能的故障模式,以及在远程,不透明,瞬态环境中调试后挂接的要求。不理想。因此,钩子不是万灵丹。预先转换/优化资产可能不方便,但功能强大且实用。
乔纳森·尤尼斯

17

没有。

源代码控制只能包含源代码。如果它是从源代码生成的,那么它就不属于那里-应该由您的构建过程生成。

您不希望获得源代码来控制中间构建工件的根本原因是,如果您这样做了,那么很难相信正在运行的内容是来自刚刚修改的源,还是来自您未能重建的中间产品。


3
像对待可执行代码一样思考生成的代码。
candied_orange

3
这个原则并不总是正确的。如果您有使用重量级工具生成的文件,那么您就不能指望用户拥有它,那么将生成的文件放入git可能是有意义的。因此,许多人甚至将生成的autoconf configure脚本放入git中。
R .. GitHub STOP HELPING ICE

@R ..:理想情况下,您需要为这些事情维护一个单独的工件存储库,但是现实很少是理想的。
凯文

@R您可以妥协-就是这样。而且在CSS缩小的情况下,我认为这些工具不算是“重量级”,“慢速”或“不便”。另外,还有其他的依赖项注入机制(maven,ivy ...)可以很好地工作,并且不需要您将生成的代码放入源代码管理中。
ptyx

1
@ButtleButkus我在devops案上没有很多专业知识。我所看到的是git用作(非常方便和灵活的)传输/发布/部署机制,而不是纯粹用作源代码控制。除非“源” git和“交付” git是分开的(单独的仓库或单独的分支),否则这意味着您必须在某种程度上折衷source-> build-> deliverable链-例如,您最终将获得具有源代码的产品以及其他分支机构,以及使用未使用的二进制产品进行开发。这是一个务实的妥协,但我更愿意在可能的情况下分开考虑。
ptyx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.