2016-10-05 79 views
1

Make,ant,msbuild,...我知道的所有构建工具比较artefact 时间戳决定是否需要重建。构建系统可以识别版本控制吗?

当检出任何版本以告诉构建系统时,Git会将源文件时间戳重置为'now':应该重建取决于这些文件的artefact。

但是:

$ git checkout old_version # retrieving [email protected]_version 
$ make # building a.out from a.cpp 
$ git checkout new_version # updating [email protected]_version 
$ git checkout - # resetting [email protected]_version 
$ make # ... 

可以等同于一个空操作,如果仅使能确定a.out已建成old_version。

有没有办法实现这个?你知道任何可以这种方式合作的构建系统/版本控制系统吗?

+0

也许'结账后'挂钩可以帮助。 – ElpieKay

回答

1

专门依赖时间戳实际上是这些构建系统的一个缺陷。它在以下情况下失败:

  1. 您希望使用一组不同的编译器标志进行重建。
  2. 源和构建工件驻留在具有不同步时钟的不同文件系统上。
  3. 时间戳调整是为了优化构建过程(就像你的情况一样),但它是以一种导致源不一致的方式完成的(即不是所有必须重建的东西都被实际重建)。

制作,蚂蚁,MSBuild的,...所有的编译工具,我知道比较假象 时间戳来决定重建的需要。

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