Modernize versioning and display in app and build output

- Switch to explicit "3.2.0" next-version in GitVersion.yml
- Update NuGet packages and set assembly name to "ImageCatalog"
- Add MSBuild target to rename published exe with year and version
- Add AppVersion property to DataModel, set via IVersionProvider
- Replace static version label with data-bound versionLabel in UI
- Remove manual version label logic from MainForm
- Update DI to inject IVersionProvider into DataModel
- Ensures UI always shows correct version and builds are versioned
This commit is contained in:
MaddoScientisto 2026-02-14 22:18:56 +01:00
commit 69fdf01de3
6 changed files with 106 additions and 21 deletions

View file

@ -10,7 +10,8 @@
<FileVersion>3.1.2.0</FileVersion>
<InformationalVersion>3.1.2</InformationalVersion>
<Version>3.1.2</Version>
<AssemblyName>ImageCatalog2025</AssemblyName>
<!-- Default assembly name for regular builds -->
<AssemblyName>ImageCatalog</AssemblyName>
<LangVersion>default</LangVersion>
<ApplicationIcon>Logo.ico</ApplicationIcon>
</PropertyGroup>
@ -40,10 +41,10 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="16.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.7" />
<PackageReference Include="GitVersion.MsBuild" Version="5.11.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.3" />
<PackageReference Include="GitVersion.MsBuild" Version="6.5.1" PrivateAssets="all" />
<PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.4.421302">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
@ -61,4 +62,62 @@
</EmbeddedResource>
</ItemGroup>
<PropertyGroup />
<!-- After publish, rename the produced executable to ImageCatalog.<year>.<major>.<minor>.<build>.<revision>.<ext>
The destination extension is taken from the actual produced file (exe or dll).
-->
<Target Name="RenamePublishedExeWithYearAndVersion" AfterTargets="Publish" Condition="'$(PublishDir)' != ''">
<PropertyGroup>
<_PublishYear>$([System.DateTime]::Now.ToString("yyyy"))</_PublishYear>
<!-- Prefer FileVersion (four-part) then AssemblyVersion -->
<_Ver>$(FileVersion)</_Ver>
<_Ver Condition="'$(_Ver)' == ''">$(AssemblyVersion)</_Ver>
<!-- Normalize to avoid plus signs and spaces -->
<_VerSanitized>$([System.String]::Copy('$(_Ver)'))</_VerSanitized>
<_VerSanitized>$([System.String]::Copy('$(_VerSanitized)').Replace('+', '.'))</_VerSanitized>
<_VerSanitized>$([System.String]::Copy('$(_VerSanitized)').Replace(' ', '_'))</_VerSanitized>
<_NewExeNameBase>ImageCatalog.$(_PublishYear).$(_VerSanitized)</_NewExeNameBase>
</PropertyGroup>
<Message Text="Attempting to find published assembly to rename to $(_NewExeNameBase).* in $(PublishDir)" Importance="High" />
<!-- Candidate locations in order of likelihood -->
<PropertyGroup>
<_Candidate1>$(PublishDir)$(TargetFileName)</_Candidate1>
<_Candidate2>$(PublishDir)$(TargetName)$(TargetExt)</_Candidate2>
<_Candidate3>$(PublishDir)$(TargetName).exe</_Candidate3>
<_Candidate4>$(PublishDir)$(AssemblyName)$(TargetExt)</_Candidate4>
<_Candidate5>$(PublishDir)$(AssemblyName).exe</_Candidate5>
</PropertyGroup>
<!-- Pick the first existing candidate and compute destination using its extension -->
<PropertyGroup Condition="Exists('$(_Candidate1)') and '$(_CandidateFound)' == ''">
<_CandidateFound>$(_Candidate1)</_CandidateFound>
</PropertyGroup>
<PropertyGroup Condition="Exists('$(_Candidate2)') and '$(_CandidateFound)' == ''">
<_CandidateFound>$(_Candidate2)</_CandidateFound>
</PropertyGroup>
<PropertyGroup Condition="Exists('$(_Candidate3)') and '$(_CandidateFound)' == ''">
<_CandidateFound>$(_Candidate3)</_CandidateFound>
</PropertyGroup>
<PropertyGroup Condition="Exists('$(_Candidate4)') and '$(_CandidateFound)' == ''">
<_CandidateFound>$(_Candidate4)</_CandidateFound>
</PropertyGroup>
<PropertyGroup Condition="Exists('$(_Candidate5)') and '$(_CandidateFound)' == ''">
<_CandidateFound>$(_Candidate5)</_CandidateFound>
</PropertyGroup>
<!-- If a candidate was found, compute destination using its extension and perform copy/delete -->
<PropertyGroup Condition="'$(_CandidateFound)' != ''">
<_FoundExt>$([System.IO.Path]::GetExtension('$(_CandidateFound)'))</_FoundExt>
<_DestExe>$(PublishDir)$(_NewExeNameBase)$(_FoundExt)</_DestExe>
</PropertyGroup>
<Message Text="Found candidate: $(_CandidateFound). Renaming to $(_DestExe)" Importance="High" Condition="'$(_CandidateFound)' != ''" />
<Copy SourceFiles="$(_CandidateFound)" DestinationFiles="$(_DestExe)" SkipUnchangedFiles="false" Condition="'$(_CandidateFound)' != ''" />
<Delete Files="$(_CandidateFound)" Condition="'$(_CandidateFound)' != ''" />
</Target>
</Project>