如果我发布它,你将无法获得我同样的体验
摘要
作者为Minecraft mod开发构建过程创建了一个名为jardiff的自定义文件比较工具,并解释说,与发布打包二进制文件相比,保持源代码的可访问性在使用时能提供更大的灵活性。
<p><a href="https://lobste.rs/s/zt8abs/if_i_release_it_you_won_t_get_same">评论</a></p>
查看缓存全文
缓存时间: 2026/08/27 05:21
# 如果我发布它,你不会得到和我一样的体验
来源:https://notes.highlysuspect.agency/cant-release-that.html
在我的Minecraft模组仓库(https://codeberg.org/quat/mods/)中,我进行了一些构建工具的重构。为了确保没有破坏任何东西,我编写了一个名为jardiff的程序(https://codeberg.org/quat/mods/src/branch/trunk/jardiff)。它接受两个文件或目录作为参数,并执行以下操作:
- 如果是目录,它会检查它们是否具有相同的文件列表,然后递归处理每个文件
- 它还会对 `.zip` 和 `.jar` 文件内的文件执行相同操作
- 如果是 `.json` 文件,它会解析json并在比对前标准化格式
- 如果是 `.class` 文件,它会在比对前通过Java反汇编器(objectweb asm textifier)运行——因为你值得比"二进制文件不同"更好的体验
- 否则,它会进行常规差异比对,如果是文本文件则显示结果——我手动实现了Meyers差异算法。完全不必要但很有意思
所以它就像一个更宽松的diffoscope(https://diffoscope.org/);我想确保新构建工具生成的产物在*功能*上与旧产物相同,但我不在乎它们是否逐字节相同(因此有json重格式化)。
例如,在旧工具中,我有一个兼容Java 8的源集,我构建的三个模组中包含从该源集获取的类。在新工具中,我决定移除这个源集,直接将类粘贴到每个模组中,因此现在它们与模组的其余部分一起使用Java 25编译。`jardiff`发现了这个差异,因为类文件的版本号在其反汇编中是可见的。
但我认为这个变化是可以接受的。我不再支持需要Java 8的Minecraft版本,移除源集使事情简化到足以证明一点复制粘贴是合理的。
所以我做的是:我进入`jardiff`的源代码,修改反汇编器使其总是输出相同的类文件版本号。当我再次运行jardiff时,这些特定差异就消失了,我可以更容易地寻找更多差异。
> 关于使用工具时代码就在眼前的体验。关于当你能直接拼接所需代码并跳过不需要的部分时,不必内嵌选项或使事物可配置。
我能用`jardiff`快速完成很多工作,因为使用它时源代码就在我的编辑器中。我可以忽略或强化我正在寻找的变化;我可以决定zip文件中的条目顺序是否重要,我可以拼接一个自定义的`ClassVisitor`来总是报告相同的版本号等等。在新构建工具开发过程中,我无数次这样做来专注于我真正寻找的差异。
如果我把它打包成单一二进制文件,那么使用工具时源代码就不在眼前了,这种灵活性就丧失了。我可以把它们作为配置选项加回来,但我会享受在整代码库中构建它们的乐趣吗?需要时我还能记得所有选项是什么吗?
我可以添加正则过滤器,但我的大脑处于类解析模式;我知道为了使反汇编器报告相同版本号需要改变什么,但我必须转换到正则表达式模式,用文本正则查找替换来表达;当然,误报的风险也更大,我可能会意外地替换掉本应不同但恰好看起来像类文件版本号的文本(...有点牵强,但我编写`jardiff`是为了安心)。
我找到的下一个差异有多大机会是被现有标志覆盖的,而不是我没有预料到的新类型差异(因此无论如何都需要编写代码)?如果我添加领域特定语言让你编程自己的过滤器,你真的会费心学习它吗?它会像已经内置在我编辑器中、已经非常理解工具源代码的语言一样易于使用吗?
将其编译为二进制文件会将其固化在琥珀中,开发者和用户之间总是存在权力不平衡,体现在谁的代码能成为二进制文件的一部分,谁的不能,谁能使用真正的语言,谁只能使用DSL,...
## !!!!!!!立即下载!!!!!!!
只需将这两个类复制粘贴到某处(https://codeberg.org/quat/mods/src/branch/trunk/jardiff/src/main/java/jardiff)然后自己弄明白吧,哈哈
相似文章
Devtools 必须是开源的 (exe.dev)
认为像 Claude 和 Codex 这样的 LLM 降低了阅读和修改开源代码的门槛,使开源梦想更加可行。
开发者工具必须是开源的
作者认为开发者工具必须是开源的,因为AI智能体使得个性化软件和自动将本地更改变基到上游发布变得切实可行,并以他们的智能体Shelley和meat.dev项目为例。
@AkinoNya: 说实话,我真的讨厌那种到处宣传自己是开源软件、实则限制商用、修改和分发的 source-available 软件,但……
作者批评了那些打着开源旗号、实则限制商用、修改和分发的 source-available 软件,并指出在 AI 时代,此类限制可被一键代码改写轻松绕过。
谁应该为源代码的可用性买单?
一篇博客文章讨论了依赖 GitHub 等集中式托管平台的脆弱性,探讨了分叉(forking)和供应商化(vendoring)作为缓解策略,并质疑谁应该为可靠的源代码可用性买单。
回忆 Planet Source Code:在 GitHub 让代码分享变得便捷之前
作者回顾了 2000 年代初在 Planet Source Code 上分享代码片段的经历,并将那个时代与如今以 GitHub、包管理器和现代社区平台为核心的顺畅开发者生态进行了对比。