Как я могу избежать перекомпиляции кода, который не изменился? - PullRequest
0 голосов
/ 05 июля 2018

Мое рабочее место использует SVN, и я использую Git локально. Мой рабочий процесс включает в себя обновление из SVN, фиксацию в ветке Git "svn_only", а затем перебазирование моей текущей ветки по теме.

Все это говорит о том, что «измененные» временные метки в моих исходных файлах меняются довольно часто, даже если их содержимое на самом деле не изменилось. Это может привести к очень длительному времени компиляции, так как программа решает, что ей нужно собрать материал, который на самом деле имеет современные объектные и библиотечные файлы.

Я написал скрипт, который проходит через мой проект и обновляет «измененную» временную метку для каждого отдельного файла .lib, .exe, .lastbuildstate, .ilk, .pdb, .o и .tlog, до момента, когда Я запустил сценарий. Однако это никак не влияет на то, что, по его мнению, должно быть построено.

Я прочитал https://docs.microsoft.com/en-us/visualstudio/msbuild/incremental-builds,, в котором говорится

Элемент считается актуальным, если его выходной файл имеет тот же возраст или новее, чем его входной файл или файлы.

Если все выходные элементы обновлены, MSBuild пропускает цель. Эта инкрементная сборка цели может значительно улучшить скорость сборки. Если обновляются только некоторые файлы, MSBuild выполняет цель, но пропускает обновленные элементы и тем самым обновляет все элементы.

Так ... это должно сделать это, не так ли? Что мне не хватает? Должна ли быть метка времени «Создано» и «Изменено»?

е: вот моя текущая попытка. Это не дает желаемого эффекта, но я не знаю почему:

#!/bin/sh

if [ -z $1 ];then
  echo "Usage: $0 <commit hash> [<to commit hash (else head)>]"
  exit 1
fi

commit1=$1
commit2=$2

timestamp=`date --date yesterday +%Y%m%d%H%M.%S` #201807051536.54

git diff $commit1 $commit2 --name-only |  xargs --verbose -d '\n' touch -t$timestamp

Это действительно изменяет целевые файлы на вчерашнюю временную метку, но это лишь частично влияет на то, решит ли MSVC, что их нужно восстановить.

Со всем современным (недавно построенным), если я touch исходный файл, чтобы установить его метку времени вчера MSVC не компилирует это. Здорово. Если я просто touch установлю метку времени на текущее время, скомпилирует . Таким образом, временная метка исходного файла, очевидно, является одним из факторов, но не может быть единственным фактором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...