Исходная проблема
При создании наших проектов я хочу, чтобы mercurial id каждого репозитория был встроен в продукт (ы) этого репозитория (библиотека, приложение или тестовое приложение).
Я считаю, что это намного упрощает отладку приложений, запускаемых клиентами за 8 часовых поясов, если вы точно знаете, что пошло на создание конкретной версии приложения, которое они используют.Таким образом, каждый проект (приложение или библиотека) в наших системах реализует способ получения соответствующей информации о ревизии.
Я также считаю очень полезным иметь возможность видеть, было ли приложение скомпилировано с чистой (неизмененные) ревизии из репозитория.«Hg id» полезно добавляет «+» к идентификатору набора изменений, когда в репозитории есть незафиксированные изменения, так что это позволяет нам легко увидеть, работают ли люди с чистой или измененной версией кода.
Мой текущийРешение подробно описано ниже и удовлетворяет основным требованиям, но с ним возникает ряд проблем.
Текущее решение
В настоящее время к каждому решению Visual Studio я добавляюследующие команды «Предварительная сборка события командной строки»:
cd $(ProjectDir)
HgID
Я также добавляю файл HgID.bat в каталог проекта:
@echo off
type HgId.pre > HgId.cs
For /F "delims=" %%a in ('hg id') Do <nul >>HgID.cs set /p = @"%%a"
echo ; >> HgId.cs
echo } >> HgId.cs
echo } >> HgId.cs
вместе с файлом HgId.pre,который определяется как:
namespace My.Namespace {
/// <summary> Auto generated Mercurial ID class. </summary>
internal class HgID {
/// <summary> Mercurial version ID [+ is modified] [Named branch]</summary>
public const string Version =
Когда я собираю свое приложение, событие предварительной сборки запускается во всех библиотеках, создавая новый файл HgId.cs (который не находится под контролем ревизии) и вызываябиблиотека для повторной компиляции с новой строкой 'hg id' в 'Version'.
Проблемы с текущим решением
Основная проблема заключается в том, что поскольку HgId.cs повторнокрпри каждой предварительной сборке, поэтому каждый раз, когда нам нужно что-либо скомпилировать, все проекты в текущем решении перекомпилируются.Поскольку мы хотим иметь возможность легко выполнять отладку в наших библиотеках, мы обычно сохраняем множество библиотек, на которые есть ссылки в нашем основном прикладном решении.Это может привести к тому, что время сборки будет значительно больше, чем хотелось бы.
В идеале я хотел бы, чтобы библиотеки компилировались только в том случае, если содержимое файла HgId.cs действительно изменилось, а не былосоздается с точно таким же содержимым.
Вторая проблема этого метода заключается в его зависимости от конкретного поведения оболочки Windows.Мне уже приходилось несколько раз изменять командный файл, поскольку оригинальный работал под XP, но не под Vista, следующая версия работала под Vista, но не под XP, и, наконец, мне удалось заставить его работать с обоими.Будет ли он работать с Windows 7, однако, все догадываются, и со временем я вижу, что с большей вероятностью подрядчики будут рассчитывать на то, что наши приложения смогут создавать свои приложения на своих Windows 7. Box
Наконец, у меня естьэстетическая проблема с этим решением, пакетные файлы и объединенные шаблоны файлов чувствую как неправильный способ сделать это.
Мои актуальные вопросы
Как бы вы решили / какВы решаете проблему, которую я пытаюсь решить?
Какие варианты лучше, чем то, чем я сейчас занимаюсь?
Отклонено Решение этих проблем
До того, как яРеализовав текущее решение, я посмотрел расширение Mercurials Keyword, так как оно казалось очевидным решением.Однако чем больше я смотрел на это и читал мнения людей, тем больше приходил к выводу, что делать это было неправильно.
Я также помню проблемы, вызванные подстановкой ключевых слов в проектахв предыдущих компаниях (мысль о том, что мне снова понадобится Source Safe, вселяет в меня чувство страха * 8 ').
Кроме того, я не особо хочу включать расширения Mercurial для завершения сборки.Я хочу, чтобы решение было автономным, чтобы приложение не могло быть случайно скомпилировано без информации о встроенной версии только потому, что расширение не включено или не установлено правильное вспомогательное программное обеспечение.
Я также подумал о написании этого на лучшем языке сценариев, где я бы писал только файл HgId.cs , если содержимое действительно изменилось, но все варианты, которые я мог придумать, потребовали бы моегоколлеги, подрядчики и, возможно, клиенты должны установить программное обеспечение, которое им не нужно (например, cygwin).
Будут признательны за любые другие варианты, которые могут придумать люди.
Обновление
Частичное решение
Поработав с ним некоторое время, мне удалось получить файл HgId.bat, который перезаписывает файл HgId.cs только в случае его изменения:
@echo off
type HgId.pre > HgId.cst
For /F "delims=" %%a in ('hg id') Do <nul >>HgId.cst set /p = @"%%a"
echo ; >> HgId.cst
echo } >> HgId.cst
echo } >> HgId.cst
fc HgId.cs HgId.cst >NUL
if %errorlevel%==0 goto :ok
copy HgId.cst HgId.cs
:ok
del HgId.cst
Проблемы с этим решением
Несмотря на то, что HgId.cs больше не создается каждый раз, Visual Studio sпока настаивает на компиляции каждый раз.Я пытался искать решения и проверял «Только строить запускаемые проекты и зависимости при запуске» в «Инструменты | Параметры | Проекты и решения» | «Построить и запустить», но это не имеет значения.
Вторая проблема также остается,и теперь у меня нет возможности проверить, будет ли он работать с Vista, поскольку этого подрядчика больше нет с нами.
- Если кто-нибудь сможет протестировать этот пакетный файл на Windows 7 и / или Vista, я был бы признателен, если бы узнал, как он работает.
Наконец, моя эстетическая проблема с этимРешение, даже сильнее, чем было раньше, так как пакетный файл более сложный, и теперь есть еще что-то, что может пойти не так.
Если вы можете придумать какие-нибудь лучшие решения, я хотел бы услышать о них.