ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

chsrc 源码剖析:rawstr4c 输入文件如何驱动 openSUSE 换源脚本的生成与执行

chsrc 源码剖析:rawstr4c 输入文件如何驱动 openSUSE 换源脚本的生成与执行 CLI开发工具【免费下载链接】chsrcchsrc 全平台通用换源工具与框架. Change Source everywhere for every software项目地址https://gitcode.com/gh_mirrors/ch/chsrc点击查看免费下载本文以 chsrc 仓库中操作系统类 recipe 的 rawstr4c 输入文件src/recipe/os/rawstr4c.md为核心线索讲解 chsrc 如何用 Markdown 描述换源脚本、如何将其编译为 C 语言字符串变量并最终通过zypper命令完成 openSUSE Leap / Tumbleweed 的镜像源切换。读完本文你将掌握 rawstr4c 输入文件的格式约定、url占位符的替换机制以及换源脚本从文档到可执行的完整调用链。一、rawstr4c 在 chsrc 项目中的定位chsrc 是一个全平台通用换源工具与框架它既是命令行工具也是一个让贡献者在不了解 C 语言的情况下也能编写新换源方法recipe的 MVC 框架见 doc/10-如何编写recipe.md。换源脚本本质上是一段需要嵌入 C 源码的长字符串而 rawstr4c 正是解决如何在 C 语言中维护复杂字符串的配套方案——它允许维护者用 Markdown 书写脚本原文再由工具自动转换为 C 头文件中的转义字符串常量。chsrc 主项目说明文件 src/rawstr4c.md 给出了选择 rawstr4c 的工程背景chsrc 使用的 C 标准最低要求是gnu11c11的超集因此项目可以、并且推荐混用 C11 原生的原始字符串字面量R()与 rawstr4c 两种写法LLVM 对R()的完整支持在 2024 年 07 月以后才到来而 GitHub Actions 中出现的 LLVM 版本普遍偏低迫使项目将已写好的R()全部转换为 rawstr4c用户端的编译器虽然一般较新但未必新到支持R()的完整语义使用 rawstr4c 可以放宽对用户编译器版本的要求项目预计 2~3 年后随着编译器普及再逐步恢复R()写法。仓库中的构建配置也印证了这一点Makefile 与 justfile 均预留了rawstr4c目标见 Makefile 与 justfile通过make rawstr4c ARGS[--debug] Markdown.md或just rawstr4c调用工具完成 Markdown → 头文件的转换并在 doc/01-开发与构建.md 中将 rawstr4c 列为可选的开发依赖。二、rawstr4c 输入文件操作系统类的格式约定src/recipe/os/rawstr4c.md 的头部声明了该输入文件的全局生成参数字段值含义prefixRAWSTR_os生成的所有全局字符串变量统一使用此前缀output:global-variable-only-header只生成全局变量形式的头文件不生成其他输出形式translate:hex字符串以十六进制转义序列\xHH编码写入头文件随后是分区结构## openSUSE定义命名空间openSUSE其下每个###小节对应一个独立的换源脚本小节名如Leap、Tumbleweed会拼接到变量名中。结合同目录生成的 src/recipe/os/rawstr4c.h 可以看到最终变量命名规则为RAWSTR_os_openSUSE_leap_in_bash RAWSTR_os_openSUSE_tumbleweed_in_bash即前缀 命名空间 小节名 in_bashin_bash表示该字符串是 Bash 脚本。这个命名模式与 src/recipe/lang/rawstr4c.md编程语言类prefix RAWSTR_pltranslate :oct、src/recipe/os/APT/rawstr4c.mdAPT 系操作系统prefix RAWSTR_os_apt_based等输入文件相互印证每个输入文件通过元数据字段控制前缀、转义方式与命名空间从而把可维护的 Markdown 脚本批量翻译成 C 字符串常量。三、openSUSE Leap 换源脚本逐行解读原文档给出的 openSUSE Leap 换源脚本如下其中url是待替换的镜像站基地址占位符# 首先禁用官方软件源 zypper mr -da zypper ar -cfg url/distribution/leap/$releasever/repo/oss/ mirror-oss zypper ar -cfg url/distribution/leap/$releasever/repo/non-oss/ mirror-non-oss zypper ar -cfg url/update/leap/$releasever/oss/ mirror-update zypper ar -cfg url/update/leap/$releasever/non-oss/ mirror-update-non-oss zypper ar -cfg url/update/leap/$releasever/sle/ mirror-sle-update zypper ar -cfg url/update/leap/$releasever/backports/ mirror-backports-update逐条说明zypper mr -damrmanage repository配合-d禁用与-a所有仓库一次性禁用官方全部软件源避免换源后新旧源并存导致冲突zypper araradd repository添加新软件源-c启用自动刷新autorefresh-f标记为必需仓库若不可用则zypper拒绝继续-g应用 GPG 校验策略每条命令的最后一个参数mirror-oss等是本地别名路径中的$releasever是 zypper 内置的发行版版本号变量Leap 下会展开为当前大版本号因此同一套脚本可跨 Leap 15.x 等多个小版本复用六个仓库覆盖三类内容基础 OSS 仓库开源软件、non-OSS 仓库闭源/受限组件、更新仓库update下的 oss / non-oss / sle / backports其中sle指向 SUSE Linux Enterprise 兼容更新、backports指向 Leap 的软件包回溯仓库。四、openSUSE Tumbleweed 换源脚本解读Tumbleweed 是 openSUSE 的滚动发行版没有$releasever版本号概念脚本因此更短# 首先禁用官方软件源 zypper mr -da zypper ar -cfg url/tumbleweed/repo/oss/ mirror-oss zypper ar -cfg url/tumbleweed/repo/non-oss/ mirror-non-oss # 刷新软件源 zypper ref与 Leap 脚本相比Tumbleweed 只需 oss 与 non-oss 两个主仓库此外末尾追加了zypper refrefresh主动刷新软件源元数据而 Leap 脚本没有显式刷新——这是因为 Leap 的仓库在zypper ar -cfg中开启了自动刷新-c脚本保持了两类发行版在操作习惯上的差异。脚本中url会被替换为所选镜像站的基地址如https://mirrors.tuna.tsinghua.edu.cn/opensuse最终形成的仓库地址形如https://mirrors.tuna.tsinghua.edu.cn/opensuse/tumbleweed/repo/oss/。五、从 Markdown 到 C 头文件的生成链路原始脚本不能直接嵌入 C 源码原因有二脚本内含单引号、$、/等对 C 字符串不友好的字符且中文注释需要编码处理。rawstr4c 的解决方式是在生成阶段完成转义输入侧以 Markdown 书写人类可读的原始脚本见 src/recipe/os/rawstr4c.md保留全部注释与格式生成侧translate :hex将每个字符编码为\xHH形式中文注释按 UTF-8 字节逐一转义可在 src/recipe/os/rawstr4c.h 中看到形如\x23\x20\xe9\xa6\x96...的连续转义序列其中\x23即#\xe9\xa6\x96即首字的 UTF-8 编码输出侧output :global-variable-only-header生成可直接#include的头文件每个脚本对应一个char ...[]全局数组文件头部注明Generated by rawstr4c v1.2.0-...的版本印记。对比编程语言类输入文件 src/recipe/lang/rawstr4c.mdtranslate :oct、八进制转义可见转义进制hex/oct与是否带后缀no-postfix均由各输入文件头部显式声明是同一套工具在不同类别 recipe 上的参数化应用。六、运行时执行链路脚本如何真正生效脚本从字符串常量到执行完毕共经历四步核心实现在 src/recipe/os/openSUSE.c 与 src/framework/core.c。第一步交互选择发行版。os_opensuse_setsrc打印菜单1. openSUSE Leap / 2. openSUSE Tumbleweed通过scanf(%d)读取选择并做输入校验非法输入会清空缓冲区后重新提示。第二步替换占位符。依据选择取出对应脚本字符串用xy_str_gsub完成全局替换char *script xy_str_gsub (RAWSTR_os_openSUSE_leap_in_bash, url, source.url);source.url是当前选中镜像站提供的 openSUSE 基地址由于url在脚本中可出现多次Leap 脚本中出现六次gsub保证全部出现位置都被替换。第三步落盘并执行。替换后的完整脚本交给chsrc_run_as_bash_filesrc/framework/core.c通过chsrc_make_tmpfile(bash_script, .bash, ...)创建临时.bash文件fwrite写入脚本内容打印即将执行 Bash 脚本内容:提示并回显脚本便于用户确认以bash 临时文件方式执行chsrc_run (cmd, RunOpt_Dont_Abort_On_Failure)失败不中断流程执行后立即remove删除临时文件——脚本不残留任何文件符合项目不污染用户环境的 NO UFO 开发准则见 doc/10-如何编写recipe.md。第四步标记变更类型并总结。脚本执行后调用chsrc_determine_chgtype (ChgType_Untested)将本次换源标记为未经测试对应输出中[未测试]之类的状态提示最后由chsrc_conclude汇总输出。此外os_opensuse_prepare中调用了chef_set_os_scope操作系统级作用域与chef_allow_user_define允许用户自定义源 URL意味着chsrc set opensuse URL同样会走同一套脚本模板。七、openSUSE 菜品支持的镜像站os_opensuse_prepare的def_sources_begin() ... def_sources_end()块列出了该菜品可选的源src/recipe/os/openSUSE.c上游默认源为官方https://download.opensuse.org/可选的国内镜像站包括镜像站基地址阿里云https://mirrors.aliyun.com/opensuse火山引擎https://mirrors.volces.com/opensuse北京外国语大学https://mirrors.bfsu.edu.cn/opensuse中国科学技术大学https://mirrors.ustc.edu.cn/opensuse清华大学 TUNAhttps://mirrors.tuna.tsinghua.edu.cn/opensuse腾讯云https://mirrors.tencent.com/opensuse使用chsrc list opensuse可查看完整源列表chsrc set opensuse会先测速再择优该 recipe 的换源写法参考了 TUNA 镜像站的 openSUSE 帮助文档源码注释consult标注于 src/recipe/os/openSUSE.c。八、扩展阅读与实操指引原始输入文件含完整脚本src/recipe/os/rawstr4c.md生成的 C 头文件转义后的真实字符串src/recipe/os/rawstr4c.h运行时换源实现src/recipe/os/openSUSE.c脚本执行基础设施src/framework/core.c编写 recipe 的完整流程doc/10-如何编写recipe.md换源链接与测速链接的设定规范doc/11-如何设置换源链接与测速链接.md想为新的操作系统或软件新增换源支持时最省力的路径是在新类别的rawstr4c.md输入文件中按## 命名空间### 小节的层级书写 Bash 脚本用url或1、2等多占位符标记镜像站位置再参考 src/recipe/recipe-template.c 的模板在对应 recipe 中通过xy_str_gsub替换并交由chsrc_run_as_bash_file执行即可——这正是换源脚本以文档形式维护、以字符串形式运行的框架设计精髓。赞分享CLI开发工具【免费下载链接】chsrcchsrc 全平台通用换源工具与框架. Change Source everywhere for every software项目地址https://gitcode.com/gh_mirrors/ch/chsrc点击查看免费下载相关推荐G6 Mindmap 脑图树布局实战左右分叉树形布局的配置与四种分布模式详解G6 Mindmap 脑图树布局实战左右分叉树形布局的配置与四种分布模式详解 脑图树Mindmap布局是 G6 中专门服务于树状结构层次化展示的布局方案CLI开发工具chsrc 的 Anaconda 换源配置rawstr4c condarc 模板解析与 recipe 实现原理chsrc 的 Anaconda 换源配置rawstr4c condarc 模板解析与 recipe 实现原理 导读 本文以 chsrc 仓库中 AnaconCLI开发工具privacy.sexy代码生成器如何动态创建可执行的隐私脚本privacy.sexy代码生成器如何动态创建可执行的隐私脚本 隐私设置配置从未如此简单privacy.sexy代码生成器是一款强大的开源工具专门为Win应用安全上一篇【亲测免费】 推荐开源项目LightBulb - 智能护眼软件下一篇推荐开源项目MIST — macOS 安装器超级工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表