打包是发布前的核心步骤。所有包共用版本号,使用集中包管理,聚合包有特殊的占位约定。
版本号
所有包共用同一版本号(没有 per-package 版本)。版本号定义在 Directory.Build.props:
<VersionPrefix>1.0.0</VersionPrefix><!-- 不设置 VersionSuffix 表示稳定版本 -->版本号 bump 是手动的——改 Directory.Build.props 的 VersionPrefix / VersionSuffix,或发布时通过 -p:Version= 覆盖。
打包命令
# ① 用默认版本打包./scripts/pack.sh
# ② 指定版本./scripts/pack.sh 1.2.3
# ③ 直接用 dotnet CLIdotnet pack -c Release -o artifacts/pack.sh 先清空 artifacts/ 目录,再执行 dotnet pack,产物包含 .nupkg(主包)和 .snupkg(符号包)。
包元数据
Directory.Build.props 定义统一的包元数据:
<PropertyGroup> <Authors>Bitzsoft</Authors> <Company>Bitzsoft</Company> <PackageLicenseExpression>MIT</PackageLicenseExpression> <PackageReadmeFile>README.md</PackageReadmeFile> <PackageIcon>logo.png</PackageIcon> <RepositoryUrl>https://github.com/shbitz/Bitzsoft.Integrations</RepositoryUrl> <PublishRepositoryUrl>true</PublishRepositoryUrl> <EmbedUntrackedSources>true</EmbedUntrackedSources> <IncludeSymbols>true</IncludeSymbols> <SymbolPackageFormat>snupkg</SymbolPackageFormat></PropertyGroup>README 随包
每个包的 README.md 会随 NuGet 包发布(PackageReadmeFile=README.md)。NuGet.org 会展示在包页面。README 结构应包含:功能说明、安装命令、配置 JSON、DI 注册代码、使用示例、字段说明、相关包。
聚合包占位
聚合包(.All)设 IncludeBuildOutput=false + IncludeSymbols=false(纯依赖转发包),并用 build/NuGet/_._ 占位文件放进各 TFM 的 lib 目录:
<PropertyGroup> <IncludeBuildOutput>false</IncludeBuildOutput> <IncludeSymbols>false</IncludeSymbols></PropertyGroup>
<ItemGroup> <Content Include="build\NuGet\_._" Pack="true" PackagePath="lib\net5.0\" /> <Content Include="build\NuGet\_._" Pack="true" PackagePath="lib\net8.0\" /> <Content Include="build\NuGet\_._" Pack="true" PackagePath="lib\net10.0\" /></ItemGroup>这避免了 NuGet “空 lib” 警告。
包验证
Directory.Build.props 启用严格的包验证:
<EnablePackageValidation>true</EnablePackageValidation><EnableStrictModeForCompatibleTfms>true</EnableStrictModeForCompatibleTfms><ApiCompatEnableRuleCannotChangeParameterName>true</ApiCompatEnableRuleCannotChangeParameterName><ApiCompatEnableRuleAttributesMustMatch>true</ApiCompatEnableRuleAttributesMustMatch>打包时自动验证公共 API 兼容性,防止意外破坏性变更。
SourceLink
<PackageReference Include="Microsoft.SourceLink.GitHub" /><PublishRepositoryUrl>true</PublishRepositoryUrl><EmbedUntrackedSources>true</EmbedUntrackedSources>SourceLink 让消费者在调试时可以步入连接器库源码(源码映射到 GitHub)。