其他
用 dotnet CLI 和中央包管理(CPM)管理…
在 .NET 项目中添加、删除、更新 NuGet 包或统一多项目版本时,用 CLI 命令配合 Directory.Packages.props 集中管理版本。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 47/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 47/100 ×0.15
适用场景
用 dotnet CLI 和中央包管理(通用
解决思路
- 始终用 dotnet CLI 命令管理包,绝不手动编辑 .csproj 或 Directory.Packages.props 文件;CLI 会校验包是否存在、解析正确版本、处理传递依赖、更新锁文件并避免 XML 拼写错误。
- 在解决方案根目录创建 Directory.Packages.props 启用 CPM:在 PropertyGroup 中设置 <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>,并在 ItemGroup 中用 <PackageVersion Include="..." Version="..." /> 声明所有包版本。
- 启用 CPM 后,项目文件中的 <PackageReference Include="..." /> 不写 Version 属性,版本统一从 Directory.Packages.props 获取。
- 用 dotnet add package <name> 添加包时,CLI 会同时写入 Directory.Packages.props 的 PackageVersion 和项目文件的 PackageReference(无版本)。
- 用共享版本变量分组相关包:在 PropertyGroup Label="SharedVersions" 中定义如 <AkkaVersion>1.5.59</AkkaVersion>,然后在 PackageVersion 中用 Version="$(AkkaVersion)" 引用,并用带 Label 的 ItemGroup 按生态(Akka.NET、Aspire、OpenTelemetry、Testing)分组。
- 添加包:dotnet add package Serilog(最新稳定版)、dotnet add package Serilog --version 4.0.0(指定版本)、dotnet add package Serilog --prerelease(预发布版)、dotnet add src/MyApp/MyApp.csproj package Serilog(指定项目)。
- 删除包:dotnet remove package Serilog 或 dotnet remove src/MyApp/MyApp.csproj package Serilog。
- 列出包:dotnet list package、dotnet list package --outdated、dotnet list package --include-transitive、dotnet list package --vulnerable、dotnet list package --deprecated。
- 更新包:CPM 下编辑 Directory.Packages.props 中的版本后执行 dotnet restore;非 CPM 下先 dotnet remove package 再 dotnet add package --version;推荐安装 dotnet tool install --global dotnet-outdated-tool 后运行 dotnet outdated --upgrade。
- 恢复与清理:dotnet restore、dotnet nuget locals all --clear(清缓存)、dotnet restore --force(忽略缓存强制恢复)。
- 管理包源:dotnet nuget list source 查看;dotnet nuget add source <url> --name MyFeed --username az --password $PAT --store-password-in-clear-text 添加私有源;或在解决方案中创建 NuGet.config,用 <clear /> 清除默认源并添加 nuget.org 与私有源,凭据用 %NUGET_PAT% 环境变量引用。
- 开发专用包:在 Directory.Packages.props 声明 PackageVersion,在项目文件中用 <PackageReference Include="..." PrivateAssets="All" /> 标记为开发依赖。
- 条件包:用 <ItemGroup Condition="'$(Configuration)' == 'Debug'"> 或 Condition="'$(TargetFramework)' == 'net8.0'" 按配置或目标框架引入包。
- 版本覆盖逃生舱:仅在极少数情况下用 <PackageReference Include="..." VersionOverride="12.0.3" /> 为单个项目覆盖 CPM 版本,注意这会被 Slopwatch 检测为潜在 slop。
- 排查版本冲突:dotnet list package --include-transitive 查看完整依赖树,配合 grep -i "PackageName" 定位来源。
- 排查恢复失败:dotnet nuget locals all --clear 清缓存、dotnet restore --verbosity detailed 详细日志、检查 packages.lock.json。
- 可复现构建:在 Directory.Build.props 中设置 <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>,并提交 packages.lock.json 文件。
- 避免反模式:不手改 XML、不在 CPM 下内联 Version、不混用 CPM 与内联版本、不让相关包使用不同版本(必须用共享变量)。
适用边界 · 注意事项
- 遗留大型解决方案:迁移到 CPM 会一次性暴露所有版本冲突,部分包可能有意的版本差异,需增量迁移或保留按项目版本管理。
- 需要版本范围(如 [13.0,14.0))的场景:CPM 只支持精确版本,不支持版本范围。
- 使用旧版 .NET SDK(低于 6.0.300)、NuGet(低于 6.2)或 Visual Studio 2022 17.2 以下,以及跨多个独立构建仓库的解决方案,CPM 不适用或无法统一管理。