Hex到底是什么Dex?介绍确定性转换工件

发布: (2026年3月13日 GMT+8 15:11)
9 分钟阅读
原文: Dev.to

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 → Apply

Dennis 并不会直接修改你的项目,而是首先生成一个 计划。这足够安全,完全可以在家尝试——不需要鸡肉。

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.key

Artifact 现在包含可验证的签名,证明其来源。如果有人修改了负载并重新签名,旧的签名仍会保留在 Artifact 中,作为其历史记录的一部分,从而形成转换的链式监管。

5. 检查 Artifact

dennis inspect hello-dennis.dex

Dennis 将显示:

  • 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 就是它们被锻造的地方。

锻造场所在:

使用 pippipx 安装,并开始 DEX‑你的代码。DEX 制品将转换变成你可以传递、检查和信任的东西。

愿鸡永远活着!

Image

0 浏览
Back to Blog

相关文章

阅读更多 »

你会完成自己开始的事吗?🚀

《Do You Finish What You Start?》的封面图片 🚀 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-...