news 2026/9/11 17:42:22

如何从 Avalonia 源码构建本地 NuGet 包并写入本机 NuGet 缓存?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何从 Avalonia 源码构建本地 NuGet 包并写入本机 NuGet 缓存?

如何从 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:

  1. 克隆仓库(必须带上子模块):
git clone --recurse-submodules https://github.com/AvaloniaUI/Avalonia.git
  1. 安装 .NET SDK(注意是 SDK,不是 runtime)。所需版本由仓库根目录的 global.json 指定,当前为10.0.201rollForwardlatestFeature。Avalonia 不总是跟进最新 SDK,固定使用已知兼容的版本,安装后如果 SDK 大版本不符,构建会直接失败。

  2. 安装目标平台对应的 .NET workloads:

dotnet workload install android ios tvos maccatalyst wasm-tools

文档说明:macOS 相关 workloads 不是必须的;在 Unix 系统上执行该命令需要 sudo 权限。

  1. 安装 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直接跑同一目标,并跳过CompileHtmlPreviewerCompileClean三个任务:

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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 17:40:34

用一句自然语言驱动浏览器:Midscene 完整指南

用一句自然语言驱动浏览器&#xff1a;Midscene 完整指南 【免费下载链接】midscene GUI Agent for E2E Testing 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 每天早上登录后台、核对页面数据、截图存档——这套动作你每天在做吗&#xff1f;Midscene …

作者头像 李华
网站建设 2026/9/11 17:40:33

C++与FPGA协同设计:原理、优化与实践

1. C与FPGA协同设计概述 在嵌入式系统和高性能计算领域&#xff0c;C与FPGA的协同设计已经成为一种强大的技术组合。这种设计模式充分利用了C在算法开发上的灵活性和FPGA在并行计算上的硬件优势&#xff0c;特别适合需要低延迟、高吞吐量的应用场景。 我最初接触这种设计方式是…

作者头像 李华
网站建设 2026/9/11 17:39:35

兰州市30米DEM数据处理与地形分析实战指南

简介&#xff1a;本资源为甘肃省兰州市30米分辨率数字高程模型&#xff08;DEM&#xff09;地理信息数据集&#xff0c;面向GIS初学者、城市规划与环境分析从业者及遥感教学实践者&#xff0c;解决地形建模、空间分析与区域可视化等基础应用需求。压缩包共12个文件&#xff0c;…

作者头像 李华
网站建设 2026/9/11 17:38:41

JAVA毕业设计-基于SpringBoot的甜点蛋糕商城系统的设计与实现 基于SpringBoot的烘焙销售服务系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/11 17:38:23

Flink基础之Sink API详解及代码实战演练:数据出口的最后一公里

摘要 讲透 Flink Sink API 的完整体系&#xff1a;print 调试输出、KafkaSink / FileSink / JdbcSink 生产级 Connector、新 Sink API 的 SinkWriter 与 SinkCommitter 两阶段提交机制、输出一致性三种语义&#xff08;at-least-once / 幂等 / exactly-once&#xff09;的选型&…

作者头像 李华