新闻详情

新闻详情

首页 / 资讯中心 / 详情

Squirrel.Windows NuGet 包元数据完全指南:Id、Title、Version、IconUrl 与 Language 的实战解析

发布时间:2026/9/27 21:17:31来源:尧图网络
Squirrel.Windows NuGet 包元数据完全指南:Id、Title、Version、IconUrl 与 Language 的实战解析
开发工具【免费下载链接】Squirrel.WindowsAn installation and update framework for Windows desktop apps项目地址https://gitcode.com/gh_mirrors/sq/Squirrel.Windows点击查看免费下载导读Squirrel.Windows 是一套面向 Windows 桌面应用的安装与更新框架它在生成安装程序Setup.exe、创建桌面/开始菜单快捷方式以及注册 Windows 程序和功能Programs and Features卸载条目时会同时从应用 EXE 的版本资源和 NuGet 包的元数据nuspec中提取信息。本文以官方文档 docs/using/nuget-package-metadata.md 为主体逐字段讲解Id、Title、Version、IconUrl、Language五项元数据的作用、取值来源与注意事项并结合仓库源码揭示这些字段在安装、卸载与打包链路中的真实调用关系帮助你正确配置 nuspec避免踩坑。一、元数据从何而来EXE 与 nuspec 的双输入模型Squirrel 的安装与卸载 UI 所需信息有两个来源见 nuget-package-metadata.md应用的 EXE 文件主要指通过rcedit.exe等工具写入 PE 资源的版本信息CompanyName、FileDescription、ProductName 等。在 src/Update/Program.cs 的setPEVersionInfoAndIcon方法中--releasify流程会用rcedit.exe将 nuspec 中的authors、description、summary、copyright、version等数据回写到 EXE 资源中。NuGet 包元数据nuspec打包时由 nuspec 的metadata节点提供Squirrel 运行期通过 NuGet 的ZipPackage读取参见 src/Squirrel/ReleaseEntry.cs 中GetIconUrl对zp.IconUrl的读取。两个输入互为补充但 nuspec 元数据是主干本文重点讨论后者。二、Id应用标识决定安装目录与发布包文件名Id是应用在 Squirrel 体系中的唯一标识直接影响两个关键产物发布包文件名--releasify生成的包命名为Id-Version-full.nupkg与Id-Version-delta.nupkg。该命名逻辑在 src/Squirrel/ReleasePackage.cs 中实现return String.Format({0}-{1}-full.nupkg, zp.Id, zp.Version);例如Id MyApp、Version 1.0.0时生成MyApp-1.0.0-full.nupkg。本地安装目录应用被安装到%LocalAppData%\Id目录如%LocalAppData%\MyApp对应官方文档 docs/using/naming.md 中的 Local Install location 一节。⚠️ 命名警告issue #523Id严禁包含空格和点.。空格与点会在包名解析src/Squirrel/ReleaseEntry.cs 用正则^([\w-])-\d\..\.nupkg$解析PackageName、目录创建、快捷方式命名等多个环节引发问题。另外在 src/Squirrel/UpdateManager.ApplyReleases.cs 中Squirrel 用com.squirrel.{Id}.{exeName}生成 AppUserModelID 时会显式Replace( , )去除空格可见空格是需要规避的字符。三、TitleWindows 卸载程序中显示的应用名Title用于Windows 应用程序卸载程序Programs and Features中显示的应用名称也就是上图中 Name 列的内容。源码层面的证据位于 src/Squirrel/UpdateManager.InstallHelpers.cs写入卸载注册表的DisplayName取值为new { Key DisplayName, Value zp.Title ?? zp.Description ?? zp.Summary },即优先使用Title缺失时依次回退到Description、Summary。同时 src/Squirrel/UpdateManager.ApplyReleases.cs 的linkTargetForVersionInfo显示快捷方式名称.lnk的命名优先级为EXE 的ProductName→ 包Title→ EXE 的FileDescription→ EXE 文件名Title在其中占据第二顺位完整优先级见 docs/using/naming.md。四、Version发布包版本与卸载条目版本号Version的取值来自Properties\AssemblyInfo.cs即程序集版本打包时写入 nuspec 的version节点其作用包括发布包文件名中的版本段如MyApp-1.0.0-full.nupkg中的1.0.0与Id一节同理见 src/Squirrel/ReleasePackage.cs。Windows 卸载程序中的版本号上图中 Version 列的内容。写入卸载注册表的DisplayVersion由zp.Version.ToString()直接生成src/Squirrel/UpdateManager.InstallHelpers.cs。版本号同时会被回写到 EXE 资源--set-file-version/--set-product-version见 src/Update/Program.cs确保资源管理器中的文件版本/产品版本与卸载条目一致。五、IconUrl快捷方式与卸载程序图标安装时获取IconUrl是图标的 URL用于桌面/开始菜单快捷方式图标Windows 卸载程序Programs and Features中该应用的图标注册表DisplayIcon项。重要约束IconUrl必须指向一个.icoIcon文件才能正确工作且图标是在安装时从该 URL 获取而非打包时来源issue #745。源码完整还原了这一流程src/Squirrel/UpdateManager.InstallHelpers.csif (zp.IconUrl ! null !File.Exists(targetIco)) { using (var wc Utility.CreateWebClient()) { await wc.DownloadFileTaskAsync(zp.IconUrl, targetPng); using (var fs new FileStream(targetIco, FileMode.Create)) { if (zp.IconUrl.AbsolutePath.EndsWith(ico)) { var bytes File.ReadAllBytes(targetPng); fs.Write(bytes, 0, bytes.Length); // 直接拷贝 .ico } else { using (var bmp (Bitmap)Image.FromFile(targetPng)) using (var ico Icon.FromHandle(bmp.GetHicon())) { ico.Save(fs); // 其他格式临时转 .ico } } key.SetValue(DisplayIcon, targetIco, RegistryValueKind.String); } } }运行期读取 IconUrl 的入口是 src/Squirrel/ReleaseEntry.cs 的GetIconUrl它直接从ZipPackage.IconUrl取值。需要注意安装机在安装那一刻必须能访问该 URL若下载失败Squirrel 只记录一条日志Couldnt write uninstall icon, dont care而不会中断安装src/Squirrel/UpdateManager.InstallHelpers.cs因此建议将图标托管在稳定可达的地址上。六、Language非英文字符的代码页支持Language字段用于修改代码页codepage以支持非英文字符。未设置时默认为 1252Windows-1252西文 Latin-1 代码页。其实现位于 src/Update/Program.cs 的createMsiPackage中nuspec 的language会被解析为对应的 ANSI 代码页并填入 WiX MSI 模板的Codepage占位符var culture CultureInfo.GetCultureInfo(package.Language ?? ).TextInfo.ANSICodePage; // templateData[Codepage] ${culture};也就是说若应用界面/安装文本包含非英文如中文、日文、西里尔文等应在 nuspec 中显式设置language为对应的文化名称如zh-CN、ja-JP否则安装程序可能按默认 1252 代码页处理导致乱码。此外在卸载注册表条目中Squirrel 固定写入LanguageDWORD 值为0x0409en-US 的 LCID见 src/Squirrel/UpdateManager.InstallHelpers.cs。七、实战一份完整的 nuspec 配置示例综合以上字段一个规范的 nuspecmetadata节点应如下配置参考仓库测试夹具 test/Squirrel.Tests/fixtures/Squirrel.Core.1.1.0.0.nuspec 的结构扩展?xml version1.0? package xmlnshttp://schemas.microsoft.com/packaging/2010/07/nuspec.xsd metadata idMyApp/id !-- 无空格、无点 -- version1.0.0/version !-- 与 AssemblyInfo 版本一致 -- titleMy App/title !-- 卸载程序显示名 -- authorsMyCompany/authors !-- 写入卸载条目 Publisher -- ownersMyCompany/owners descriptionMy desktop application./description summaryShort summary for file properties./summary releaseNotesWhat changed in this release./releaseNotes languagezh-CN/language !-- 非英文场景必配默认 1252 -- iconUrlhttps://example.com/app.ico/iconUrl !-- 必须 .ico安装时下载 -- requireLicenseAcceptancefalse/requireLicenseAcceptance /metadata files file srclib\net45\MyApp.exe targetlib\net45\MyApp.exe / /files /package配套补充写入卸载条目的其他字段src/Squirrel/UpdateManager.InstallHelpers.cs注册表项取值来源DisplayNameTitle??Description??SummaryDisplayVersionVersionPublisherAuthors逗号拼接DisplayIcon安装时从IconUrl下载的app.icoInstallLocation%LocalAppData%\IdURLUpdateInfoProjectUrl如配置Language固定0x0409八、常见问题与最佳实践小结Id 千万别带空格和点否则发布包命名、安装目录、AppUserModelID、包名解析都会出问题issue #523。Title 缺失时卸载程序会降级显示按Title → Description → Summary回退建议至少补齐Description。IconUrl 必须是 .ico 且安装期可访问Squirrel 在安装时下载图标并缓存在应用根目录app.icoURL 不可达不会中断安装但卸载程序将无图标。非英文应用务必配置language不配置时回退到 1252 代码页可能造成安装文本乱码。版本号保持 nuspec 与 AssemblyInfo 一致二者同时影响发布包文件名、卸载条目DisplayVersion与 EXE 资源版本。参见Naming Conventions命名约定总览从 EXE 资源、nuspec 元数据到快捷方式/安装目录/卸载条目命名规则的完整优先级链。Update Manager 安装辅助实现卸载注册表条目的完整写入逻辑。打包/发布流程--releasify如何消费上述元数据生成 Setup.exe 与发布包。赞分享开发工具【免费下载链接】Squirrel.WindowsAn installation and update framework for Windows desktop apps项目地址https://gitcode.com/gh_mirrors/sq/Squirrel.Windows点击查看免费下载相关推荐Squirrel.Windows 打包全流程指南构建、NuGet 打包与 Releasify 发布Squirrel.Windows 打包全流程指南构建、NuGet 打包与 Releasify 发布 本篇技术指南围绕 Squirrel.Windows 入门教开发工具AzerothCore开源MMO服务器三步快速部署AzerothCore开源MMO服务器三步快速部署 你本地已装好Docker先花两分钟看看效果。AzerothCore开源MMO服务器是面向魔兽世界3.3.5游戏开发后端Orleans NuGet 包全景指南元包、Provider 与测试包的选择与使用Orleans NuGet 包全景指南元包、Provider 与测试包的选择与使用 本指南以 nuget packages.md https://link.g后端微服务上一篇AMD ROCm 7.2.3环境搭建运行DeepSeek-V4-Flash-NVFP4的系统要求与依赖安装下一篇Windows版微信QQ消息防撤回完整教程告别错过重要信息的烦恼创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Xcelium混合仿真避坑指南:Verilog/VHDL/SystemC协同实战 2026/9/27 23:31:20

Xcelium混合仿真避坑指南:Verilog/VHDL/SystemC协同实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
5分钟搞定ESP32/ESP8266开发环境:Arduino IDE 2.0国内镜像配置指南 2026/9/27 23:31:13

5分钟搞定ESP32/ESP8266开发环境:Arduino IDE 2.0国内镜像配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
华为NE05E/NE08E物理层时钟同步配置与故障排查实战 2026/9/27 23:31:13

华为NE05E/NE08E物理层时钟同步配置与故障排查实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
自动语音识别(ASR)技术全解析:从原理到工程实践 2026/9/27 23:31:13

自动语音识别(ASR)技术全解析:从原理到工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
VSCODE加ESP-IDF配置指南:ESP32开发环境搭建与调试 2026/9/27 23:31:06

VSCODE加ESP-IDF配置指南:ESP32开发环境搭建与调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Linux 上 WFDB 心电信号分析实战:从 wfdb.tar.gz 到 HRV 频域分析 2026/9/27 23:31:06

Linux 上 WFDB 心电信号分析实战:从 wfdb.tar.gz 到 HRV 频域分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉