#migration #script #name #conflict #hash #bash #add

app regrate

使用哈希值而不是序列号或日期来命名,实现更好的迁移

1 个不稳定版本

0.3.0 2022年1月5日

#9 in #conflict

MIT/Apache

23KB
436

Regrate 迁移管理

简介

管理迁移,按顺序应用它们,处理合并冲突。

# create a new shell-based migration
regrate init --shell

# Edit the up and down scripts (bash since --shell was used)
edit regrate/latest/up.sh
edit regrate/latest/down.sh

# Run the current migration (to test it out) by passing them to bash in order
regrate run -- bash {}

# Once the migration is working right, we can commit it.
regrate commit -m "add two columns"

# With our migrations complete, we can push it up!
git add -A && git commit -m "initial migration"

# Try to push it. first rebase onto latest...
git rebase main ## ERROR, conflicts!

# Someone else already pushed a migration. you can either:
# 1. merge the migrations together (you're in dev and willing to reset your db)
# 2. better idea would be to move your local changes to a new migration:
regrate resolve

# regrate-resolve moves your local changes into a new migration, 
# leaving your peer's as the base.
edit regrate/latest/up.sh # your peer added one of your columns!

regrate commit -m "add one column"

git add -A && git rebase --continue
git push # Yay!

总之,如果有人声称下一个迁移名称,你将与他们的更改发生合并冲突。Regrate可以帮助将您的冲突标记解析为新的迁移。

您的脚本应该是幂等的,因为它们将每次从开始按顺序执行。regrate不会跟踪当前运行时版本。为了帮助,regrate-run将为迁移的每个步骤设置REGRATE_INDEX,这可以帮助跟踪给定脚本是否应该在有状态的环境中(在完成时,脚本将更新共享变量为REGRATE_INDEX)运行。

regrate将从迁移脚本的 内容中推导名称。这意味着一旦提交,迁移脚本就不再可编辑。regrate-valid将抱怨哈希不匹配。这可以用于预提交钩子来检测不良更改。

还提供了一个库,可用于遍历当前目录中的迁移。这在运行时很有用。在这种情况下,您有责任根据需要调用脚本。其他语言的包也存在,并允许您运行迁移。

Crates.io Docs.rs CI Coverage Status

安装

Cargo

  • 按照这个指南安装rust工具链,以便通过cargo安装。
  • 运行 cargo install regrate

工作原理

“当前版本”是开放的。您可以对其进行更改,其名称总是众所周知的。如果有两个人试图更改开放的版本,将发生合并冲突。要从当前版本计算下一个版本,请获取当前版本字符串,计算该版本中所有迁移脚本的哈希值,然后将版本和哈希值连接起来。对结果进行哈希处理,这就是您的下一个版本名称。此序列可以重复以生成名称列表。

许可

根据您的选择,许可为以下之一

贡献

除非您明确声明,否则根据Apache-2.0许可定义的,您有意提交以包含在作品中的任何贡献,都将双重授权如上所述,不附加任何其他条款或条件。

参见 CONTRIBUTING.md

依赖项

~8–17MB
~208K SLoC