Hex到底是什么Dex?介绍确定性转换工件
Source: Dev.to
(请提供您希望翻译的正文内容,我将为您翻译成简体中文并保持原有的格式。)
问题:代码转换通常是一团混乱
软件工程师不断需要转换代码库。
不只是小的编辑——我们在谈论大规模的结构性变更:
- API 迁移
- 框架升级
- 本地化重写
- 跨数百个仓库的安全补丁
- 涉及数千个文件的重构
大多数情况下,这些转换是通过以下混合方式完成的:
- 脆弱的脚本
- 正则魔法
- 一次性的代码修改工具
- 涉及鸡的可疑搜索替换仪式
脚本一运行……祝你好运。
你经常会遇到:
- 没有清晰的审计轨迹
- 没有可复现性
- 没有安全的回滚
- 无法事先检查转换
换句话说:你刚刚在代码库中执行了一个非常大的变异,现在只能祈祷 CI 神灵,盼望那只鸡已经满足了它们对 bug 的渴求。
Source: …
但是……如果代码转换是工件会怎样?
想象一下:我们不再盲目执行转换,而是把它们当作一等公民的工件——可以:
- 检查
- 验证
- 分享
- 签名
- 重现
- 撤销(无需任何鸡)
这就是 DEX 的理念。
DEX:确定性转换工件
DEX 工件是一个可移植的包,以确定性的方式描述代码转换。可以把它看作:
Git commit
+ migration script
+ cryptographic signature
+ replayable transformation plan但它并不绑定到特定的仓库状态,而是描述转换本身。
典型布局:
DEX
├── manifest.json
├── payload/
│ └── plan.json
└── signatures/转换计划(plan.json)包含:
- 哪些文件被修改
- 哪些行被更改
- 原始代码
- 替换代码
- 注入的任何辅助代码
- 每个源文件的精确哈希
提供了重现更改所需的全部信息,确保在相同输入下,工件始终产生相同的输出——没有隐藏状态,也没有运行时的意外。
Dennis 锻造厂
DEX 工件由一个名为 Dennis 的工具生成。Dennis 是一个确定性的 codemod 引擎,围绕以下简单理念构建:
“转换应该是可计划的、可检查的且可逆的。”
工作流程
Scan → Plan → Package → Sign → Verify → ApplyDennis 并不会直接修改你的项目,而是首先生成一个 计划。这足够安全,完全可以在家尝试——不需要鸡肉。
Source: …
让我们打造一个 Artifact
1. 克隆示例仓库
git clone https://github.com/crevilla2050/hello-dennis
cd hello-dennis在其中你会找到一个最小的 Python 程序:
#!/usr/bin/env python3
def main():
print("Hello world.")
print("Thank you for using Dennis. Love, the Dennis Team.")
if __name__ == "__main__":
main()没有花哨的东西——只有两个硬编码的字符串,这类代码往往会悄悄蔓延到整个代码库,直到有人最终说:“我们应该把它国际化。”
2. 生成转换计划
dennis plan run . \
--dict messages_en.json \
--add-helper helper.py \
--target-file hello.py \
--line 12此命令会分析项目并生成一个确定性的转换计划 (plan.json)。此时还没有修改任何文件——Dennis 总是先生成一个可以直接检查的计划。
3. 打包 Artifact
dennis pack plan.json hello-dennis.dex现在,转换被封装成一个可移植的 Artifact,能够像其他构建产物一样共享、检查、版本化和存储。
4. 为 Artifact 签名
首先生成签名密钥:
dennis keygen然后对 Artifact 进行签名:
dennis dex sign hello-dennis.dex --key dennis.keyArtifact 现在包含可验证的签名,证明其来源。如果有人修改了负载并重新签名,旧的签名仍会保留在 Artifact 中,作为其历史记录的一部分,从而形成转换的链式监管。
5. 检查 Artifact
dennis inspect hello-dennis.dexDennis 将显示:
- Artifact 元数据
- 负载类型
- 负载哈希
- 签名
- 转换信息
这让工程师在信任之前能够验证 Artifact 中包含的内容。
6. 应用转换
dennis rehydrate hello-dennis.dex
dennis apply rehydrated-plan.json你的 Python 脚本将被转换为可本地化的结构。硬编码的字符串将被替换为从字典加载的消息。
7. 测试结果
python hello.py你应该看到输出来自外部的 messages_en.json 字典,而不是硬编码的字面量。
Summary
- DEX 将代码转换为可检查、可复现、可逆的制品。
- Dennis 提供确定性的流水线:计划 → 打包 → 签名 → 验证 → 应用。
- 该工作流为您提供审计追踪、来源的加密证明以及安全的回滚——不再有盲目的“运行‑祈祷”脚本或仪式性的鸡。
使用不同的语言设置
您可以通过在命令前加上 LANG 前缀,以特定语言环境运行脚本:
LANG=es python hello.py或
LANG=de python hello.py程序会自动加载相应的翻译字典。没有“鸡肉魔法”——只有确定性、可逆的转换。
逆转转换
Dennis 转换本身是可逆的。如果出现问题,生成逆向计划:
dennis invert rehydrated-plan.json
dennis apply rehydrated-plan.undo.json您的项目将恢复到原始状态。
- 没有 Git 重置。
- 没有考古。
- 只是确定性的撤销。
Source: …
加密工件:XDEX
在某些情况下,您可能希望分发转换工件而不暴露内部的转换逻辑。为此,Dennis 支持 XDEX 工件。
XDEX 工件只是 DEX 文件的加密版本:
DEX → XDEX负载被加密,而外部元数据保持可见。这使组织能够分发可验证的转换工件,同时保持转换计划的机密性。
您可以像下面这样加密工件:
dennis encrypt hello-dennis.dex为什么这很重要
现代软件流水线把许多东西视为制品:
- 容器镜像
- 编译后的二进制文件
- 依赖锁定文件
- 已签名的发布
但代码转换本身往往是不可见的。DEX 制品 改变了这一点。它们将转换变成可移植、可检查、可验证的对象,使软件演进能够被跟踪、审计和复现。
最后思考
软件历史是通过转换书写的:
- 重构
- 迁移
- 补丁
- 升级
大多数情况下,这些转换在运行后就消失了。DEX 制品让它们可见,而 Dennis 就是它们被锻造的地方。
锻造场所在:
使用 pip 或 pipx 安装,并开始 DEX‑你的代码。DEX 制品将转换变成你可以传递、检查和信任的东西。
愿鸡永远活着!
