Автоматический идентификатор сборки - PullRequest
6 голосов
/ 02 января 2009

Мы ищем способ автоматического включения какого-либо идентификатора сборки в наши сборки. Это должно быть переносимым (VC ++, g ++ в Linux и Mac) и автоматическим. VC ++ - это то, что важнее всего, поскольку в других средах мы используем собственные сценарии сборки Python, поэтому я могу делать все, что захочу.

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

Мы также могли бы использовать __DATE__, но мы не можем гарантировать, что файл, который использует __DATE__ (т.е. записывает его в файл журнала), будет скомпилирован, если какой-либо другой файл будет изменен - ​​за исключением того, что мы «дотронемся» до него , но тогда мы заставили бы проект быть всегда устаревшим. Мы могли бы коснуться его в качестве шага перед сборкой, так что к нему можно было бы прикоснуться только в том случае, если остальная часть проекта устарела, что не приведет к ложной компиляции, но если VC ++ вычисляет зависимости до до шаг сборки, это не сработает (файл с __DATE__ не будет скомпилирован)

Есть интересные идеи?

Ответы [ 6 ]

9 голосов
/ 02 января 2009

Мы используем вывод svnversion, записанный в файл заголовка и включенный. Мы опускаем файл из хранилища и создаем его на этапе предварительной сборки; это хорошо сработало для нас. (Я не уверен, почему вы возражаете против использования шага перед сборкой?)

В настоящее время мы используем сценарий Perl для преобразования вывода svnversion в файл заголовка; Позже я узнал, что TortoiseSVN включает команду subwcrev (которая также была портирована на Linux), которая может делать то же самое.

4 голосов
/ 02 января 2009

Если вам не нравится идея включения файла, не входящего в систему контроля версий, который требуется для сборки, рассмотрите пакетный файл или другой шаг сборки, который программно создает файл / include и вызывает svnversion в процессе сборки.

в основном СОЗДАЙТЕ файл, чтобы у вас не было версионного и обязательного файла.

EDIT Subwcrev Джоша, вероятно, лучшая идея.

До того, как это было реализовано, я написал свой собственный хакерский инструмент, чтобы сделать то же самое - сделать замену в файле шаблона.

3 голосов
/ 02 января 2009

Это может быть просто:

% make -DBUILD_NUMBER=`svnlook youngest /path/to/repo`
2 голосов
/ 02 января 2009

Я бы посмотрел на SvnRev . Вы можете использовать его как пользовательский этап предварительной сборки в VS, или вызывать его из make-файла, или из того, что вам нужно сделать, и он генерирует заголовочный файл, который вы можете включить в другие файлы, которые дадут вам то, что вам нужно , На сайте хорошая документация.

SubWCRev - это еще один вариант, хотя порт Linux новее, и я не знаю, существует ли версия для Mac. Это очень полезно в Windows для .NET (я полагаю, это не проблема для вас, но я добавляю это для дальнейшего использования), потому что это позволяет вам создать файл шаблона, который можно использовать для Например, файл свойств для сборки .NET.

0 голосов
/ 02 января 2009

Автоматическая сборка обычно может быть полной, чистой сборкой. В этом случае вы начинаете с чистого каталога, и в любом случае не будет проблем с __DATE__. В противном случае, см. Идею Пола Бекинхэма.

0 голосов
/ 02 января 2009

Почему бы не привязать GUID к нему, почти каждый язык имеет поддержку для его генерации, или, если у вас его нет, есть множество алгоритмов для этого.

(Хотя, если вы используете subversion, мне лично идея Джоша больше нравится!)

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