проблема
Как вы уже определили, вы действительно создали ситуацию Catch-22 здесь.
Вы не можете действительно поместить значимую информацию в файл version.num
, пока изменения не будут зафиксированы, и поскольку вы храните version.num
в хранилище, вы не можете зафиксировать изменения в хранилище, пока не заполните version.num
файл.
Мое решение
Я бы предложил следующее:
- Избавьтесь от хука "pre-commit" и
hg forget
файла version.num
.
- Добавьте
version.num
в файл .hgignore
.
Настройте version_gen.sh
, чтобы оно состояло из:
hg parent --template "r{node|short}_{date|shortdate}" > version.num
В make-файле убедитесь, что version_gen.sh
запущен до того, как version.num
используется для установки параметра версии.
Мои причины
Как @ Ry4an предлагает , получить систему сборки для вставки информации о ревизии в программное обеспечение во время сборки, используя информацию из Система контроля версий, является гораздо лучшим вариантом. Единственная проблема заключается в том, что вы пытаетесь скомпилировать код из hg archive
хранилища, где система сборки не может извлечь соответствующую информацию.
Однако я бы не хотел этого делать - в моей собственной системе сборки сборка не удалась, если не удалось извлечь информацию о редакции.
Также, как @ Кай Инкинен предлагает , использование ревизии номер не переносимо. Rev 21 на одной машине может быть 22 на другой. Хотя это может и не быть проблемой сейчас, это может произойти в будущем, если вы начнете сотрудничать с другими людьми.
Наконец, я объясняю причины, по которым мне не нравится расширение Keyword, в моем вопросе , касающемся аналогичных вопросов с вашим собственным вопросом:
Я посмотрел на расширение Mercurials Keyword, так как оно казалось очевидным решением. Однако чем больше я смотрел на это и читал мнения людей, тем больше приходил к выводу, что это было неправильно.
Я также помню проблемы, вызванные подменой ключевых слов в проектах предыдущих компаний. ...
Кроме того, я не особо хочу включать расширения Mercurial для завершения сборки. Я хочу, чтобы решение было автономным, чтобы приложение не могло быть случайно скомпилировано без информации о встроенной версии только потому, что расширение не включено или не установлено правильное вспомогательное программное обеспечение.
Затем в комментариях к ответу, который все равно предложил использовать расширение keyword
:
... Я отказался от использования расширения ключевого слова, поскольку было бы слишком легко получить строку «$ Id $», скомпилированную в исполняемый файл. Если бы расширение ключевых слов было встроено в Mercurial, а не в расширение, и включено по умолчанию, я мог бы рассмотреть это, но в его нынешнем виде это просто не будет надежным. - Марк Бут
А не думайте, что может быть более надежное решение. Что если кто-то случайно повредит .hg или соберет не из клона, а из архива? - Mr.Cat
@Mr.Cat - я не думаю, что может быть менее надежное решение, чем расширение ключевых слов. Везде, где вы явно не включили расширение (или кто-то отключил его), вы получите буквенную строку "$ID$"
, скомпилированную в объектный файл без жалоб. Если Mercurial или репозиторий повреждены (не уверен, что вы имели в виду), вам все равно нужно сначала это исправить. Что касается hg archive
, мое оригинальное решение не скомпилируется, если вы попытаетесь собрать его из архива! Это именно то, что я хочу, . Я не хочу, чтобы какой-либо источник компилировался в наши приложения, если он не находится под контролем версий! - Марк Бут