Cursor rule
.cursor/rules/package-management.mdcCodeSpirit 包管理规范 - 集中式包管理、版本统一、冗余引用处理
Cursor rules
Quality
74/100
Scores the file, not the repository.Length
505 words
33 headings · 9 code blocksRepository
56
— · pushed 134 days agoLast changed
3 days ago
First indexed 3 days ago.1234567# CodeSpirit 包管理规范89## 集中式包管理(Central Package Management)1011项目已启用集中式包管理,所有包版本在 `Directory.Packages.props` 文件中统一管理。1213### 工作原理14151. **版本定义**: 在 `Directory.Packages.props` 中使用 `<PackageVersion>` 定义所有包版本162. **项目引用**: 在项目文件中使用 `<PackageReference Include="PackageName" />`,**不指定 Version**173. **自动应用**: MSBuild 自动从 `Directory.Packages.props` 获取版本1819### 添加新包2021**步骤 1**: 在 `Directory.Packages.props` 中添加包版本2223```xml24<ItemGroup>25 <!-- 按功能分类添加 -->26 <PackageVersion Include="NewPackage" Version="1.0.0" />27</ItemGroup>28```2930**步骤 2**: 在项目文件中添加包引用(不指定版本)3132```xml33<ItemGroup>34 <PackageReference Include="NewPackage" />35</ItemGroup>36```3738### 版本覆盖(特殊情况)3940仅在必要时使用 `VersionOverride`,并添加注释说明原因:4142```xml43<!-- 注意:Aspire.Microsoft.EntityFrameworkCore.SqlServer 13.0.2 需要 EF Core 10.0.0 -->44<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" VersionOverride="10.0.0" />45```4647**使用 VersionOverride 的场景**:48- Aspire EF Core 集成包需要特定版本的 EF Core49- 特定项目需要不同版本的包(应尽量避免)5051## 包版本策略5253### 版本更新原则54551. **补丁版本更新**(推荐)56 - 如:`9.0.9` → `9.0.10`57 - 通常只包含 bug 修复,风险较低58592. **小版本更新**(谨慎)60 - 如:`9.0.x` → `9.1.x`61 - 可能包含新功能和 API 变化,需要测试62633. **大版本更新**(充分测试)64 - 如:`9.x` → `10.x`65 - 通常包含破坏性更改,需要全面测试6667### 当前统一版本6869主要包的统一版本(详见 `Directory.Packages.props`):7071- **Aspire 包**: `13.0.2`(部分使用 `13.1.0`)72- **Entity Framework Core**: `9.0.9`(使用 Aspire EF Core 集成的项目使用 `10.0.0`)73- **Microsoft Extensions**: `10.0.0`74- **OpenTelemetry**: `1.11.1`75- **StackExchange.Redis**: `2.9.32`76- **Newtonsoft.Json**: `13.0.3`77- **AutoMapper**: `13.0.1`78- **FluentValidation**: `11.11.0`7980## 传递依赖处理8182### 识别传递依赖8384使用以下命令查看传递依赖:8586```bash87dotnet list package --include-transitive88```8990### 常见传递依赖9192以下包通过项目引用传递可用,通常不需要显式引用:9394#### 通过 `CodeSpirit.Shared` 传递9596- `Newtonsoft.Json`97- `Microsoft.EntityFrameworkCore.SqlServer`98- `Microsoft.EntityFrameworkCore`99- `Pomelo.EntityFrameworkCore.MySql`100- `LinqKit.Core`101- `RabbitMQ.Client`102- `Aspire.RabbitMQ.Client`103- `StackExchange.Redis`104- `ClosedXML`105- `Polly`106- `Scrutor`107- `System.Linq.Dynamic.Core`108109#### 通过 `CodeSpirit.ServiceDefaults` 传递110111- `Aspire.Seq`112- `Aspire.StackExchange.Redis.DistributedCaching`113- `Microsoft.Extensions.Diagnostics.HealthChecks`114- `Microsoft.Extensions.Http.Resilience`115- `Microsoft.Extensions.ServiceDiscovery`116- `OpenTelemetry.*` 相关包117118#### 通过 `FrameworkReference` 提供(.NET 10)119120- `Microsoft.AspNetCore.Http.Abstractions`121- `Microsoft.AspNetCore.Mvc.Core`122- 大部分 `Microsoft.AspNetCore.*` 包123124### 何时需要显式引用125126以下情况需要显式引用传递依赖:1271281. **需要特定版本**129 - 使用 `VersionOverride` 覆盖传递的版本1301312. **需要特定 API**132 - 如果项目直接使用包的公共 API,建议显式引用1331343. **避免版本冲突**135 - 当传递依赖版本与项目需求不匹配时1361374. **工具包**138 - 如 `Microsoft.EntityFrameworkCore.Design`、`Microsoft.EntityFrameworkCore.Tools`139 - 这些包需要显式引用并设置 `PrivateAssets`140141## 包分类组织142143`Directory.Packages.props` 中的包按以下分类组织:1441451. **Aspire 包** - Aspire 框架相关1462. **Entity Framework Core** - EF Core 相关1473. **Microsoft Extensions** - Microsoft.Extensions.* 包1484. **Microsoft ASP.NET Core** - Microsoft.AspNetCore.* 包1495. **OpenTelemetry** - 监控和追踪1506. **缓存和消息队列** - Redis、RabbitMQ1517. **工具和库** - 第三方工具包1528. **FluentValidation** - 验证框架1539. **其他工具包** - 各种工具库15410. **云服务 SDK** - 云服务集成15511. **开发工具** - 开发时使用的工具15612. **测试框架包** - 测试相关包157158## 最佳实践159160### 添加新包1611621. ✅ 先检查 `Directory.Packages.props` 是否已存在该包1632. ✅ 如果存在,直接使用现有版本1643. ✅ 如果不存在,添加到 `Directory.Packages.props` 的相应分类1654. ✅ 在项目文件中只引用包名,不指定版本1665. ✅ 添加注释说明包的用途(如需要)167168### 更新包版本1691701. ✅ 在 `Directory.Packages.props` 中更新版本1712. ✅ 运行 `dotnet restore` 验证兼容性1723. ✅ 运行 `dotnet build` 确保构建成功1734. ✅ 运行 `aspire run` 验证运行时功能174175### 移除包引用1761771. ✅ 检查是否通过传递依赖可用1782. ✅ 使用 `dotnet list package --include-transitive` 确认1793. ✅ 移除后立即构建验证1804. ✅ 如果编译失败,说明需要显式引用181182### 版本冲突处理1831841. ✅ 优先统一版本到最新补丁版本1852. ✅ 必要时使用 `VersionOverride`(添加注释)1863. ✅ 考虑升级相关包到兼容版本1874. ✅ 记录版本冲突原因和解决方案188189## 工具和命令190191### 检查过时的包192193```bash194dotnet list package --outdated195```196197### 查看传递依赖198199```bash200dotnet list package --include-transitive201```202203### 查看特定项目的包204205```bash206dotnet list package --project Src/ApiServices/CodeSpirit.ExamApi/CodeSpirit.ExamApi.csproj207```208209### 还原包210211```bash212dotnet restore213```214215### 构建验证216217```bash218dotnet build219```220221## 常见问题222223### Q: 如何知道一个包是否通过传递依赖可用?224225A: 使用 `dotnet list package --include-transitive` 查看。如果包出现在传递依赖列表中,通常不需要显式引用。226227### Q: 为什么有些包显示"可能不需要"的警告?228229A: NuGet 的静态分析可能误判。如果项目确实使用了包的 API,应保留引用。建议通过代码搜索验证实际使用情况。230231### Q: 如何更新所有包到最新版本?232233A:2341. 使用 `dotnet outdated-tool` 分析2352. 在 `Directory.Packages.props` 中逐个更新版本2363. 每次更新后构建验证2374. 优先更新补丁版本,谨慎更新小版本和大版本238239### Q: 版本冲突如何解决?240241A:2421. 优先统一到最新补丁版本2432. 必要时使用 `VersionOverride`(添加注释说明)2443. 考虑升级相关包到兼容版本2454. 记录冲突原因和解决方案246247## 参考文档248249- [NuGet Central Package Management](https://learn.microsoft.com/nuget/consume-packages/central-package-management)250- [Directory.Packages.props 文件](../../Directory.Packages.props)251- [包管理优化报告](../../Docs/PackageOptimizationReport.md)
Also in xin-lai/CodeSpirit
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| xin-lai/CodeSpirit.cursor/rules/js.mdc · 56 | Cursor rules | apidocs | 46/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/ai-development.mdc · 56 | Cursor rules | api | 46/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/all.mdc · 56 | Cursor rules | testing-strategyapi | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/amis-cards.mdc · 56 | Cursor rules | no sections | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/api-design.mdc · 56 | Cursor rules | no sections | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/controller.mdc · 56 | Cursor rules | api | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/cs.mdc · 56 | Cursor rules | no sections | 25/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/csproj.mdc · 56 | Cursor rules | api | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/css.mdc · 56 | Cursor rules | ui | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/database.mdc · 56 | Cursor rules | no sections | 74/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/dependency-injection.mdc · 56 | Cursor rules | api | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/dto.mdc · 56 | Cursor rules | no sections | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/enum.mdc · 56 | Cursor rules | no sections | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/i18n.mdc · 56 | Cursor rules | no sections | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/naming-conventions.mdc · 56 | Cursor rules | no sections | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/performance.mdc · 56 | Cursor rules | no sections | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/project-structure.mdc · 56 | Cursor rules | api | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/security.mdc · 56 | Cursor rules | database | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/service.mdc · 56 | Cursor rules | no sections | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/startup-framework.mdc · 56 | Cursor rules | api | 54/100 | 3 days ago |
Diff against .cursor/rules/js.mdc Diff against .cursor/rules/ai-development.mdc Diff against .cursor/rules/all.mdc Diff against .cursor/rules/amis-cards.mdc Diff against .cursor/rules/api-design.mdc Diff against .cursor/rules/controller.mdc Diff against .cursor/rules/cs.mdc Diff against .cursor/rules/csproj.mdc Diff against .cursor/rules/css.mdc Diff against .cursor/rules/database.mdc Diff against .cursor/rules/dependency-injection.mdc Diff against .cursor/rules/dto.mdc Diff against .cursor/rules/enum.mdc Diff against .cursor/rules/i18n.mdc Diff against .cursor/rules/naming-conventions.mdc Diff against .cursor/rules/performance.mdc Diff against .cursor/rules/project-structure.mdc Diff against .cursor/rules/security.mdc Diff against .cursor/rules/service.mdc Diff against .cursor/rules/startup-framework.mdc
Similar configs
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| hiromaily/go-crypto-wallet.cursor/rules/typescript.mdc · 126 | Cursor rules | setupbuildtestlint-format+6 | 100/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45 | Cursor rules | testlint-formatstylearch+5 | 100/100 | 3 days ago | |
| markstev/mark-starter.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+6 | 99/100 | 3 days ago | |
| Allymahmoud/case-intake-platform.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| deifos/clipmira-subtitles.cursor/rules/frontend.mdc · 1 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| dodgecfr/combatfilms-webapp.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| langflow-ai/langflow.cursor/rules/docs_development.mdc · 153k | Cursor rules | setupbuildtestlint-format+7 | 97/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45 | Cursor rules | teststyletesting-strategysecurity+3 | 97/100 | 3 days ago |
