Я создаю приложение на C #, используя Git в качестве контроля версий.
Есть ли способ автоматически встроить последний хэш фиксации в исполняемый файл при создании приложения?
Например, печать хэша фиксации на консоли будет выглядеть примерно так:
class PrintCommitHash
{
private String lastCommitHash = ?? // What do I put here?
static void Main(string[] args)
{
// Display the version number:
System.Console.WriteLine(lastCommitHash );
}
}
Обратите внимание, что это нужно делать во время сборки , а не во время выполнения , так как мой развернутый исполняемый файл не будет иметь доступного репозитория git.
Связанный с C ++ вопрос можно найти здесь .
EDIT
Per @ запрос mattanja, я хочу разместить скрипт мерзавец крючка я использую в своих проектах. Настройка:
- Перехватчики - это сценарии оболочки Linux, которые находятся в папке : path_to_project \ .git \ hooks
- Если вы используете msysgit , папка хуков уже содержит несколько примеров скриптов. Чтобы git вызывал их, удалите расширение .sample из имени скрипта.
- Имена сценариев ловушек соответствуют событию, которое их вызывает. В моем случае я изменил пост-фиксацию и пост-слияние .
- Мой файл AssemblyInfo.cs находится непосредственно по пути к проекту (на том же уровне, что и папка .git ). Он содержит 23 строки, и я использую git для создания 24-й.
Поскольку моя Linux-оболочка немного устарела, сценарий просто считывает первые 23 строки AssemblyInfo.cs во временный файл, выводит хеш git на последнюю строку и переименовывает файл обратно в AssemblyInfo.cs . Я уверен, что есть способы сделать это лучше:
#!/bin/sh
cmt=$(git rev-list --max-count=1 HEAD)
head -23 AssemblyInfo.cs > AssemblyInfo.cs.tmp
echo [assembly: AssemblyFileVersion\(\"$cmt\"\)] >> AssemblyInfo.cs.tmp
mv AssemblyInfo.cs.tmp AssemblyInfo.cs
Надеюсь это поможет.
GlobalAssemblyInfo.*
файлов во время компиляции для проектов C # и C ++: по умолчанию сгенерированная версия сборки содержит: хеш фиксации, флаг, сигнализирующий о локальных изменениях, и инкремент, подсчитывающий количество фиксации от корня репозитория до текущей фиксации.Вы можете встроить файл version.txt в исполняемый файл, а затем прочитать version.txt из исполняемого файла. Чтобы создать файл version.txt , используйте
git describe --long
Вот шаги:
Используйте событие сборки для вызова git
Щелкните проект правой кнопкой мыши и выберите Свойства.
В Build Events добавьте событие Pre-Build, содержащее (обратите внимание на кавычки):
"C: \ Program Files \ Git \ bin \ git.exe" описать --long> "$ (ProjectDir) \ version.txt"
Это создаст файл version.txt в каталоге вашего проекта.
Вставьте файл version.txt в исполняемый файл
Прочитать строку версии встроенного текстового файла
Вот пример кода для чтения строки версии встроенного текстового файла:
источник
git describe --dirty
, который добавляет флаг, когда разработчики работают с грязным рабочим деревом.GetEntryAssembly
собиралась сборка. В любом случае вы можете позвонить,GetName().Name
чтобы избежать жесткого кодирования имени.ОБНОВИТЬ:
С тех пор, как я изначально ответил на этот вопрос, все изменилось.
Microsoft.NET.Sdk
(То есть вы должны использовать проект СОК-стиль) теперь включает поддержку для добавления фиксации хэша как на сборочный информационную версию, а также метаданные NuGet пакета, если соблюдены некоторые условия:<SourceRevisionId>
Должно быть определено свойство. Это можно сделать, добавив такую цель:Эта цель выполняет команду, которая будет установлена
SourceRevisionId
как сокращенный (8 символов) хэш. BeforeTargets заставляет это запускаться до создания информационной версии сборки.Чтобы включить хэш в метаданные пакета nuget,
<RepositoryUrl>
также необходимо определить.<SourceControlInformationFeatureSupported>
свойство должно бытьtrue
, это заставляет задачу пакета nuget также получать SourceRevisionId.Я бы посоветовал людям отказаться от использования пакета MSBuildGitHash, поскольку этот новый метод более понятен и согласован.
ОРИГИНАЛ:
Я создал простой пакет nuget, который вы можете включить в свой проект, который позаботится об этом за вас: https://www.nuget.org/packages/MSBuildGitHash/
Этот пакет nuget реализует «чистое» решение MSBuild. Если вы не хотите зависеть от пакета nuget, вы можете просто скопировать эти Targets в свой файл csproj, и он должен включать хэш git в качестве настраиваемого атрибута сборки:
Здесь две цели. Первый, «GetGitHash», загружает хеш git в свойство MSBuild с именем BuildHash, только если BuildHash еще не определен. Это позволяет вам передать его в MSBuild из командной строки, если хотите. Вы можете передать его в MSBuild так:
MSBuild.exe myproj.csproj /p:BuildHash=MYHASHVAL
Вторая цель, «WriteGitHash», запишет хеш-значение в файл во временной папке «obj» с именем «CustomAssemblyInfo.cs». Этот файл будет содержать строку следующего вида:
[assembly: AssemblyMetadata("GitHash", "MYHASHVAL")]
Этот файл CustomAssemblyInfo.cs будет скомпилирован в вашу сборку, поэтому вы можете использовать отражение для поиска
AssemblyMetadata
среды выполнения. В следующем коде показано, как это можно сделать, еслиAssemblyInfo
класс включен в ту же сборку.Некоторые преимущества этого дизайна заключаются в том, что он не затрагивает никакие файлы в папке вашего проекта, все измененные файлы находятся в папке "obj". Ваш проект также будет идентично собран из Visual Studio или из командной строки. Его также можно легко настроить для вашего проекта, и он будет управляться исходным кодом вместе с вашим файлом csproj.
источник
Assembly.GetExecutingAssembly()
, а затем изучить сборкуCustomAttributes
.GitHash
? Я вижу, что это значение существует, но есть ли какой-нибудь чистый метод для получения настраиваемого атрибута по имени? Похоже, мне нужно написать длинный запрос where-selectCustomAttributes
, спасибо.CustomAttributes
. Например, вот функция, которую я использую для извлечения хеш-строки: pastebin.com/nVKGLhJCДругой способ сделать это - использовать NetRevisionTool с некоторой магией встроенной Visual Studio. Я продемонстрирую это здесь для Visual Studio 2013 Professional Edition, но это будет работать и с другими версиями.
Итак, сначала загрузите NetRevisionTool. Вы включаете NetRevisionTool.exe в свой PATH или регистрируете его в своем репозитории и создаете предварительную сборку Visual Studio и действие после сборки и изменяете свой AssemblyInfo.cs.
Примером добавления вашего git-hash в AssemblyInformationVersion будет следующий: В настройках вашего проекта:
в AssemblyInfo.cs вашего проекта вы меняете / добавляете строку:
[сборка: AssemblyInformationalVersion ("1.1. {dmin: 2015}. {chash: 6} {!} - {branch}")]
на показанном снимке экрана я проверил NetRevisionTool.exe в папке External / bin
После сборки, если вы затем щелкните правой кнопкой мыши свой двоичный файл и перейдете в свойства, вы должны увидеть что-то вроде следующего:
Надеюсь, это поможет кому-то там
источник
Думаю, на этот вопрос стоит дать исчерпывающий пошаговый ответ. Стратегия здесь заключается в том, чтобы запустить сценарий PowerShell из событий перед сборкой, который принимает файл шаблона и генерирует файл AssemblyInfo.cs с включенной информацией о теге git + счетчике фиксации.
Шаг 1. Создайте файл AssemblyInfo_template.cs в папке Project \ Properties на основе вашего исходного AssemblyInfo.cs, но содержащего:
Шаг 2. Создайте сценарий PowerShell с именем InjectGitVersion.ps1, источником которого является:
Шаг 3. Сохраните файл InjectGitVersion.ps1 в каталоге вашего решения в папке BuildScripts.
Шаг 4. Добавьте следующую строку в события Pre-Build проекта.
Шаг 5: Создайте свой проект.
Шаг 6. При желании добавьте AssemblyInfo.cs в файл игнорирования git.
источник
AssemblyInfo.cs
можно изменитьAssemblyInfo.cs
на месте, построить, а затем выполнить git resetAssemblyInfo.cs
до последней зафиксированной версии. Так что в репо всегда будетAssemblyInfo.cs
, с$..$
заменой только на время сборки.git describe --match "v[0-9]*" --long --always --dirty
для фильтрации определенных тегов (содержащих номер версии) и для указания, было ли рабочее дерево чистым.$gitVersion -match '[v](.*)-(\d+)-[g](.+)$';
Теперь это очень просто с помощью .NET Revision Task для MSBuild и работы с Visual Studio 2019.
Просто установите пакет NuGet Unclassified.NetRevisionTask , а затем настройте нужную информацию в
AssemblyInfo.cs
файле, как описано в документации GitHub .Если вам нужен только хеш последней фиксации (длина = 8):
Создайте свой проект / решение, и у вас будет что-то вроде этого:
источник
PropertyGroup
в файл .csproj, как показано в README github.com/ygoe/NetRevisionTask/blob/master/README.mdПоскольку в другом ответе уже упоминается бит git, после того, как у вас есть SHA, вы можете подумать о создании
AssemblyInfo.cs
файла вашего проекта в хуке перед сборкой.Один из способов сделать это - создать
AssemblyInfo.cs.tmpl
файл шаблона с заполнителем для вашего SHA, например, $$ GITSHA $$, напримерЗатем ваш обработчик предварительной сборки должен заменить этот заполнитель и вывести файл AssemblyInfo.cs для компилятора C #.
Чтобы узнать, как это можно сделать с помощью SubWCRev для SVN, см. Этот ответ . Сделать что-то подобное для git не составит труда.
Другими способами могут быть «этап создания», как уже упоминалось, т. Е. Написание задачи MSBuild, которая выполняет нечто подобное. Еще один способ может заключаться в том, чтобы каким-то образом обработать DLL (например, ildasm + ilasm), но я думаю, что упомянутые выше варианты, вероятно, самые простые.
источник
Для полностью автоматизированного и гибкого метода оформления заказа https://github.com/Fody/Stamp . Мы успешно использовали это для наших проектов Git (а также эту версию для проектов SVN)
Обновление: это устарело, так как Stamp.Fody больше не поддерживается
источник
Вы можете использовать однострочник PowerShell для обновления всех файлов assemblyinfo с помощью хэша фиксации.
источник
Как отмечает @ learath2, вывод
git rev-parse HEAD
даст вам простой хеш.Если вы используете теги в Git-репозитории (и вы используете теги, разве это не более наглядно и читабельно, чем
git rev-parse
), вывод может быть получен изgit describe
(а также успешно использован позжеgit checkout
)Вы можете вызвать rev-parse | описать в:
источник
Я использую комбинацию принятого ответа и небольшого дополнения. У меня установлено расширение AutoT4 ( https://marketplace.visualstudio.com/items?itemName=BennorMcCarthy.AutoT4 ), чтобы повторно запустить шаблоны перед сборкой.
получение версии из GIT
У меня есть
git -C $(ProjectDir) describe --long --always > "$(ProjectDir)git_version.txt"
событие предварительной сборки в свойствах проекта. Добавление git_version.txt и VersionInfo.cs в .gitignore - неплохая идея.встраивание версии в метаданные
Я добавил
VersionInfo.tt
в свой проект шаблон:Теперь у меня есть тег git + хеш в "ProductVersion".
источник
Ссылаясь на другой ответ ( https://stackoverflow.com/a/44278482/4537127 ), я также использовал
VersionInfo.tt
текстовый шаблон для созданияAssemblyInformationalVersion
без AutoT4.(По крайней мере, работает в моем приложении C # WPF)
Проблема заключалась в том, что события перед сборкой запускались после преобразований шаблона, поэтому после клонирования
git_version.txt
файла не было и сборка завершалась ошибкой. После создания его вручную, чтобы позволить преобразованию пройти один раз, он был обновлен после преобразования и всегда отставал на одну фиксацию .Мне пришлось внести две корректировки в файл .csproj (это относится как минимум к Visual Studio Community 2017).
1) Импортируйте цели преобразования текста и выполните преобразования шаблонов для запуска в каждой сборке: (Ссылка https://msdn.microsoft.com/en-us/library/ee847423.aspx )
и после
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
2) Выполните
git describe
прогон перед преобразованием шаблона (чтобыgit_version.txt
он был приVersionInfo.tt
преобразовании):..И код C # для получения
AssemblyInformationalVersion
(Ссылка https://stackoverflow.com/a/7770189/4537127 )..И добавляем сгенерированные файлы в .gitignore
источник
Другой способ - сгенерировать файл Version.cs на этапе предварительной сборки. Я исследовал это в небольшом экспериментальном проекте, который распечатывает текущий хеш фиксации.
Проект загружен на https://github.com/sashoalm/GitCommitHashPrinter .
Пакетный код, который создает файл Version.cs, следующий:
источник
Место
в
YOUR_PROJECT_NAME.csproj
источник