【问题标题】:Using LESS and Version Control: Should generated CSS be included in a repo?使用 LESS 和版本控制:生成的 CSS 是否应该包含在 repo 中?
【发布时间】:2025-12-14 04:30:01
【问题描述】:

我正在考虑将 LESS 用于带有服务器(或开发)端处理的 CSS 开发,但我无法决定是否应将生成的 CSS 文件保留在版本控制中。有很多带有钩子的解决方案,但这会增加对服务器的软件依赖。可以在本地添加一个钩子,这样网络上的暂存区和生产区就会得到相同的文件。所以,问题是:

生成的 CSS 文件是否应该包含在版本控制中?请记住,某些框架出于特定原因需要 CSS 文件(即 WordPress 主题需要 style.css 文件才能被识别)。

当我说“考虑使用 LESS”时,我的意思是它成为了一项要求。在选择 LESS 后,新开发人员将无法选择使用 vanilla CSS。

【问题讨论】:

    标签: css version-control less


    【解决方案1】:

    签入派生工件几乎总是次优的。

    我对签入 .css 投反对票。您的同行或继任者之一签入对 .css 而不是 .less 的编辑只是时间问题。然后,当您更改 .less 时,先前的更改将丢失。

    【讨论】:

    • 我建议用最后一行来引导答案。会让答案更好一点。
    • 你的意思是不签入.css?
    • 这是我担心的一个问题。开发人员编辑 CSS 但不是 LESS,然后签入更新的(先前生成的)CSS 文件。预提交钩子甚至会删除所做的所有更改。感谢您的意见。
    【解决方案2】:

    您几乎已经回答了自己的问题。这取决于您如何部署网站。

    如果服务器只是直接从 Git 存储库中拉取数据:

    1) 需要安装软件才能从 LESS 生成 CSS。

    2) 或者您需要在存储库中包含 CSS 文件。

    如果您不是直接从 Web 服务器上的存储库中提取,您可以有一个构建脚本,从 git 中提取,生成 CSS,然后将内容传输到 Web 服务器,可能会排除不必要的文件转移。

    在我看来,应该使用 Git 来保留项目的所有源代码,而不是任何“派生工件”(如 @thekbb 所述)。开发人员需要安装所有工具以在开发和测试期间生成这些派生工件。为了部署到测试和生产服务器,自动构建服务器应该获取源并只创建分发所需的文件。

    在软件开发的情况下,您的 Git 存储库中有一个包含 .C 和 .H 文件(例如)的 Makefile。开发人员和构建服务器安装了一个编译器,它将创建一个可执行或编译的库。当文件打包分发时,源代码不是存档的一部分。

    对于 Web 开发,您拥有原始图形、HTML 模板和 LESS 文件等源文件。开发人员和构建服务器可以运行脚本来生成站点资产(来自 LESS 文件的 CSS、来自模板的静态 HTML 页面、多种尺寸/格式的扁平化图像等)。当构建服务器部署新构建时,它只复制所需的文件由服务器提供,不包括源图形、模板和 LESS 文件。

    如果有人需要查看网站内容,他们应该在临时服务器上进行。如果这不可行,自动构建服务器可以在内部服务器上创建一个 ZIP 文件,他们可以下载以供查看。

    【讨论】:

    • 这是一个很好的答案,但是如果您使用的框架需要像 WordPress 这样的 CSS 文件,您认为哪种选择是最佳选择?
    • 查看我认为最佳的更新答案。基本上是@thekbb 所说的:不要将派生的工件存储在您的存储库中。
    【解决方案3】:

    生成的 CSS 文件是否应该包含在版本控制中?

    理论上它们不应该,但为了实用性,我通常会检查生成的 css 文件。原因是它简化了部署,因为我使用 git 进行部署;我不需要在服务器上安装较少的编译器,通常甚至不需要在我正在部署的机器上(与我正在开发的机器相反)。如果您有单独的开发人员和部署人员,这样做可能会很有用,但有时即使您自己部署也很有用。

    现在,这样做有一些缺点:

    1. 你不能使用git add --patch(或者你真的需要非常小心这样做)
    2. 您不应直接修改 .css;相反,我通常使用辅助 .css 文件进行较小的修改,而无需修改主 .less 或 .css 文件。您还可以将 .less 文件直接编译为缩小的 css,以减少修改生成的 css 的诱惑力。
    3. 开发人员必须将他们的机器设置为使用自动重新编译工具(如 SimpLess 或 Less.app),因此 .css 文件在保存到 .less 文件后会立即更新。如果没有自动化,您将面临 css 与签入的 less 文件不匹配的风险。

    从 .C 和 .H 文件编译时我不会这样做,因为为它们生成的二进制文件是特定于平台的,而且 .less/.css 文件通常是较大 Web 项目的一小部分,所以附加文件的空间开销很小。

    【讨论】:

      【解决方案4】:

      好问题。如果您可以绝对保证在更新 LESS 时更新 CSS 文件,那么可能是的 - 根据@Scott Simpson 的评论。我怀疑这很难保证,当新开发人员在不同步的那一天获得 CSS 的副本时会发生什么?另外,当然,我最初并没有想到这一点,如果新开发人员随后对 CSS 文件而不是 LESS 进行更新会发生什么?如果必须构建 CSS 并且它不是存档的一部分,我可以看到更少的问题。

      【讨论】:

      • 您提出了很好的观点,但如果将会发生什么问题重新表述为可能的不足之处,它可能会更好地作为答案。
      【解决方案5】:

      我会说是的——因为如果您想将开发人员添加到您的工作流程并且他们不想或不需要构建 .Less,会发生什么?让他们只访问生成的文件会很有帮助。

      【讨论】:

      • 您可以使用相同的参数来提交其他构建工件,例如可执行文件或 DLL。理论上,每个人至少都安装了相同的工具链和生成所有工件的构建脚本。
      • @Scott - 如果使用 LESS,项目将需要 LESS。
      • @R0MANARMY 特别不是同一个论点。这取决于您是否关心您选择的版本控制处理许多流行的 VCS 不处理的二进制数据。我指的是所有文本数据。