PHP Composer: Perbaiki dependensi tanpa rasa sakit

Banyak dari Anda pasti menemukan situasi di mana ada bug atau tidak fungsi yang diperlukan di perpustakaan atau kerangka kerja yang Anda gunakan. Misalkan Anda tidak terlalu malas dan membentuk permintaan tarik. Tetapi mereka tidak akan menerimanya segera, dan rilis produk berikutnya secara umum dapat terjadi dalam setahun.


Komposer PHP: memulihkan dependensi tanpa rasa sakit


Apa yang harus dilakukan jika Anda perlu melakukan koreksi terhadap produk? Solusi yang jelas adalah dengan menggunakan garpu perpustakaan atau kerangka kerja. Namun, tidak semuanya sederhana dengan garpu. Menggunakan warisan untuk mengganti fungsi yang perlu diubah tidak selalu mungkin dan seringkali membutuhkan perubahan besar. Plugin untuk Komposer yang dapat menambal dependensi datang untuk menyelamatkan.


Dalam artikel ini saya akan berbicara lebih banyak tentang mengapa garpu tidak nyaman, dan juga mempertimbangkan dua plugin untuk Composer untuk penambalan dependensi: bagaimana mereka berbeda, bagaimana cara menggunakannya dan apa keuntungan mereka. Jika Anda mengalami masalah yang sama atau hanya ingin tahu, selamat datang di kucing.


Masalahnya paling mudah dipertimbangkan dengan sebuah contoh. Katakanlah kita ingin mengubah sesuatu di perpustakaan PHP Code Coverage , yang digunakan dalam kerangka pengujian PHPUnit untuk mengukur tingkat cakupan kode dengan tes. Misalkan kita ingin memperbaiki sesuatu seperti ini di versi 7.0.8 (file myFix.patch ):


 diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 2c92ae2..514171e 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -190,6 +190,7 @@ public function filter(): Filter */ public function getData(bool $raw = false): array { + // for example some changes here if (!$raw && $this->addUncoveredFilesFromWhitelist) { $this->addUncoveredFilesFromWhitelist(); } 

Mari kita buat perpustakaan contoh kita. Biarkan itu menjadi php-composer-patches-example . Detail di sini tidak terlalu penting, tetapi jika Anda memutuskan untuk melihat apa perpustakaan itu, saya membawa output konsol di bawah spoiler.


Teks tersembunyi
 $ git clone git@github.com:mougrim/php-composer-patches-example.git   «php-composer-patches-example»… remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0  : 100% (3/3), . $ cd php-composer-patches-example/ $ $ composer.phar init --name=mougrim/php-composer-patches-example --description="It's an example for article with using forks and patches for changing dependencies" --author='Mougrim <rinat@mougrim.ru>' --type=library --require='phpunit/phpunit:^8.4.2' --license=MIT --homepage='https://github.com/mougrim/php-composer-patches-example' Welcome to the Composer config generator This command will guide you through creating your composer.json config. Package name (<vendor>/<name>) [mougrim/php-composer-patches-example]: Description [It's an example for article with using forks and patches for changing dependencies]: Author [Mougrim <rinat@mougrim.ru>, n to skip]: Minimum Stability []: Package Type (eg library, project, metapackage, composer-plugin) [library]: License [MIT]: Define your dependencies. Would you like to define your dev dependencies (require-dev) interactively [yes]? no { "name": "mougrim/php-composer-patches-example", "description": "It's an example for article with using forks and patches for changing dependencies", "type": "library", "homepage": "https://github.com/mougrim/php-composer-patches-example", "require": { "phpunit/phpunit": "^8.4.2" }, "license": "MIT", "authors": [ { "name": "Mougrim", "email": "rinat@mougrim.ru" } ] } Do you confirm generation [yes]? yes Would you like to install dependencies now [yes]? yes Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 29 installs, 0 updates, 0 removals - Installing sebastian/version (2.0.1): Loading from cache - Installing sebastian/type (1.1.3): Loading from cache - Installing sebastian/resource-operations (2.0.1): Loading from cache - Installing sebastian/recursion-context (3.0.0): Loading from cache - Installing sebastian/object-reflector (1.1.1): Loading from cache - Installing sebastian/object-enumerator (3.0.3): Loading from cache - Installing sebastian/global-state (3.0.0): Loading from cache - Installing sebastian/exporter (3.1.2): Loading from cache - Installing sebastian/environment (4.2.2): Loading from cache - Installing sebastian/diff (3.0.2): Loading from cache - Installing sebastian/comparator (3.0.2): Loading from cache - Installing phpunit/php-timer (2.1.2): Loading from cache - Installing phpunit/php-text-template (1.2.1): Loading from cache - Installing phpunit/php-file-iterator (2.0.2): Loading from cache - Installing theseer/tokenizer (1.1.3): Loading from cache - Installing sebastian/code-unit-reverse-lookup (1.0.1): Loading from cache - Installing phpunit/php-token-stream (3.1.1): Loading from cache - Installing phpunit/php-code-coverage (7.0.8): Loading from cache - Installing doctrine/instantiator (1.2.0): Loading from cache - Installing symfony/polyfill-ctype (v1.12.0): Loading from cache - Installing webmozart/assert (1.5.0): Loading from cache - Installing phpdocumentor/reflection-common (2.0.0): Loading from cache - Installing phpdocumentor/type-resolver (1.0.1): Loading from cache - Installing phpdocumentor/reflection-docblock (4.3.2): Loading from cache - Installing phpspec/prophecy (1.9.0): Loading from cache - Installing phar-io/version (2.0.1): Loading from cache - Installing phar-io/manifest (1.0.3): Loading from cache - Installing myclabs/deep-copy (1.9.3): Loading from cache - Installing phpunit/phpunit (8.4.2): Loading from cache sebastian/global-state suggests installing ext-uopz (*) phpunit/phpunit suggests installing phpunit/php-invoker (^2.0.0) phpunit/phpunit suggests installing ext-soap (*) Writing lock file Generating autoload files $ $ echo 'vendor/' > .gitignore $ echo 'composer.lock' >> .gitignore $ git add .gitignore composer.json $ $ git commit --gpg-sign --message='Init composer' [master ce800ae] Init composer 2 files changed, 18 insertions(+) create mode 100644 .gitignore create mode 100644 composer.json $ git push origin master  : 4, . Delta compression using up to 4 threads.  : 100% (3/3), .  : 100% (4/4), 1.21 KiB | 1.21 MiB/s, . Total 4 (delta 0), reused 0 (delta 0) To github.com:mougrim/php-composer-patches-example.git f31c342..ce800ae master -> master 

Apa yang salah dengan garpu kecanduan


Mari kita lihat bagaimana ketergantungan garpu terjadi. Mari kita coba pertanggungan Kode PHP.


  1. Kami pergi ke halaman Cakupan Kode PHP di GitHub .
  2. Tekan tombol Fork Tombol Fork (catatan: Anda akan memiliki garpu, ganti mougrim dengan nama pengguna Anda).
  3. Mengkloning garpu:
     cd ../ git clone git@github.com:mougrim/php-code-coverage.git cd php-code-coverage 
  4. Buka versi yang ingin kami tambal:
     git checkout 7.0.8 
  5. Buat cabang untuk diperbaiki:
     git checkout -b 7.0.8-myFix 
  6. Kami melakukan perubahan yang diperlukan, komit, dorong:
     git apply ../myFix.patch git add src/CodeCoverage.php git commit --gpg-sign --message='My fix' git push -u origin 7.0.8-myFix 
  7. Tambahkan fork sebagai repositori di composer.json untuk perpustakaan kami (ini diperlukan agar saat menghubungkan paket phpunit/php-code-coverage , bukan paket asli yang terhubung, tetapi fork):
     cd ../php-composer-patches-example git checkout -b useFork composer.phar config repositories.phpunit/php-code-coverage vcs https://github.com/mougrim/php-code-coverage.git 
  8. Ubah versi dependensi menjadi brunch:
     composer.phar require phpunit/php-code-coverage 'dev-7.0.8-myFix' 

Tetapi sebenarnya ini masih lebih rumit: Komposer mengatakan bahwa pemasangan tidak mungkin, karena phpunit/phpunit memerlukan versi phpunit/php-code-coverage ^7.0.7 , dan untuk proyek kami memerlukan dev-7.0.8-myFix :


 $ composer.phar require phpunit/php-code-coverage 'dev-7.0.8-myFix' ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Your requirements could not be resolved to an installable set of packages. Problem 1 - phpunit/phpunit 8.4.2 requires phpunit/php-code-coverage ^7.0.7 -> satisfiable by phpunit/php-code-coverage[7.0.x-dev]. - phpunit/phpunit 8.4.2 requires phpunit/php-code-coverage ^7.0.7 -> satisfiable by phpunit/php-code-coverage[7.0.x-dev]. - phpunit/phpunit 8.4.2 requires phpunit/php-code-coverage ^7.0.7 -> satisfiable by phpunit/php-code-coverage[7.0.x-dev]. - Can only install one of: phpunit/php-code-coverage[7.0.x-dev, dev-7.0.8-myFix]. - Installation request for phpunit/php-code-coverage dev-7.0.8-myFix -> satisfiable by phpunit/php-code-coverage[dev-7.0.8-myFix]. - Installation request for phpunit/phpunit ^8.4.2 -> satisfiable by phpunit/phpunit[8.4.2]. Installation failed, reverting ./composer.json to its original content. 

Apa yang harus dilakukan? Ada empat opsi:


  1. Selain fork phpunit/php-code-coverage , fork PHPUnit dan tulis versi dev-7.0.8-myFix untuk dependensi phpunit/php-code-coverage . Jalur ini agak rumit dalam hal dukungan dan semakin rumit semakin banyak perpustakaan bergantung pada phpunit/php-code-coverage .
  2. Gunakan alias saat menghubungkan phpunit/php-code-coverage . Tetapi alias tidak ditarik dari dependensi, yang berarti bahwa mereka akan selalu perlu ditulis secara manual.
  3. Buat phpunit/php-code-coverage di fork Anda sehingga tag 7.0.8 ke commit lain. Ini setidaknya tidak jelas, tetapi maksimal - di Git tidak nyaman untuk bekerja dengan tag yang merujuk pada berbagai komitmen dengan nama yang sama di repositori jarak jauh yang berbeda.
  4. Di fork phpunit/php-code-coverage gunakan tag rilis alpha, misalnya 7.0.8-a+myFix (mungkin ada tabrakan dengan rilis alpha dari pustaka sumber).

Semua opsi memiliki kekurangannya. Saya juga mencoba menggunakan tag seperti 7.0.8.1 , tetapi Composer tidak menerima tag tersebut.


Pilihan kedua dan keempat tampaknya lebih sedikit dari kejahatan. Dengan jumlah tindakan mereka kira-kira sama, dalam artikel ini kami hanya akan mempertimbangkan satu - keempat. Buat tag rilis alfa:


 cd ../php-code-coverage git tag 7.0.8-a+myFix git push origin 7.0.8-a+myFix cd ../php-composer-patches-example composer.phar require phpunit/php-code-coverage '7.0.8-a+myFix' git add composer.json git commit --gpg-sign --message='Use fork' git push -u origin useFork 

Katakanlah kita ingin menggunakan pustaka kita mougrim/php-composer-patches-example dalam proyek yang bergantung pada phpunit/phpunit . Di sini, seseorang tidak dapat melakukannya tanpa perdukunan, Anda harus menentukan repositori lagi https://github.com/mougrim/php-code-coverage.git untuk phpunit/php-code-coverage , serta secara eksplisit menunjukkan ketergantungan pada phpunit/php-code-coverage versi 7.0.8-a+myFix (jika tidak instalasi tidak akan berhasil):


 cd ../ mkdir php-project cd php-project/ composer.phar require phpunit/phpunit '^8.4.2' composer.phar config repositories.mougrim/php-composer-patches-example vcs https://github.com/mougrim/php-composer-patches-example.git composer.phar config repositories.phpunit/php-code-coverage vcs https://github.com/mougrim/php-code-coverage.git composer.phar require phpunit/php-code-coverage 7.0.8-a+myFix composer.phar require mougrim/php-composer-patches-example dev-useFork 

Harap dicatat bahwa contoh php-composer-patches terhubung sebagai repositori, karena repositori ini hanyalah sebuah contoh dan karenanya belum ditambahkan ke Packagist. Dalam kasus Anda, langkah ini kemungkinan besar akan dilewati.


Untuk meringkas penggunaan garpu.


Keuntungan dari pendekatan ini:


  • Tidak perlu menginstal plugin untuk Composer.

Kekurangan dari pendekatan ini:


  • jika Anda menggunakan roave/security-advisories , maka Anda tidak akan melihat informasi bahwa versi dependensi yang Anda gali dan modifikasi mengandung kerentanan;
  • ketika versi baru dari dependensi keluar, cerita fork harus diulang lagi;
  • jika Anda ingin memperbaiki dependensi dependensi, seperti dalam contoh yang dipertimbangkan, maka dev-* tidak akan bekerja untuk itu dan Anda harus perdukunan dengan versi atau fork untuk dependensi yang saling bertentangan;
  • jika ada proyek yang bergantung pada perpustakaan Anda, Anda tidak perlu menginstal perpustakaan di proyek dengan cara yang paling jelas dan nyaman;
  • jika ada proyek yang bergantung pada pustaka Anda, bagi mereka versi phpunit/php-code-coverage akan benar-benar diperbaiki, yang tidak selalu dapat diterima;
  • Terlebih lagi, jika proyek dari poin-poin di atas sudah bercabang dengan PHP Code Coverage untuk beberapa alasan lain, maka semuanya menjadi lebih rumit.

Saya pikir Anda sudah menyadari bahwa kecanduan forking bukanlah ide yang baik.


Menggunakan cweagans / komposer-patch


Sekali lagi mengalami rasa sakit dan menderita menggunakan garpu, saya menemukan cweagans/composer-patches di PHP Digest No. 101 (omong-omong, pronskiy memiliki blog yang berguna, saya sarankan berlangganan). Ini adalah plugin untuk omposer, yang memungkinkan Anda menerapkan tambalan untuk dependensi. Setelah membaca deskripsi, saya pikir inilah yang Anda butuhkan.


Cara menggunakan cweagans / komposer-patch:


  1. Klon Cakupan Kode PHP:
     cd ../ rm -rf php-code-coverage git clone git@github.com:sebastianbergmann/php-code-coverage.git cd php-code-coverage 
  2. Buka versi yang ingin kami tambal:
     git checkout 7.0.8 
  3. Kami melakukan perubahan yang diperlukan.
  4. Buat tambalan:
     mkdir -p ../php-composer-patches-example/patches/phpunit/php-code-coverage git diff HEAD > ../php-composer-patches-example/patches/phpunit/php-code-coverage/myFix.patch 
  5. Dalam proyek kami, kami menghubungkan cweagans/composer-patches :
     cd ../php-composer-patches-example git checkout master composer.phar update git checkout -b cweagansComposerPatches composer.phar require cweagans/composer-patches '^1.6.7' 
  6. Untuk mengkonfigurasi cweagans/composer-patches tambahkan yang berikut ke composer.json (Anda dapat menentukan beberapa patches untuk satu paket):
     { "config": { "preferred-install": "source" }, "extra": { "patches": { "phpunit/php-code-coverage": { "My fix description": "patches/phpunit/php-code-coverage/myFix.patch" } }, "enable-patching": true } } 
  7. Perbarui dependensi:
     composer.phar update 
  8. Jika ada yang salah, ini bisa dilihat pada output dari perintah sebelumnya, tetapi untuk berjaga-jaga, Anda dapat memeriksa bahwa perubahan kami telah diterapkan:
     $ grep example vendor/phpunit/php-code-coverage/src/CodeCoverage.php // for example some changes here 
  9. Komit dan dorong hasilnya:
     git add composer.json patches/phpunit/php-code-coverage/myFix.patch git commit --gpg-sign --message='Use cweagans/composer-patches' git push -u origin cweagansComposerPatches 

Kami memastikan bahwa ketika menginstal perpustakaan kami di proyek, tambalan juga akan berlaku.


Buat proyek:


 cd ../ rm -rf php-project mkdir php-project cd php-project composer.phar require phpunit/phpunit '^8.4.2' 

Tambahkan baris berikut ke composer.json :


 { "extra": { "enable-patching": true } } 

Instal mougrim/php-composer-patches-example :


 composer.phar config repositories.mougrim/php-composer-patches-example vcs https://github.com/mougrim/php-composer-patches-example.git composer.phar require mougrim/php-composer-patches-example dev-cweagansComposerPatches 

Tampaknya saat menghubungkan paket seharusnya ada upaya untuk menerapkan tambalan, tetapi tidak.
Kami memperbarui paket sehingga tambalan berlaku, tetapi ini tidak terjadi:


 $ composer.phar update Removing package phpunit/php-code-coverage so that it can be re-installed and re-patched. - Removing phpunit/php-code-coverage (7.0.8) Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals No patches supplied. Gathering patches for dependencies. This might take a minute. - Installing phpunit/php-code-coverage (7.0.8): Loading from cache - Applying patches for phpunit/php-code-coverage patches/phpunit/php-code-coverage/myFix.patch (My fix description) Could not apply patch! Skipping. The error was: The "patches/phpunit/php-code-coverage/myFix.patch" file could not be downloaded: failed to open stream: No such file or directory Writing lock file Generating autoload files 

Setelah mencari-cari di pelacak bug, saya menemukan patch berbasis File tidak diselesaikan dalam bug dependensi . Ternyata Anda harus menentukan URL sebelum tambalan (yang berarti mengunduh dari suatu tempat), atau menentukan jalur ke tambalan secara manual di setiap proyek tempat Anda memasang dependensi yang memerlukan tambalan.


Untuk meringkas penggunaan cweagans/composer-patches .


Keuntungan dari pendekatan ini:


  • plugin memiliki komunitas;
  • roave/security-advisories tidak akan berhenti bekerja;
  • ketika versi baru dari dependensi dirilis, jika patch berhasil diterapkan, itu akan cukup untuk memastikan bahwa semuanya berfungsi dengan versi baru (untuk rilis minor, dengan probabilitas tinggi itu akan bekerja dengan sendirinya, untuk rilis besar juga kemungkinan tidak ada yang harus dilakukan);
  • jika ada proyek yang bergantung pada pustaka Anda, bagi mereka versi phpunit/php-code-coverage tidak akan sepenuhnya diperbaiki;
  • Selain itu, dalam kasus paragraf di atas, proyek semacam itu akan dapat menerapkan tambalannya dalam Cakupan Kode PHP.

Cons:


  • Ini adalah plugin untuk Komposer, yang berarti bahwa ketika memperbarui Komposer mungkin rusak;
  • enable-patching=true harus ditentukan agar tambalan diterapkan dari dependensi;
  • pengelola proyek utama tidak punya banyak waktu untuk menghadapinya, oleh karena itu, sebagai suatu peraturan, ia menerima permintaan tarik, tetapi tidak secara khusus mengembangkan proyek (misalnya, ia memiliki ide untuk versi kedua dalam tugas , tetapi sedikit yang berubah setelah tiga tahun);
  • ada tambalan berbasis File tidak diselesaikan dalam bug dependensi , yang tidak nyaman dan telah menggantung di tumpukan selama tiga tahun sekarang;
  • Anda tidak dapat menggunakan tambalan yang berbeda untuk versi dependensi yang berbeda.

Poin terakhir telah menjadi penghalang bagi saya. Pertama saya membuat permintaan fitur . Pemelihara menulis bahwa ia tidak ingin menambahkan fitur ini ke kode utama, tetapi pada versi kedua akan dimungkinkan untuk menulis plug-in (ya, plug-in untuk plug-in untuk Composer). Prospek untuk versi kedua tidak jelas, jadi saya memutuskan untuk mencari alternatif. Di antara daftar kecil saya tidak menemukan plugin yang akan didukung.


Saya tidak ingin masuk ke kode plugin, jadi saya memutuskan untuk garpu garpu - pasti, seseorang sudah menemukan masalah dan menyelesaikannya.


Menggunakan Vaimo Composer Patches


Di sebagian besar garpu tidak ada perbedaan sama sekali dari aslinya (mengapa mereka bahkan bercabang?). Sebagian dari fork dibuat untuk permintaan tarik, yang sudah digabung dengan perpustakaan utama. Namun, ada satu kandidat yang menarik yang sedang memecahkan masalah saya - Vaimo Composer Patches . Pada saat itu masih dibingkai sebagai garpu, tetapi pengelolanya, tampaknya, tidak akan melakukan permintaan tarik. Antara lain, misalnya, dia sudah mengubah nama paket menjadi vaimo/composer-patches . Tetapi ada masalah: masalah dinonaktifkan, yaitu, tidak ada umpan balik dari penulis sama sekali. Juga, plugin tidak di-host di Packagist .


Garpu yang baik seperti itu tidak boleh hilang di tumpukan garpu yang tidak berguna lainnya. Oleh karena itu, saya menghubungi penulis dengan permintaan untuk mengaktifkan masalah dan menambahkan paket ke Packagist. Setelah hampir satu bulan, penulis menjawab dan melakukan semua ini. :)


Menggunakan vaimo/composer-patches tidak berbeda dengan menggunakan plugin sebelumnya, tetapi Anda dapat menentukan patch yang berbeda untuk versi yang berbeda.


  1. Kami memutar kembali perpustakaan kami (menghapus folder vendor diperlukan, karena plugin cweagans/composer-patches dan vaimo/composer-patches tidak sangat kompatibel satu sama lain):
     cd ../php-composer-patches-example git checkout master rm -rf vendor/ composer.phar update 
  2. Kami melakukan poin 1-4 dari bagian sebelumnya.
  3. Dalam proyek kami, kami menghubungkan vaimo/composer-patches :
     cd ../php-composer-patches-example git checkout -b vaimoComposerPatches composer.phar require vaimo/composer-patches '^4.20.2' 
  4. Untuk mengkonfigurasi vaimo/composer-patches tambahkan yang berikut ini ke composer.json (dokumentasi dapat dilihat di sini ):
     { "extra": { "patches": { "phpunit/php-code-coverage": { "My fix description": { "< 7.0.0": "patches/phpunit/php-code-coverage/myFix-leagcy.patch", ">= 7.0.0": "patches/phpunit/php-code-coverage/myFix.patch" } } } } } 
  5. Perbarui dependensi:
     composer.phar update 
  6. Jika terjadi kesalahan, ini dapat dilihat pada output dari perintah sebelumnya, tetapi untuk berjaga-jaga, Anda dapat memastikan bahwa perubahan kami diterapkan:
     $ grep example vendor/phpunit/php-code-coverage/src/CodeCoverage.php // for example some changes here 
  7. Komit dan dorong hasilnya:
     git add composer.json patches/phpunit/php-code-coverage/myFix.patch git commit --gpg-sign --message='Use vaimo/composer-patches' git push -u origin vaimoComposerPatches 

Kami memastikan bahwa ketika menginstal perpustakaan kami di proyek, tambalan juga akan berlaku.


Buat proyek dan instal mougrim/php-composer-patches-example :


 cd ../ rm -rf php-project mkdir php-project cd php-project composer.phar require phpunit/phpunit '^8.4.2' composer.phar config repositories.mougrim/php-composer-patches-example vcs https://github.com/mougrim/php-composer-patches-example.git composer.phar require mougrim/php-composer-patches-example dev-vaimoComposerPatches 

Untuk jaga-jaga, Anda dapat memastikan bahwa perubahan kami telah diterapkan:


 $ grep example vendor/phpunit/php-code-coverage/src/CodeCoverage.php // for example some changes here 

Untuk merangkum penggunaan vaimo/composer-patches .


Kelebihan dari plugin ini hampir sama dengan yang sebelumnya, tetapi juga termasuk yang berikut:


  • pengelola secara aktif mengembangkan plugin dan telah merilis versi utama keempat;
  • tidak perlu menentukan apa pun tambahan untuk tambalan dari dependensi untuk diterapkan;
  • Anda dapat menggunakan tambalan yang berbeda untuk versi dependensi yang berbeda;
  • plugin memiliki banyak pengaturan, jadi jika fungsionalitas yang dijelaskan dalam artikel tidak cukup untuk Anda, maka lihat dokumentasi - mungkin fitur yang Anda butuhkan sudah diterapkan.

Cons:


  • seperti yang sebelumnya, ini adalah plugin untuk Komposer, yang berarti bahwa ketika memperbarui Komposer mungkin rusak;
  • tidak seperti plugin sebelumnya, komunitas ini memiliki lebih sedikit.

Kesimpulan


Untuk merangkum hasil umum:


  • menggunakan garpu paket untuk perbaikan kecil tidak nyaman;
  • cweagans/composer-patches adalah plugin yang bagus, tetapi berkembang dengan buruk, jadi saya tidak merekomendasikannya;
  • Vaimo Composer Patches adalah plugin yang sangat baik yang memecahkan masalah memperbaiki dependensi dengan baik, dan juga memiliki banyak pengaturan;
  • Vaimo Composer Patches memiliki komunitas kecil, tetapi saya harap artikel ini akan menambahnya;
  • jika banyak perubahan diperlukan dalam dependensi, maka mungkin lebih mudah untuk menggunakan hard fork (jaga agar garpu independen dari dependensi asli).

Saya juga membuat kesimpulan tidak langsung: jika beberapa jenis ketergantungan tidak menyediakan fungsionalitas yang diperlukan, maka mungkin ada percabangan yang mengimplementasikan fungsi ini dan bahkan lebih.


Di Badoo, kami menggunakan Vaimo Composer Patches dalam dua kasus:


  • di SoftMock untuk menambal PHPUnit dan Cakupan Kode PHP;
  • dalam repositori internal untuk perbaikan Webmozart Assert untuk kompatibilitas dengan SoftMocks sebagai perbaikan sementara (sementara SoftMocks tidak mendukung konstruksi array_map(array('static', 'valueToString') ).

Rinat Akhmadeev, Sr. Pengembang PHP


UPD1 : Terima kasih BoShurik untuk tautannya ke alias . Menambahkan poin tentang alias ke artikel.

Source: https://habr.com/ru/post/id473654/


All Articles