AutoGen.NET 打包完全指南:从 dotnet pack 到 NuGet 包元数据与版本管理
【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen
本文为 AutoGen 仓库 .NET SDK(AutoGen.NET)的打包维护指南,覆盖完整的手动打包流程(dotnet restore→dotnet build→dotnet pack)、新项目如何接入 NuGet 打包列表、以及双版本线(VersionPrefix/VersionPrefixForAutoGen0_2)的版本机制。读完本篇,你能够独立产出自签名的.nupkg与符号包.snupkg,并理解仓库中 MSBuild 属性文件如何协同决定包的元数据、目标框架与版本号。
前置条件
打包 AutoGen.NET 只需要 ** .NET SDK**。仓库通过 global.json 锁定了 SDK 版本要求:
{ "sdk": { "version": "9.0.100", "rollForward": "latestFeature" } }即要求 .NET 9.0.100 及以上同 Feature Band 内的版本(rollForward: latestFeature允许向上滚动到最新特性版本)。所有命令均应在 dotnet/AutoGen.sln 所在目录(即仓库根目录下的dotnet/目录)下执行。
创建 NuGet 包
完整的打包流程分三步:还原、以 Release 配置构建、再执行 pack。
第一步:还原依赖并构建
dotnet restore dotnet build --configuration Release --no-restore--no-restore表示构建阶段不再触发隐式还原,保证还原与构建两步的职责分离(还原结果可复用,构建更快)。
第二步:执行 dotnet pack
dotnet pack --configuration Release --no-build同样地,--no-build让 pack 直接复用上一步的 Release 构建产物,不会重新编译。执行完成后,.nupkg包与符号包.snupkg会同时生成在./artifacts/package/release目录中。
这个输出路径并非默认行为,而是由 Directory.Build.props 中的以下属性决定的:
<UseArtifactsOutput>true</UseArtifactsOutput>UseArtifactsOutput是 .NET SDK 的 "Artifacts 布局" 开关:启用后,构建产物按artifacts/bin/<项目名>/<配置>/统一输出,包文件则固定落在artifacts/package/<配置>/,避免各项目的bin/obj目录散落,也使 CI 与本地打包的产物路径可预期。
符号包(.snupkg)是怎么来的
dotnet/nuget目录中的 nuget-package.props 为所有参与打包的项目统一启用了符号包与 SourceLink:
<!-- Build symbol package (.snupkg) to distribute the PDB containing Source Link --> <IncludeSymbols>true</IncludeSymbols> <SymbolPackageFormat>snupkg</SymbolPackageFormat> <!-- Optional: Embed source files that are not tracked by the source control manager in the PDB --> <EmbedUntrackedSources>true</EmbedUntrackedSources><ItemGroup> <PackageReference Include="Microsoft.SourceLink.GitHub" PrivateAssets="All" /> </ItemGroup>这意味着发布的 PDB 内嵌了 SourceLink 映射,下游消费者可以在调试器中直接跳转到 AutoGen.NET 的托管源码。PrivateAssets="All"保证 SourceLink 只是构建期工具,不会进入发布包的依赖清单。
将新项目加入打包列表
这是一个容易被忽视的坑:把新的.csproj加入 AutoGen.sln 后,它默认不会被dotnet pack打包。原因在于仓库级的 Directory.Build.props 对全部项目显式设置了:
<IsPackable>false</IsPackable>要让某个项目参与打包,需要在新项目的.csproj中显式导入 NuGet 属性文件:
<Import Project="$(RepoRoot)/nuget/nuget-package.props" />其中$(RepoRoot)在 Directory.Build.props 中被定义为dotnet/目录本身($(MSBuildThisFileDirectory)),因此这条导入路径对仓库内任意深度的项目都成立。
nuget-package.props 提供了什么
dotnet/nuget/nuget-package.props 做了三件事:
- 把
IsPackable翻回true,使dotnet pack会处理该项目; - 设置统一的包元数据,包括
Authors=Microsoft、Product=AutoGen、Description=A programming framework for agentic AI、PackageId=$(AssemblyName)、PackageLicenseExpression=MIT、RepositoryUrl、PublishRepositoryUrl等,各包可在自己的.csproj中覆盖Title和Description(例如 AutoGen.Core.csproj 覆盖了 "Core library for AutoGen..." 的描述); - 把 nuget/icon.png 与 nuget/NUGET.md 打入包内,作为 NuGet 页面上的图标与 readme:
<ItemGroup> <None Include="$(RepoRoot)nuget/icon.png" Link="icon.png" Pack="true" PackagePath="." /> <None Include="$(RepoRoot)nuget/NUGET.md" Link="NUGET.md" Pack="true" PackagePath="." /> </ItemGroup>NUGET.md是 NuGet 包页展示的 readme 文案(介绍 AutoGen for .NET SDK、文档站点与 nightly build 渠道),目录说明见 nuget/README.md。
Release 配置下自动打包
nuget-package.props 还有一个条件属性值得注意:
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> </PropertyGroup>也就是说,对已导入该 props 的项目,一次dotnet build --configuration Release就会顺带产出.nupkg,后续的dotnet pack --no-build主要起汇总与校验作用。
项目自带 README 的处理
Directory.Build.targets 还提供了一个自动行为:若某可打包项目的目录下存在README.md,它会被自动作为该项目的PackageReadmeFile打入包内(优先级低于nuget-package.props中显式设置的NUGET.md,因为条件判断$(PackageReadmeFile) == ''只在尚未设置时生效)。
当前已接入打包的项目
在仓库中搜索该导入语句可以确认,目前有 24 个项目接入了打包列表,涵盖两条产品线:
- AutoGen 0.2 系列:
AutoGen、AutoGen.Core、AutoGen.OpenAI、AutoGen.OpenAI.V1、AutoGen.Anthropic、AutoGen.Gemini、AutoGen.Mistral、AutoGen.Ollama、AutoGen.LMStudio、AutoGen.SemanticKernel、AutoGen.AzureAIInference、AutoGen.DotnetInteractive、AutoGen.WebAPI、AutoGen.SourceGenerator; - Microsoft.AutoGen 系列(AutoGen 0.4 新架构):
Microsoft.AutoGen.Contracts、Microsoft.AutoGen.Core、Microsoft.AutoGen.Core.Grpc、Microsoft.AutoGen.AgentChat、Microsoft.AutoGen.AgentHost、Microsoft.AutoGen.Agents、Microsoft.AutoGen.RuntimeGateway.Grpc及若干 Extensions 项目。
可以推断:Microsoft.AutoGen.*项目名不以AutoGen开头(注意前缀是Microsoft.),因此不受 0.2 版本号条件影响(见下一节)。
包版本管理
包版本由 eng/MetaInfo.props 集中定义,当前值为:
<VersionPrefix>0.4.0</VersionPrefix> <VersionPrefixForAutoGen0_2>0.2.3</VersionPrefixForAutoGen0_2>版本分配规则在 Directory.Build.props 中实现:
<PropertyGroup Condition="'$(MSBuildProjectName.StartsWith(`AutoGen`))' == 'true'"> <VersionPrefix>$(VersionPrefixForAutoGen0_2)</VersionPrefix> <IsAutoGen0_2>true</IsAutoGen0_2> </PropertyGroup>即:项目名以AutoGen开头的,版本取VersionPrefixForAutoGen0_2(当前 0.2.3);否则取VersionPrefix(当前 0.4.0)。这与上文的项目清单对应:所有AutoGen.*包走 0.2.x 版本线,Microsoft.AutoGen.*包走 0.4.x 版本线,两条产品线在同一个解决方案中并行演进、互不干扰。
此外还有两条影响打包行为的仓库级设置:
- 双目标框架:
<PackageTargetFrameworks>netstandard2.0;net8.0</PackageTargetFrameworks>(见 Directory.Build.props),因此AutoGen.*系列包同时携带netstandard2.0与net8.0两个资产的 lib 目录;而像 Microsoft.AutoGen.Core.csproj 这样的新架构项目则单独指定<TargetFramework>net8.0</TargetFramework>,只产出单一目标框架的资产。 - 强名称签名:所有程序集统一使用 eng/opensource.snk 签名(
SignAssembly=True),保证包内程序集身份稳定。
依赖来源由仓库根部的 NuGet.config 锁定为官方nuget.org源(<clear />清空了其他源),还原行为是确定的。
小结:打包流程与文件职责速查
| 文件 | 在打包链路中的职责 |
|---|---|
| dotnet/eng/MetaInfo.props | 定义VersionPrefix(0.4.0)与VersionPrefixForAutoGen0_2(0.2.3) |
| dotnet/Directory.Build.props | 全局IsPackable=false、Artifacts 输出布局、双目标框架、按项目名分配版本线、强名称签名 |
| dotnet/nuget/nuget-package.props | 接入打包的"开关":IsPackable=true+ 统一元数据 + 图标/readme + 符号包与 SourceLink |
| dotnet/Directory.Build.targets | 自动将项目本地README.md作为包 readme |
| dotnet/NuGet.config | 固定还原源为 nuget.org |
整体流程可以概括为:先确认 .NET SDK 满足 global.json 要求,然后在dotnet/目录执行
dotnet restore dotnet build --configuration Release --no-restore dotnet pack --configuration Release --no-build到./artifacts/package/release收取.nupkg与.snupkg即可。新增可打包项目时,只需在其.csproj中加入一行<Import Project="$(RepoRoot)/nuget/nuget-package.props" />,并按项目名前缀确认它落在哪条版本线上。
【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考