【问题标题】:Can a build system be version control aware?构建系统可以感知版本控制吗?
【发布时间】:2016-10-05 06:16:51
【问题描述】:

Make、ant、msbuild……我所知道的所有构建工具都会比较人工制品时间戳来决定是否需要重建。

在签出任何版本时,Git 会将源文件时间戳重置为“现在”,以告知构建系统:应该重建依赖于这些文件的人工制品。

但是:

$ git checkout old_version # retrieving a.cpp@old_version
$ make # building a.out from a.cpp
$ git checkout new_version # updating a.cpp@new_version
$ git checkout - # resetting a.cpp@old_version
$ make # ...

如果只有 make 可以确定 a.out 是使用 old_version 构建的,则可能相当于无操作。

有没有办法做到这一点?你知道有什么构建系统/版本控制系统可以这样配合吗?

【问题讨论】:

  • 也许 post-checkout 钩子可以提供帮助。

标签: git makefile version-control msbuild build-system


【解决方案1】:

完全依赖时间戳实际上是那些构建系统的缺陷。例如在以下情况下它会失败:

  1. 您想使用一组不同的编译器标志进行重建。
  2. 源和构建工件位于时钟不同步的不同文件系统上。
  3. 调整了时间戳以优化构建过程(就像您的情况一样),但这样做的方式会导致源视图不一致(即并非所有必须重建的东西都被实际重建)。

Make, ant, msbuild, ... 我所知道的所有构建工具比较 artefact 时间戳来决定是否需要重建。

看看scons。它与其他构建工具的显着区别之一是使用 MD5 签名可靠地检测构建更改。这意味着它为每个目标存储源的 MD5 哈希值和用于构建该目标的命令行。在重建目标之前,它会重新计算 MD5 哈希并知道是否需要重新编译。当然,它比仅仅查看时间戳要慢,但没有提到的问题。但是,scons 还为传统时间戳提供了可选的、可配置的支持

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多