我读了货物手册的补丁选项,但它仍然是不清楚我。是否可以指示货物:1.从这个仓库获取代码。1.将此修补程序文件(my_cool_change.patch)应用于该代码。我自己制作项目的分支是唯一的方法吗?
r1wp621o1#
不可能指示Cargo做类似“从crates.io获取crate foo-bar的1.2.3版本,并在编译之前将这些任意更改应用于源代码”的事情。Cargo文档并没有欺骗你:你需要对你想要修改的项目进行fork,根据需要进行修改,然后用你的fork版本替换依赖项。
snz8szmq2#
在内部是的,正确的方法是下载原始代码,编辑它,然后将Cargo依赖项指向更改后的本地版本。你可能想通过fork原始项目的Git仓库来做到这一点,特别是如果你打算共享你的crate。但是如果你真的想用一个很小的补丁文件做一个快速的补丁,现在有一个工具:cargo patch-crate为你自动化了这个过程。你只需要像往常一样指定crate的基本版本(比如0.1.2),然后将下面的部分添加到你的Cargo.toml中:
cargo patch-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的官方“补丁”机制:
target/patch
patches
cargo patch-crate crate-to-patch
patches/crate-to-patch+0.1.2.patch
[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,这可能是你更好的选择。但原理是一样的。
target
cargo patch
my_cool_change.patch
2条答案
按热度按时间r1wp621o1#
不可能指示Cargo做类似“从crates.io获取crate foo-bar的1.2.3版本,并在编译之前将这些任意更改应用于源代码”的事情。
Cargo文档并没有欺骗你:你需要对你想要修改的项目进行fork,根据需要进行修改,然后用你的fork版本替换依赖项。
snz8szmq2#
在内部是的,正确的方法是下载原始代码,编辑它,然后将Cargo依赖项指向更改后的本地版本。你可能想通过fork原始项目的Git仓库来做到这一点,特别是如果你打算共享你的crate。
但是如果你真的想用一个很小的补丁文件做一个快速的补丁,现在有一个工具:
cargo patch-crate
为你自动化了这个过程。你只需要像往常一样指定crate的基本版本(比如0.1.2
),然后将下面的部分添加到你的Cargo.toml
中:字符串
从现在开始,运行
cargo patch-crate
将把crate的基本版本提取到target/patch
的目录中,并将项目根目录patches
文件夹中的补丁应用到它。如果你还没有补丁文件,该工具甚至可以帮助你:如果您对本地版本进行了文件更改,那么运行cargo patch-crate crate-to-patch
,您所有更改都将被收集到patches/crate-to-patch+0.1.2.patch
中,并在将来自动应用。为了让你的项目真正使用这个补丁版本,而不是原来的版本,只需要像这样使用Cargo的官方“补丁”机制:
型
不幸的是,这会在您的clean-build过程中引入另一个命令,因为删除
target
目录现在也会删除程序所依赖的crate版本。这很容易通过再次运行cargo patch-crate
来修复,它会重新获取基础并重新应用补丁,但是你不能忘记手动完成,因为没有机制告诉Cargo在每次构建之前自动完成(AFAIK)。你也可以使用一个类似的工具
cargo patch
,它基本上做同样的事情,但使用稍微不同的配置。特别是它允许你指定你想要应用的补丁列表,因为在你的情况下,你已经有了my_cool_change.patch
,这可能是你更好的选择。但原理是一样的。