4个版本

0.1.3 2024年7月17日
0.1.2 2024年6月5日
0.1.1 2023年1月25日
0.1.0 2023年1月25日

#132 in 构建工具

Download history 130/week @ 2024-06-02 9/week @ 2024-06-09 1/week @ 2024-06-16 2/week @ 2024-06-30 117/week @ 2024-07-14 3/week @ 2024-07-21 50/week @ 2024-07-28

每月 170 次下载

MIT 许可证

50KB
685

deppatcher

Cargo.toml文件的大规模重写工具

用法

规则 - jsonnet函数,接收包描述(见 DirectInput),并返回包源(见 DirectSource

例如,你想使用git仓库重写所有对包 evm 的使用,你可以使用这个规则

function(pkg) if pkg.package == "evm" then {
	git: "https://github.com/CertainLach/evm"
}

要执行此规则,可以写入 deppatcher patch -e "rule",或者保存到文件,然后 deppatcher patch file.jsonnet。补丁命令接收与jsonnet解释器相同的参数

要快速用其他工作区中定义的包覆盖所有使用的包,请使用

deppatcher link /home/lach/build/my-evm-fork

重写后,原始包源将存储在 Cargo.toml 中,可以是恢复(deppatcher revert),也可以是删除(deppatcher freeze

与本地工作区的使用

对于路径覆盖,cargo期望你提供依赖项的完整路径,在工作区的情况下,是依赖项在该工作区中的路径

为了简化问题,有一个 dpp.loadPaths 辅助函数可用,它接收工作区的路径(相对于规则文件),并返回一个对象,该对象将工作区中的包映射到它们的绝对路径

例如,对于 jrsonnet,它将返回

{
	jrsonnet: '/code/cmds/jrsonnet',
	jsonnet: '/code/bindings/jsonnet'
	'jrsonnet-evaluator': '/code/crates/evaluator',
	'jrsonnet-parser': '/code/crates/parser',
	'jrsonnet-interner': '/code/crates/interner',
	...
}

其中 /code/ - 仓库树绝对路径

示例场景

  1. 你使用substrate,你只能依赖git版本,你不能仅仅指定master分支

在仓库中你有很多类似的行

sp-api = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.18" }

当你需要更新到该依赖项的下一个版本时,你需要多次搜索和替换,这很麻烦,而且并不总是有效(例如,如果你想在自己的分支中有自己的版本控制)

sp-api = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.19" }

使用deppatcher时,只需编写更新规则,例如这样

function(pkg) if pkg.source.git == "https://github.com/paritytech/substrate" then pkg.source {
	branch: "polkadot-v0.9.19"
}

deppatcher存储了包的原始版本以供回滚,您需要运行deppatcher freeze来删除它们

  1. 您依赖https://github.com/paritytech/frontier,这个仓库有很多模块,您需要临时使用本地分支。

使用[patch]和/或手动指定path将有效,然而,这些只能指向虚拟清单,您不能直接输入

fp-consensus = { path = "~/my-frontier-fork" }

您应该输入此仓库克隆中依赖项的路径

fp-consensus = { path = "~/my-frontier-fork/primitives/consensus" }

deppatcher可以拯救您!

local frontier = dpp.loadPaths('/home/lach/work/substrate/frontier');
function(pkg) if std.objectHas(frontier, pkg.package) then {
	path: frontier[pkg.package],
}

或者通过使用别名,它在底层与上面的代码完全相同

deppatcher link /home/lach/work/substrate/frontier

当您需要切换回所有内容时,请使用deppatcher revert命令

替代方案

https://github.com/bkchr/diener - 非常有限,您不能更新非substrate依赖项(例如frontier或分叉的substrate),回滚部分补丁,或执行任何其他非平凡操作。您可以用diener做的所有事情,您也可以用deppatcher做

依赖项

~14–24MB
~364K SLoC