# cargo-patch
`Cargo-Patch` is a Cargo Subcommand which allows
patching dependencies using patch files.
## Installation
Simply run:
```sh
cargo install cargo-patch
```
This is not necessary when patching via `build.rs` file
## Usage
To patch a dependency one has to add the following
to `Cargo.toml`:
```toml
[package.metadata.patch.serde]
version = "1.0"
patches = [
"test.patch"
]
```
It specifies which dependency to patch (in this case
serde) and one or more patchfiles to apply. Running:
```sh
cargo patch
```
will download the serde package specified in the
dependency section to the `target/patch` folder
and apply the given patches. To use the patched
version one has to override the dependency using
`replace` like this
```toml
[patch.crates-io]
serde = { path = './target/patch/serde-1.0.110' }
```
Instead of running `cargo patch` its also possible to add a `build.rs` file like this:
```rust
fn main() {
println!("cargo:rerun-if-changed=Cargo.toml");
println!("cargo:rerun-if-changed=patches/");
cargo_patch::patch().expect("Failed while patching");
}
```
To make it work, add the cargo-patch library to the `build-dependencies`
```tomlusing the
[build-dependencies]
cargo-patch = "0.3"
```
Note, however, that all your patches should be in a single folder called `patches` or something similar. This is to make sure that the build script is executed again when something changes.
## Patch format
You can either use [diff](http://man7.org/linux/man-pages/man1/diff.1.html) or
[git](https://linux.die.net/man/1/git) to create patch files. Important is that
file paths are relative and inside the dependency.
#### Using diff file generated by GitHub pull request
```toml
[package.metadata.patch.serde]
version = "1.0"
patches = [
{ path = "generatedByGithub.patch", source = "GithubPrDiff" },
{ path = "generatedByGithub2.patch", source = "GithubPrDiff" },
"test.patch",
"test2.patch"
]
```
## Limitations
It's only possible to patch dependencies of binary crates as it is not possible
for a subcommand to intercept the build process.