Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Vendor Patches Laravel Package

symplify/vendor-patches

Apply and manage vendor patches in Composer projects. Automatically patch dependencies after install/update, keep patches versioned in your repo, and maintain reproducible builds without forking upstream packages.

View on GitHub
Deep Wiki
Context7

Vendor Patches

Downloads total

Generate vendor patches for packages with single command.

Install

composer require symplify/vendor-patches --dev

# If you are applying patches to production, be sure to also explicitly add cweagans/composer-patches.
composer require cweagans/composer-patches

Usage

How to create a patch for a file in /vendor?

1. Create a Copy of /vendor file you Want To Change with *.old Suffix

For example, if you edit:

vendor/nette/di/src/DI/Extensions/InjectExtension.php
# copy of the file
vendor/nette/di/src/DI/Extensions/InjectExtension.php.old

2. Open the original file and change the lines you need:

 			if (DI\Helpers::parseAnnotation($rp, 'inject') !== null) {
-				if ($type = DI\Helpers::parseAnnotation($rp, 'var')) {
+				if ($type = \App\Reflection\Helper\StaticReflectionHelper::getPropertyType($rp)) {
+				} elseif ($type = DI\Helpers::parseAnnotation($rp, 'var')) {
 					$type = Reflection::expandClassName($type, Reflection::getPropertyDeclaringClass($rp));

Only *.php file is loaded, not the *.php.old one. This way you can be sure the new code is working before you generate patches.

Make sure to back up other modified files in the vendor/ directory as well as some of the commands below may overwrite them.

3. Run generate command 🥳️

vendor/bin/vendor-patches generate

This tool will generate patch files for all files created this way in /patches directory:

/patches/nette-di-di-extensions-injectextension.php.patch

The patch path is based on original file path, so the patch name is always unique.

Also, it will add configuration for cweagans/composer-patches to your composer.json:

{
    "extra": {
        "patches": {
            "nette/di": [
                "patches/nette_di_di_extensions_injectextension.patch"
            ]
        }
    }
}

3.1 When using cweagans/composer-patches v2

cweagans/composer-patches v2 requires the execution of 2 additional steps after generating the patches:

Updating the patches.lock.json file:

composer patches-relock

Applying the new patches:

composer patches-repatch

4. Final steps

Now you need to do run composer to update the lock file as the checksum of composer.json has changed:

composer update --lock

That's it!

Now all you need to do is run composer:

composer install

And your patches are applied to your code!

If not, get more information from composer to find out why:

composer install --verbose

Summary

To summarize, the generate workflow is:

# generate patches
vendor/bin/vendor-patches generate
# (if using cweagans/composer-patches v2)
composer patches-relock
composer patches-repatch
# update the lock file
composer update --lock
# install with patches applied
composer install

Patches File and Patches Folder Options

Optionally, if you use a patches file you can specify its path using the --patches-file option:

vendor/bin/vendor-patches generate --patches-file=patches.json

You can choose to write the patches to a different folder than the default 'patches' folder by specifying the folder name using the --patches-output option:

vendor/bin/vendor-patches generate --patches-output=patches-composer

Resolve From Directory Option

By default, the package name is read from each package's composer.json name field. Use --resolve-from-directory to derive the package name from its vendor/<vendor>/<package> directory instead. Useful for private repositories where the installed directory name differs from the name in composer.json.

vendor/bin/vendor-patches generate --resolve-from-directory

TroubleShooting

Upgrading from older versions of cweagans/composer-patches (pre 2.0.0)

If you are upgrading cweagans/composer-patches to 2.0.0 and newer versions, you may need to adjust your patches to ensure compatibility.

The new version requires that --- /dev/null needs to be replaced with --- <file-path> in your patch files.

For example, if you have an old patch file that starts with:

--- /dev/null
+++ ../src/SomeFile.php
@@ -0,0 +1,10 @@
+<?php
+// some code

You need to change it to:

--- ../src/SomeFile.php
+++ ../src/SomeFile.php
@@ -0,0 +1,10 @@
+<?php
+// some code

macOS

If you are on macOS, and got hang on applying patch, you may need to install gpatch, you can install with:

brew install gpatch

and register to .bash_profile or .zshrc (if you're using oh-my-zsh):

PATH="/opt/homebrew/opt/gpatch/libexec/gnubin:$PATH"
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle
atriumphp/atrium
sandermuller/package-boost-laravel
sandermuller/boost-skills
redaxo/core
yusufgenc/filament-api-forge
l3aro/rating-star-for-filament
leek/filament-subtenant-scope