改配置文件最怕什么?格式乱了,注释没了。Rust生态里想找个能"温柔"修改YAML的库,比想象中难。
常规思路是解析、修改、再序列化。但通用库有个通病:输出时会把你的缩进、换行、引号风格全改成它认定的"标准格式",注释更是直接丢弃。注释里往往藏着配置的历史原因,格式错乱可能让文件直接失效。serde_yaml已经不维护了;yaml-rust2明确说注释支持不在计划内,建议等saphyr;saphyr的注释功能还在规划中。
![]()
于是作者把crates.io和lib.rs翻了个遍,锁定四个声称能保注释的候选:yamlpath+yamlpatch组合、yaml-edit、rust-yaml、yamp。测试场景是个简化版交易机器人配置,有嵌套的分组结构、多级注释,还设计了两种操作:list-assets把资产按字母序追加到default组,delist-assets把指定资产从所在组删除,空组自动清理。
![]()
第一个测试用list-assets 1INCH,BTC,XRP,BNB。1INCH已在default里,BTC在group_abc里,这俩是重复项应跳过;XRP和BNB是全新的,要按字母序插到default末尾。结果四个库全军覆没——1INCH被重复添加,BTC也被重复添加,顺序也不对。深入看yamlpath+yamlpatch的文档才发现,它把YAML当成树来路由,设计初衷是"给Kubernetes打补丁",对这种"查重+排序"的业务逻辑根本不管。
第二个测试用delist-assets BTC,DOGE,1INCH。BTC在group_abc,DOGE在group_xyz,1INCH在default。按规则删完后group_xyz应该只剩PEPE,default剩ATOM和LINK。这次yamlpath+yamlpatch表现最好,注释和格式都保住了;yaml-edit、rust-yaml、yamp要么丢注释,要么格式变形,要么直接panic。
![]()
作者最后选了yamlpath+yamlpatch,但承认这是"两害相权"——它API设计别扭,文档也零散,但至少delist场景能干活。list-assets的需求?自己写逻辑,先读一遍做查重,再调库做插入。这个案例挺典型:Rust生态的工具链往往"能用"和"好用"之间隔着一层,选库时得把测试场景拆得足够细,文档里没写的"设计初衷"可能比API签名更重要。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.