| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- <Project>
- <PropertyGroup>
- <!-- 支持 .NET 6 及以上所有版本 -->
- <TargetFrameworks>net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
- <!-- 公共设置 -->
- <ImplicitUsings>enable</ImplicitUsings>
- <Nullable>enable</Nullable>
- <LangVersion>latest</LangVersion>
- <!-- 生成文档 -->
- <GenerateDocumentationFile>true</GenerateDocumentationFile>
- <NoWarn>$(NoWarn);CS1591</NoWarn>
- <!-- 抑制 XML 注释警告 -->
- <NoWarn>$(NoWarn);CS1591;CS1570;CS1574</NoWarn>
- <!-- 抑制 TFM 不支持警告 -->
- <SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
- </PropertyGroup>
- <!-- Apq.ChangeBubbling 特定的 NuGet 包元数据 -->
- <PropertyGroup>
- <Description>变更冒泡事件库,支持 Rx 响应式流、弱引用消息和可插拔调度环境</Description>
- <PackageTags>change-bubbling;reactive;rx;mvvm;messaging;event;observable</PackageTags>
- <PackageReadmeFile>README.md</PackageReadmeFile>
- </PropertyGroup>
- <!-- 从 versions 目录自动获取版本号(纯 MSBuild,跨平台兼容) -->
- <PropertyGroup>
- <VersionsDir>$([System.IO.Path]::Combine($(MSBuildThisFileDirectory), 'versions'))</VersionsDir>
- </PropertyGroup>
- <!-- 内联任务:获取最高版本号及其文件路径 -->
- <UsingTask TaskName="GetMaxVersion" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)/Microsoft.Build.Tasks.Core.dll">
- <ParameterGroup>
- <VersionFiles ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
- <MaxVersion ParameterType="System.String" Output="true" />
- <MaxVersionCore ParameterType="System.String" Output="true" />
- <MaxVersionRevision ParameterType="System.String" Output="true" />
- <MaxVersionFile ParameterType="System.String" Output="true" />
- </ParameterGroup>
- <Task>
- <Using Namespace="System.Text.RegularExpressions" />
- <Code Type="Fragment" Language="cs"><![CDATA[
- MaxVersion = "1.0.0";
- MaxVersionCore = "1.0.0";
- MaxVersionRevision = "0";
- MaxVersionFile = "";
- Version maxVer = new Version(0, 0, 0);
- string maxPrerelease = "";
- if (VersionFiles != null) {
- foreach (var file in VersionFiles) {
- // 匹配完整版本号,包括预发布标签(如 v1.0.2-beta1)
- var match = Regex.Match(file.GetMetadata("Filename"), @"^v(\d+\.\d+\.\d+)(-[\w.]+)?");
- if (match.Success) {
- var coreVersion = match.Groups[1].Value;
- var prerelease = match.Groups[2].Success ? match.Groups[2].Value : "";
- var ver = new Version(coreVersion);
- // 比较:先比核心版本,再比预发布标签(空字符串 > 预发布标签,即正式版 > beta)
- bool isNewer = ver > maxVer ||
- (ver == maxVer && string.Compare(prerelease, maxPrerelease, StringComparison.Ordinal) > 0);
- if (isNewer) {
- maxVer = ver;
- maxPrerelease = prerelease;
- MaxVersionCore = coreVersion;
- MaxVersion = coreVersion + prerelease;
- MaxVersionFile = file.GetMetadata("FullPath");
- // 从预发布标签提取数字作为修订号(如 -beta2 -> 2, -rc.3 -> 3)
- var revMatch = Regex.Match(prerelease, @"(\d+)$");
- MaxVersionRevision = revMatch.Success ? revMatch.Groups[1].Value : "0";
- }
- }
- }
- }
- ]]></Code>
- </Task>
- </UsingTask>
- <!-- 内联任务:检查文件内容长度 -->
- <UsingTask TaskName="CheckFileLength" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)/Microsoft.Build.Tasks.Core.dll">
- <ParameterGroup>
- <FilePath ParameterType="System.String" Required="true" />
- <MinLength ParameterType="System.Int32" Required="true" />
- <IsLongEnough ParameterType="System.Boolean" Output="true" />
- </ParameterGroup>
- <Task>
- <Using Namespace="System.IO" />
- <Code Type="Fragment" Language="cs"><![CDATA[
- IsLongEnough = false;
- if (!string.IsNullOrEmpty(FilePath) && File.Exists(FilePath)) {
- var content = File.ReadAllText(FilePath);
- IsLongEnough = content.Length >= MinLength;
- }
- ]]></Code>
- </Task>
- </UsingTask>
- <!-- 扫描版本文件并提取最高版本 -->
- <Target Name="DetectVersionFromFiles" BeforeTargets="GetAssemblyVersion;GenerateNuspec;Pack;Build">
- <ItemGroup>
- <VersionFiles Include="$(VersionsDir)/v*.md" />
- </ItemGroup>
- <GetMaxVersion VersionFiles="@(VersionFiles)">
- <Output TaskParameter="MaxVersion" PropertyName="DetectedVersion" />
- <Output TaskParameter="MaxVersionCore" PropertyName="DetectedVersionCore" />
- <Output TaskParameter="MaxVersionRevision" PropertyName="DetectedVersionRevision" />
- <Output TaskParameter="MaxVersionFile" PropertyName="DetectedVersionFile" />
- </GetMaxVersion>
- <PropertyGroup>
- <!-- Version/PackageVersion 使用完整版本(含预发布标签) -->
- <Version>$(DetectedVersion)</Version>
- <PackageVersion>$(DetectedVersion)</PackageVersion>
- <!-- AssemblyVersion/FileVersion 使用数字版本,第四位为预发布序号 -->
- <AssemblyVersion>$(DetectedVersionCore).$(DetectedVersionRevision)</AssemblyVersion>
- <FileVersion>$(DetectedVersionCore).$(DetectedVersionRevision)</FileVersion>
- </PropertyGroup>
- <Message Text="检测到版本: $(DetectedVersion)" Importance="high" />
- </Target>
- <!-- 动态选择 README 文件:优先使用版本文件,内容不足5字符时回退到项目 README -->
- <Target Name="SelectReadmeFile" BeforeTargets="_GetPackageFiles" DependsOnTargets="DetectVersionFromFiles">
- <!-- 检查版本文件内容长度 -->
- <CheckFileLength FilePath="$(DetectedVersionFile)" MinLength="5">
- <Output TaskParameter="IsLongEnough" PropertyName="UseVersionFileAsReadme" />
- </CheckFileLength>
- <!-- 如果版本文件内容足够长,使用版本文件 -->
- <ItemGroup Condition="'$(UseVersionFileAsReadme)' == 'true'">
- <_PackageFiles Include="$(DetectedVersionFile)">
- <PackagePath>README.md</PackagePath>
- <BuildAction>None</BuildAction>
- </_PackageFiles>
- </ItemGroup>
- <!-- 否则使用项目目录下的 README.md -->
- <ItemGroup Condition="'$(UseVersionFileAsReadme)' != 'true'">
- <_PackageFiles Include="README.md">
- <PackagePath>README.md</PackagePath>
- <BuildAction>None</BuildAction>
- </_PackageFiles>
- </ItemGroup>
- <Message Text="README 来源: $(DetectedVersionFile) (版本文件)" Importance="high" Condition="'$(UseVersionFileAsReadme)' == 'true'" />
- <Message Text="README 来源: README.md (项目目录)" Importance="high" Condition="'$(UseVersionFileAsReadme)' != 'true'" />
- </Target>
- <!-- NuGet 包公共元数据 -->
- <PropertyGroup>
- <Authors>Apq</Authors>
- <Company>Apq</Company>
- <Copyright>Copyright © Apq $([System.DateTime]::Now.Year)</Copyright>
- <PackageLicenseExpression>MIT</PackageLicenseExpression>
- <!-- 启用包生成 -->
- <IsPackable>true</IsPackable>
- <!-- 源码链接支持 -->
- <PublishRepositoryUrl>true</PublishRepositoryUrl>
- <EmbedUntrackedSources>true</EmbedUntrackedSources>
- <IncludeSymbols>true</IncludeSymbols>
- <SymbolPackageFormat>snupkg</SymbolPackageFormat>
- </PropertyGroup>
- </Project>
|