Version.props 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <Project>
  2. <!--
  3. 共享的版本检测逻辑
  4. 此文件被根目录和 SourceGenerator 的 Directory.Build.props 导入
  5. -->
  6. <!-- VersionsDir 由导入此文件的 props 文件预先设置 -->
  7. <!-- 内联任务:获取最高版本号及其文件路径 -->
  8. <UsingTask TaskName="GetMaxVersion" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)/Microsoft.Build.Tasks.Core.dll">
  9. <ParameterGroup>
  10. <VersionFiles ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
  11. <MaxVersion ParameterType="System.String" Output="true" />
  12. <MaxVersionCore ParameterType="System.String" Output="true" />
  13. <MaxVersionRevision ParameterType="System.String" Output="true" />
  14. <MaxVersionFile ParameterType="System.String" Output="true" />
  15. </ParameterGroup>
  16. <Task>
  17. <Using Namespace="System.Text.RegularExpressions" />
  18. <Code Type="Fragment" Language="cs"><![CDATA[
  19. MaxVersion = "1.0.0";
  20. MaxVersionCore = "1.0.0";
  21. MaxVersionRevision = "0";
  22. MaxVersionFile = "";
  23. Version maxVer = new Version(0, 0, 0);
  24. string maxPrerelease = "";
  25. if (VersionFiles != null) {
  26. foreach (var file in VersionFiles) {
  27. // 匹配完整版本号,包括预发布标签(如 v1.0.2-beta1)
  28. var match = Regex.Match(file.GetMetadata("Filename"), @"^v(\d+\.\d+\.\d+)(-[\w.]+)?");
  29. if (match.Success) {
  30. var coreVersion = match.Groups[1].Value;
  31. var prerelease = match.Groups[2].Success ? match.Groups[2].Value : "";
  32. var ver = new Version(coreVersion);
  33. // 比较:先比核心版本,再比预发布标签(空字符串 > 预发布标签,即正式版 > beta)
  34. bool isNewer = ver > maxVer ||
  35. (ver == maxVer && string.Compare(prerelease, maxPrerelease, StringComparison.Ordinal) > 0);
  36. if (isNewer) {
  37. maxVer = ver;
  38. maxPrerelease = prerelease;
  39. MaxVersionCore = coreVersion;
  40. MaxVersion = coreVersion + prerelease;
  41. MaxVersionFile = file.GetMetadata("FullPath");
  42. // 从预发布标签提取数字作为修订号(如 -beta2 -> 2, -rc.3 -> 3)
  43. var revMatch = Regex.Match(prerelease, @"(\d+)$");
  44. MaxVersionRevision = revMatch.Success ? revMatch.Groups[1].Value : "0";
  45. }
  46. }
  47. }
  48. }
  49. ]]></Code>
  50. </Task>
  51. </UsingTask>
  52. <!-- 内联任务:检查文件内容长度 -->
  53. <UsingTask TaskName="CheckFileLength" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)/Microsoft.Build.Tasks.Core.dll">
  54. <ParameterGroup>
  55. <FilePath ParameterType="System.String" Required="true" />
  56. <MinLength ParameterType="System.Int32" Required="true" />
  57. <IsLongEnough ParameterType="System.Boolean" Output="true" />
  58. </ParameterGroup>
  59. <Task>
  60. <Using Namespace="System.IO" />
  61. <Code Type="Fragment" Language="cs"><![CDATA[
  62. IsLongEnough = false;
  63. if (!string.IsNullOrEmpty(FilePath) && File.Exists(FilePath)) {
  64. var content = File.ReadAllText(FilePath);
  65. IsLongEnough = content.Length >= MinLength;
  66. }
  67. ]]></Code>
  68. </Task>
  69. </UsingTask>
  70. <!-- 扫描版本文件并提取最高版本 -->
  71. <Target Name="DetectVersionFromFiles" BeforeTargets="GetAssemblyVersion;GenerateNuspec;Pack;Build">
  72. <ItemGroup>
  73. <VersionFiles Include="$(VersionsDir)/v*.md" />
  74. </ItemGroup>
  75. <GetMaxVersion VersionFiles="@(VersionFiles)">
  76. <Output TaskParameter="MaxVersion" PropertyName="DetectedVersion" />
  77. <Output TaskParameter="MaxVersionCore" PropertyName="DetectedVersionCore" />
  78. <Output TaskParameter="MaxVersionRevision" PropertyName="DetectedVersionRevision" />
  79. <Output TaskParameter="MaxVersionFile" PropertyName="DetectedVersionFile" />
  80. </GetMaxVersion>
  81. <PropertyGroup>
  82. <!-- Version/PackageVersion 使用完整版本(含预发布标签) -->
  83. <Version>$(DetectedVersion)</Version>
  84. <PackageVersion>$(DetectedVersion)</PackageVersion>
  85. <!-- AssemblyVersion/FileVersion 使用数字版本,第四位为预发布序号 -->
  86. <AssemblyVersion>$(DetectedVersionCore).$(DetectedVersionRevision)</AssemblyVersion>
  87. <FileVersion>$(DetectedVersionCore).$(DetectedVersionRevision)</FileVersion>
  88. </PropertyGroup>
  89. <Message Text="检测到版本: $(DetectedVersion)" Importance="high" />
  90. </Target>
  91. <!-- NuGet 包公共元数据 -->
  92. <PropertyGroup>
  93. <Authors>Apq</Authors>
  94. <Company>Apq</Company>
  95. <Copyright>Copyright © Apq $([System.DateTime]::Now.Year)</Copyright>
  96. <PackageLicenseExpression>MIT</PackageLicenseExpression>
  97. <!-- 启用包生成 -->
  98. <IsPackable>true</IsPackable>
  99. <!-- 源码链接支持 -->
  100. <PublishRepositoryUrl>true</PublishRepositoryUrl>
  101. <EmbedUntrackedSources>true</EmbedUntrackedSources>
  102. <IncludeSymbols>true</IncludeSymbols>
  103. <SymbolPackageFormat>snupkg</SymbolPackageFormat>
  104. </PropertyGroup>
  105. </Project>