如何从 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 workloadsdotnet workload install android ios tvos maccatalyst wasm-tools文档说明macOS 相关 workloads 不是必须的在 Unix 系统上执行该命令需要 sudo 权限。安装 Nuke 全局工具如果不想装也可以全程用仓库里的./build.shmacOS/Linux或.\build.ps1Windows替代下文中的nukedotnet tool install --global Nuke.GlobalTool另外注意更新本地仓库后要确保子模块是最新的否则可能出问题git submodule update --init --recursive执行步骤用 BuildToNuGetCache 构建并写入本机缓存在仓库根目录执行命令来自 docs/nuget.mdnuke --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),仅供参考
