如何从 Avalonia 源码构建本地 NuGet 包并写入本机 NuGet 缓存?
【免费下载链接】AvaloniaDevelop Desktop, Embedded, Mobile and WebAssembly apps with C# and XAML. The future of .NET UI项目地址: https://gitcode.com/GitHub_Trending/ava/Avalonia
如果你在修改 Avalonia 源码(例如在自己的 fork 上加功能或修 bug),并希望本机的应用项目能直接引用这些改动后的包,手动配置本地 NuGet feed 会很麻烦。Avalonia 的构建系统提供了一个名为BuildToNuGetCache的 Nuke 目标,可以直接把构建产物写入本机 NuGet 全局缓存(通常是~/.nuget/packages),包版本固定为9999.0.0-localbuild。完成这篇文章后,你可以:在源码上做任何修改,重新跑一条命令,本机项目里的 msbuild 就会自动拿到新包。
前提:操作在 Avalonia 仓库根目录进行,使用 .NET 10 SDK 与 Nuke 全局工具(或用仓库自带的build.sh/build.ps1脚本替代nuke命令)。
准备条件:克隆仓库并安装 SDK 与 workloads
以下准备工作来自 docs/build.md:
- 克隆仓库(必须带上子模块):
git clone --recurse-submodules https://github.com/AvaloniaUI/Avalonia.git安装 .NET SDK(注意是 SDK,不是 runtime)。所需版本由仓库根目录的 global.json 指定,当前为
10.0.201且rollForward为latestFeature。Avalonia 不总是跟进最新 SDK,固定使用已知兼容的版本,安装后如果 SDK 大版本不符,构建会直接失败。安装目标平台对应的 .NET workloads:
dotnet workload install android ios tvos maccatalyst wasm-tools文档说明:macOS 相关 workloads 不是必须的;在 Unix 系统上执行该命令需要 sudo 权限。
- 安装 Nuke 全局工具(如果不想装,也可以全程用仓库里的
./build.sh(macOS/Linux)或.\build.ps1(Windows)替代下文中的nuke):
dotnet tool install --global Nuke.GlobalTool另外注意:更新本地仓库后要确保子模块是最新的,否则可能出问题:
git submodule update --init --recursive执行步骤:用 BuildToNuGetCache 构建并写入本机缓存
在仓库根目录执行(命令来自 docs/nuget.md):
nuke --target BuildToNuGetCache --configuration Release这条命令会先生成 NuGet 包,再把它们推送进本机 NuGet 全局缓存,包版本为9999.0.0-localbuild。文档没有说明--configuration Release是否为必选项——BuildToNuGetCache示例命令带了 Release,而普通的CreateNugetPackages默认是 Debug 配置。
在仓库内还提供了一个快捷脚本 nukebuild/build-to-cache.sh,它通过_build.csproj直接跑同一目标,并跳过CompileHtmlPreviewer、Compile、Clean三个任务:
dotnet run --project _build.csproj -- --target BuildToNuGetCache --skip CompileHtmlPreviewer Compile Clean结果验证与增量更新
文档给出的判断方式:
- 缓存位置:全局包缓存(通常是
~/.nuget/packages),每个包位于<packageId 小写>/9999.0.0-localbuild目录。构建完成后可以在该目录下按包名找到版本为9999.0.0-localbuild的文件夹,即代表已写入成功。 - 每次对 Avalonia 源码做了本地改动后,重新运行上面的命令即可:它会替换旧包并重置缓存,msbuild 会自动拿到新构建的包,不需要手动清理缓存或在应用项目里重新还原。
如果你是在 macOS 上构建并且依赖原生库,docs/build.md 说明构建原生库需要安装 Xcode,然后在仓库根目录执行CompileNative任务来构建并安装原生库:
./build.sh CompileNative替代路径:CreateNugetPackages 目标
如果不想直接写缓存,而是把包产出到目录里自行分发,可以使用CreateNugetPackages目标(来自 docs/nuget.md):
# Windows .\build.ps1 CreateNugetPackages # Linux/macOS ./build.sh CreateNugetPackages # 或者已安装 Nuke 全局工具时 nuke CreateNugetPackages生成的 NuGet 包位于artifacts\nuget目录。常用参数:
# 默认是 Debug 配置,加 --configuration 构建 Release nuke CreateNugetPackages --configuration Release # 用 --force-nuget-version 指定包的版本号 nuke CreateNugetPackages --force-nuget-version 11.4.0文档同时列出了这条路径的几个坑,也是BuildToNuGetCache存在的理由:
- 需要在消费方配置一个本地 NuGet feed 才能使用这些包;
- 在非 macOS 系统上构建时,
Avalonia.Native包不会被构建,之后使用Avalonia.Desktop会出现 NuGet 错误; - 版本管理容易出问题。
限制与边界
- 包版本固定为
9999.0.0-localbuild(该常量定义在 nukebuild/BuildParameters.cs),用于本地开发引用,不是可发布的正式版本号;正式发布走的是 docs/release.md 描述的版本发布流程,与本文场景无关。 CreateNugetPackages在非 macOS 上不产出Avalonia.Native包这一点由文档明确列出;文档没有说明BuildToNuGetCache路径是否同样受此影响,需要以实际构建结果为准。- 构建要求 .NET SDK 版本与 global.json 匹配、workloads 已安装;在 IDE 中构建遇到
Error MSB4062 GenerateAvaloniaResourcesTask时,docs/build.md 给出的处理是先手动构建一次Avalonia.Build.Tasks项目,或用 Nuke 完整构建一次解决方案。
【免费下载链接】AvaloniaDevelop Desktop, Embedded, Mobile and WebAssembly apps with C# and XAML. The future of .NET UI项目地址: https://gitcode.com/GitHub_Trending/ava/Avalonia
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考