Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Patching sources of dependency crates

Sometimes it is useful to patch the sources of dependency crates without needing to wait for an upstream release to include a necessary change, or without needing to use a custom git fork.

The vendorCargoDeps, vendorCargoRegistries, vendorGitDeps, and vendorMultipleCargoDeps APIs support arbitrary overrides (i.e. patching) at the individual crate/repo level when vendoring sources. Checkout their respective API documentation for more details, but below is a short quick start example:

let baseArgs = { src = craneLib.cleanCargoSource ./.; }; isNumCpusRepo = p: lib.hasPrefix "git+https://github.com/seanmonstar/num_cpus.git" p.source; isTag1_13_1 = p: lib.hasInfix "tag=v1.13.1" p.source; cargoVendorDir = craneLib.vendorCargoDeps (baseArgs // { # Use this function to override crates coming from git dependencies overrideVendorGitCheckout = ps: drv: # For example, patch a specific repository and tag, in this case num_cpus-1.13.1 if lib.any (p: (isNumCpusRepo p) && (isTag1_13_1 p)) ps then drv.overrideAttrs (_old: { # Specifying an arbitrary patch to apply patches = [ ./0001-patch-num-cpus.patch ]; # Similarly we can also run additional hooks to make changes postPatch = '' echo running some arbitrary command to make modifications ''; }) else # Nothing to change, leave the derivations as is drv; # Use this function to override crates coming from any registry checkout overrideVendorCargoPackage = p: drv: # For example, patch a specific crate, in this case byteorder-1.5.0 if p.name == "byteorder" && p.version == "1.5.0" then drv.overrideAttrs (_old: { # Specifying an arbitrary patch to apply patches = [ ./0001-patch-byteorder.patch ]; # Similarly we can also run additional hooks to make changes postPatch = '' echo running some arbitrary command to make modifications ''; }) else # Nothing to change, leave the derivations as is drv; }); commonArgs = baseArgs // { inherit cargoVendorDir; }; in craneLib.buildPackage commonArgs