本地构建

July 25, 2026 · View on GitHub

本文说明如何在本地还原、编译与测试 AspectCore,并解释多目标框架与构建属性(build props)的组织方式。所有命令与配置均以仓库根目录的 AspectCore-Framework.slnbuild/src/tests/ 下的实际文件为准。

1. 环境准备

仓库根目录没有 global.json,因此不锁定具体 SDK 版本,但目标框架决定了你需要安装的 SDK:

  • 测试项目 AspectCore.Core.TestsAspectCore.E2E.Tests 目标框架为 net10.0;net9.0;net8.0;net6.0。要编译并运行完整测试,需要安装 .NET 10 SDK
  • 源码包最低目标框架为 net6.0,其余目标为 net8.0/net9.0/net10.0AspectCore.SourceGenerator 例外,为 netstandard2.0 的 Roslyn 分析器),运行多目标构建时需要相应的 .NET 6/8/9/10 运行时。
  • CI 通过 actions/setup-dotnet 显式安装以下 SDK:6.0.x8.0.x9.0.x10.0.x(见 .github/workflows/build-ci.yml.github/workflows/build-pr-ci.yml)。本地对齐这几个版本即可覆盖所有目标框架。

验证本地 SDK:

dotnet --list-sdks
dotnet --version

2. 还原、编译、测试(解决方案范围)

在仓库根目录对整个解决方案操作:

# 还原 NuGet 依赖
dotnet restore AspectCore-Framework.sln

# 编译(Release 与 CI 一致)
dotnet build AspectCore-Framework.sln -c Release

# 运行全部测试
dotnet test AspectCore-Framework.sln

CI 并不直接对解决方案调用 dotnet build,而是遍历 ./src./tests 下的每个 *.csproj 逐个 build/test(见 build-ci.ymlBuild/Run Tests 步骤)。本地用解决方案范围的命令更方便;如需精确复现 CI,可按项目粒度执行。

3. 按项目 / 按条件运行(更窄的范围)

调试单个模块时,直接指定项目文件,避免全量编译:

# 只编译核心包
dotnet build src/AspectCore.Core/AspectCore.Core.csproj -c Release

# 只测试核心单元测试项目
dotnet test tests/AspectCore.Core.Tests/AspectCore.Core.Tests.csproj

# 只跑双引擎一致性(EngineParity)相关用例
dotnet test tests/AspectCore.Core.Tests/AspectCore.Core.Tests.csproj \
  --filter "FullyQualifiedName~EngineParity"

# 只在单个目标框架上测试,缩短反馈时间
dotnet test tests/AspectCore.Core.Tests/AspectCore.Core.Tests.csproj -f net8.0

更多筛选与覆盖率采集示例见 运行测试

4. 目标框架说明

不同项目按用途选择目标框架,具体以各 *.csproj 为准:

项目目标框架说明
AspectCore.AbstractionsAspectCore.CoreAspectCore.Extensions.Reflectionnet10.0;net9.0;net8.0;net6.0核心包多目标,最低支持 net6.0
AspectCore.SourceGeneratornetstandard2.0编译时引擎需以 netstandard2.0 供 Roslyn 加载;LangVersion=latest
AspectCore.Extensions.AspNetCorenet10.0;net9.0;net8.0;net6.0net6.0 及以上
容器/宿主等扩展包以各 *.csproj 为准:大多为 net10.0;net9.0;net8.0;net6.0,其中 AspectCore.Extensions.CastleCompat 例外为 net10.0;net9.0;net8.0(不含 net6.0详见 项目结构模块与包结构设计
测试项目多为 net10.0;net9.0;net8.0;net6.0net9.0;net8.0;net6.0具体差异见 测试策略

多目标构建会为每个目标框架各产出一份程序集;因此本地缺少某个运行时会导致该目标框架的编译或测试步骤失败。

5. 构建属性(build props)布局

构建配置集中在 build/ 目录与两个 Directory.Build.props,各 *.csproj 通过 Import 引入:

  • build/version.props — 产品版本。当前 VersionMajor=3VersionMinor=0VersionPatch=0VersionQuality=rc.1,因此 VersionPrefix=3.0.0VersionSuffix=rc.1。CI 在无 Git tag 时追加 -preview-<时间戳>
  • build/common.props — 公共包元数据(Authors=LemonProduct=AspectCore Framework、仓库地址等),并 Importsign.propsversion.props。其中设置 LangVersion=13.0;注释说明:13.0 启用了 NativeAOT AOP 支持所需的默认接口方法、静态抽象成员等现代特性,同时保持与最低目标框架 net6.0 的兼容。核心包源码即在此约束下编写。
  • build/sign.propsbuild/aspectcore.snk — 强名称签名配置与密钥。
  • src/Directory.Build.props — 对 src/ 下所有项目启用 .NET 分析器(EnableNETAnalyzers=trueAnalysisLevel=latestAnalysisMode=DefaultEnforceExtendedAnalyzerRules=true)。这些是提示性诊断,不作为硬性失败门槛。
  • tests/Directory.Build.props — 为所有测试项目统一引入 coverlet.msbuild(版本 6.0.2PrivateAssets=all),用于覆盖率采集。

仓库根目录没有 Directory.Build.propssrc/tests/ 各自的 props 仅作用于其子目录。AspectCore.SourceGenerator 单独把 LangVersion 覆盖为 latest

相关文档