Usage
Defining Patches
Format
You can describe patches to the plugin in one of two ways: the compact format or the expanded format.
Local files are supported too!
Avoid using patches autogenerated by PR/MR URLs
Compact format
1{
2 [...],
3 "extra": {
4 "patches": {
5 "the/project": {
6 "This is the description of the patch": "https://www.example.com/path/to/file.patch",
7 "This is another patch": "https://www.example.com/different/path/to/file.patch"
8 }
9 }
10 }
11}
This is the format that you may be familiar with from previous versions of Composer Patches. In your composer.json
, this is an object with descriptions as keys and patch URLs for values. While this format is more convenient, it has some shortcomings - namely that only a description and URL can be specified. If this works for you/your project, you can keep using this format.
Expanded format
1{
2 [...],
3 "extra": {
4 "patches": {
5 "the/project": [
6 {
7 "description": "This is the description of the patch",
8 "url": "https://www.example.com/path/to/file.patch"
9 },
10 {
11 "description": "This is another patch",
12 "url": "https://www.example.com/different/path/to/file.patch"
13 }
14 ]
15 }
16 }
17}
Internally, the plugin uses the expanded format for all patches. Similar to the compact format, the only required fields in the expanded format are description
and url
. However, in the expanded format, you can specify several other fields:
1{
2 [...],
3 "extra": {
4 "patches": {
5 "the/project": [
6 {
7 "description": "This is the description of the patch",
8 "url": "https://www.example.com/path/to/file.patch",
9 "sha256": "6f024c51ca5d0b6568919e134353aaf1398ff090c92f6173f5ce0315fa266b93",
10 "depth": 2,
11 "extra": {},
12 },
13 {
14 "description": "This is another patch",
15 "url": "https://www.example.com/different/path/to/file.patch",
16 "sha256": "795a84197ee01b9d50b40889bc5689e930a8839db3d43010e887ddeee643ccdc",
17 "depth": 3,
18 "extra": {
19 "issue-tracker-url": "https://jira.ecorp.com/issues/SM-519"
20 }
21 }
22 ]
23 }
24 }
25}
sha256
can either be specified in your patch definition as above or the sha256 of a patch file will be calculated and written to your patches.lock.json
file as part of installation.
depth
can be specified on a per-patch basis. If specified, this value overrides any other defaults. If not specified, the first available depth out of the following will be used:
- A package-specific depth set in
package-depths
- Any package-specific depth override set globally in the plugin (see
cweagans\Composer\Util::getDefaultPackagePatchDepth()
for details.) - The global
default-patch-depth
extra
is primarily a place for developers to store extra data related to a patch, but if you just need a place to put some extra data about a patch, extra
is a good place for it. No validation is performed on the contents of extra
. The Freeform patcher stores data here.
Locations
Patches can be defined in multiple places. With the default configuration, you can define plugins in either composer.json
or a patches.json
file.
composer.json
As in previous versions of Composer Patches, you can store patch definitions in your root composer.json
like so:
1{
2 [...],
3 "extra": {
4 "patches": {
5 // your patch definitions here
6 }
7 }
8}
This approach works for many teams, but you should consider moving your patch definitions to a separate patches.json
. Doing so will mean that you don’t have to update composer.lock
every time you change a patch. Because patch data is locked in patches.lock.json
, moving the data out of composer.json
has little downside and can improve your workflow substantially.
Patches file
If you’re defining patches in patches.json
(or some other separate patches file), the same formats can be used. Rather than nesting patch definitions in the extra
key in composer.json
, the plugin expects patches to be defined in a root-level patches
key like so:
1{
2 "patches": {
3 // your patch definitions here
4 }
5}
Dependencies
Packages required by your project can define patches as well. They can do so by defining patches in their root composer.json
file. Defining patches in a separate patches.json
in a dependency is currently unsupported.
Patch paths are always relative to the root of your project
Duplicate patches
If the same patch is defined in multiple places, the first one added to the patch collection “wins”. Subsequent definitions of the same patch will be ignored without emitting an error. The criteria used for determining whether two patches are the same are:
- They have the same URL
- They have the same sha256 hash
patches.lock.json
If patches.lock.json
does not exist the first time you run composer install
with this plugin enabled, one will be created for you. Generally, you shouldn’t need to do anything with this file: commit it to your project repository alongside your composer.json
and composer.lock
, and commit any changes when you change your patch definitions.
This file is similar to composer.lock
in that it includes a _hash
and the expanded definition for all patches in your project. When patches.lock.json
exists, patches will be installed from the locked definitions in this file (instead of using the definitions in composer.json
or elsewhere).