使用 C# 的单一仓库:代码组织与最佳实践
在现代 C# (.NET) 开发中,单一仓库(monorepo)方法越来越常用。与每个项目都拥有自己 Git 仓库的多仓库不同,单一仓库将公司或产品的所有代码存储在一个中央存储库中。对于 .NET 开发者来说,这意味着统一的解决方案(solution)、共享库以及简化的 CI/CD 配置。在本文中,我们将分析如何正确组织使用 C# 的单一仓库,提供代码示例,并讨论其关键优势。
1. 单一仓库对 .NET 的优势
单一仓库对于处理多个相关 .NET 项目(如微服务、Web 应用程序、类库)的团队特别有用。主要优点包括:
- 统一的依赖版本 — 所有项目使用相同版本的 NuGet 包,从而消除冲突。
- 简化的重构 — 对公共接口或数据模型的更改会立即应用于所有消费者。
- 共享的 Git 历史 — 影响多个项目的原子提交可以在一个地方看到。
- 集中式 CI/CD — 用于构建、测试和部署所有组件的单一 pipeline。
对于 C#,单一仓库是围绕一个单一的 .sln 文件(解决方案)构建的,该文件引用所有项目。这允许使用 Visual Studio 和 .NET CLI 的内置工具来管理依赖关系。
2. C# 单一仓库的结构
让我们考虑一个典型的 .NET 解决方案的单一仓库结构。它可能看起来像这样:
MyCompany/├── src/│ ├── MyCompany.Common/ # 公共库│ │ ├── MyCompany.Common.csproj│ │ └── ...│ ├── MyCompany.WebApi/ # Web API│ │ ├── MyCompany.WebApi.csproj│ │ └── ...│ └── MyCompany.BackgroundJob/ # 后台服务│ ├── MyCompany.BackgroundJob.csproj│ └── ...├── tests/│ ├── MyCompany.Common.Tests/│ ├── MyCompany.WebApi.Tests/│ └── MyCompany.BackgroundJob.Tests/├── docs/ # 文档├── scripts/ # CI/CD 脚本├── .gitignore└── MyCompany.sln # 统一解决方案此结构的关键元素:
- src/ — 源代码文件夹。每个项目都是一个单独的文件夹,包含其自己的 .csproj 文件。
- tests/ — 测试文件夹。测试项目的名称与主项目名称相同,并带有 .Tests 后缀。
- docs/ — 文档(README、架构决策)。
- scripts/ — 用于自动化构建或部署的脚本。
- MyCompany.sln — 包含所有项目的统一解决方案文件。
这种结构简化了导航,并允许在不更改根配置的情况下轻松添加新项目。
3. 设置统一解决方案和共享依赖项
要在 .NET 中创建单一仓库,请使用 dotnet new sln 命令,然后添加项目:
# 创建根文件夹并进入mkdir MyCompany && cd MyCompany
# 创建空的解决方案文件dotnet new sln -n MyCompany
# 创建文件夹结构mkdir src tests docs scripts
# 创建项目dotnet new classlib -n MyCompany.Common -o src/MyCompany.Commondotnet new webapi -n MyCompany.WebApi -o src/MyCompany.WebApidotnet new console -n MyCompany.BackgroundJob -o src/MyCompany.BackgroundJob
# 将项目添加到解决方案dotnet sln add src/MyCompany.Common/MyCompany.Common.csprojdotnet sln add src/MyCompany.WebApi/MyCompany.WebApi.csprojdotnet sln add src/MyCompany.BackgroundJob/MyCompany.BackgroundJob.csproj现在,让我们从 Web API 添加对公共库的引用: