rust 是否可以对Cargo.toml中的外部代码应用补丁?

6l7fqoea  于 11个月前  发布在  Go
关注(0)|答案(2)|浏览(137)

我读了货物手册的补丁选项,但它仍然是不清楚我。
是否可以指示货物:
1.从这个仓库获取代码。
1.将此修补程序文件(my_cool_change.patch)应用于该代码。
我自己制作项目的分支是唯一的方法吗?

r1wp621o

r1wp621o1#

不可能指示Cargo做类似“从crates.io获取crate foo-bar的1.2.3版本,并在编译之前将这些任意更改应用于源代码”的事情。
Cargo文档并没有欺骗你:你需要对你想要修改的项目进行fork,根据需要进行修改,然后用你的fork版本替换依赖项。

snz8szmq

snz8szmq2#

在内部是的,正确的方法是下载原始代码,编辑它,然后将Cargo依赖项指向更改后的本地版本。你可能想通过fork原始项目的Git仓库来做到这一点,特别是如果你打算共享你的crate。
但是如果你真的想用一个很小的补丁文件做一个快速的补丁,现在有一个工具:cargo patch-crate为你自动化了这个过程。你只需要像往常一样指定crate的基本版本(比如0.1.2),然后将下面的部分添加到你的Cargo.toml中:

[package.metadata.patch]
crates=["crate-to-patch"]

字符串
从现在开始,运行cargo patch-crate将把crate的基本版本提取到target/patch的目录中,并将项目根目录patches文件夹中的补丁应用到它。如果你还没有补丁文件,该工具甚至可以帮助你:如果您对本地版本进行了文件更改,那么运行cargo patch-crate crate-to-patch,您所有更改都将被收集到patches/crate-to-patch+0.1.2.patch中,并在将来自动应用。
为了让你的项目真正使用这个补丁版本,而不是原来的版本,只需要像这样使用Cargo的官方“补丁”机制:

[patch.crates-io]
crate-to-patch = { path = './target/patch/crate-to-patch-0.1.2' }


不幸的是,这会在您的clean-build过程中引入另一个命令,因为删除target目录现在也会删除程序所依赖的crate版本。这很容易通过再次运行cargo patch-crate来修复,它会重新获取基础并重新应用补丁,但是你不能忘记手动完成,因为没有机制告诉Cargo在每次构建之前自动完成(AFAIK)。
你也可以使用一个类似的工具cargo patch,它基本上做同样的事情,但使用稍微不同的配置。特别是它允许你指定你想要应用的补丁列表,因为在你的情况下,你已经有了my_cool_change.patch,这可能是你更好的选择。但原理是一样的。

相关问题