ربما صادف العديد منكم موقفًا يوجد فيه خطأ أو لا الوظائف الضرورية في المكتبة أو الإطار الذي تستخدمه. افترض أنك لم تكن كسولًا جدًا وشكلت طلب سحب. لكنهم لن يقبلوه على الفور ، وقد يحدث الإصدار التالي للمنتج بشكل عام في غضون عام.

ماذا تفعل إذا كنت بحاجة ماسة إلى تصحيح التصحيح للمنتج؟ الحل الواضح هو استخدام شوكة مكتبة أو إطار عمل. ومع ذلك ، ليس كل شيء بسيط مع الشوك. استخدام الوراثة لتجاوز الوظيفة التي يجب تغييرها غير ممكن دائمًا وغالبًا ما يتطلب تغييرات كبيرة. الإضافات للملحن التي يمكن تصحيح التبعيات تأتي لإنقاذ.
سوف أتحدث في هذه المقالة أكثر عن سبب عدم ملائمة الشوك ، وسأنظر أيضًا في مكونين إضافيين لـ Composer لتعديل التبعية: كيف تختلف ، وكيفية استخدامها وما هي مزاياها. إذا واجهت مشاكل مماثلة أو كنت تتساءل فقط ، مرحبًا بك في cat.
المشكلة هي الأكثر ملاءمة مع مثال. دعنا نقول أننا نريد تغيير شيء ما في مكتبة تغطية رمز PHP ، والذي يتم استخدامه في إطار اختبار PHPUnit لقياس مستوى تغطية التعليمات البرمجية عن طريق الاختبارات. لنفترض أننا نريد إصلاح شيء مثل هذا في الإصدار 7.0.8 (ملف 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(); }
دعونا إنشاء مكتبة المثال لدينا. فليكن php-composer-patches-example . التفاصيل هنا ليست مهمة للغاية ، لكن في حال قررت معرفة ماهية المكتبة ، أحمل إخراج وحدة التحكم تحت المفسد.
النص المخفي $ 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
ما هو الخطأ في شوكة الإدمان
دعونا نرى كيف يحدث التبعية شوكة. لنجرب شوكة كود تغطية PHP.
- نذهب إلى صفحة تغطية كود PHP على جيثب .
- اضغط على زر شوكة
(ملاحظة: سيكون لديك شوكة ، استبدل mougrim باسم المستخدم الخاص بك). - استنساخ الشوكة:
cd ../ git clone git@github.com:mougrim/php-code-coverage.git cd php-code-coverage
- انتقل إلى الإصدار الذي نريد تصحيحه:
git checkout 7.0.8
- إنشاء فرع للإصلاح:
git checkout -b 7.0.8-myFix
- نجري التغييرات اللازمة والالتزام والدفع:
git apply ../myFix.patch git add src/CodeCoverage.php git commit --gpg-sign --message='My fix' git push -u origin 7.0.8-myFix
- أضف شوكة كمستودع في composer.json لمكتبتنا (هذا ضروري حتى عند توصيل حزمة
phpunit/php-code-coverage
، لا يتم توصيل الحزمة الأصلية ، ولكن الشوكة):
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
- تغيير إصدار التبعية إلى الغداء:
composer.phar require phpunit/php-code-coverage 'dev-7.0.8-myFix'
ولكن في الواقع لا يزال الأمر أكثر تعقيدًا: يقول الملحن إن التثبيت أمر مستحيل ، لأن phpunit/phpunit
يتطلب إصدار phpunit/php-code-coverage
^7.0.7
، ويتطلب مشروعنا 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.
ماذا تفعل حيال ذلك؟ هناك أربعة خيارات:
- بالإضافة إلى
phpunit/php-code-coverage
، شوكة PHPUnit واكتب النسخة dev-7.0.8-myFix
لتغطية التبعية phpunit/php-code-coverage
. هذا المسار معقد إلى حد ما من حيث الدعم وكلما زاد عدد المكتبات اعتمادًا على phpunit/php-code-coverage
. - استخدم الاسم المستعار عند توصيل
phpunit/php-code-coverage
. لكن الأسماء المستعارة لا يتم سحبها من التبعيات ، مما يعني أنها ستحتاج دائمًا إلى كتابتها يدويًا. - اجعل
phpunit/php-code-coverage
في مفترق 7.0.8
بحيث 7.0.8
علامة 7.0.8
إلى التزام آخر. هذا غير واضح على الأقل ، لكن على أقصى تقدير - في Git ، من غير المريح التعامل مع العلامات التي تشير إلى عمليات ارتكاب مختلفة بنفس الاسم في مستودعات تخزين عن بُعد مختلفة. - في
phpunit/php-code-coverage
fork phpunit/php-code-coverage
استخدم علامة إصدار alpha ، على سبيل المثال 7.0.8-a+myFix
(قد يكون هناك تصادمات مع إصدارات alpha من المكتبة المصدر).
جميع الخيارات لها عيوبها. حاولت أيضًا استخدام علامة مثل 7.0.8.1
، لكن الملحن لا يقبل هذه العلامات.
يبدو الخياران الثاني والرابع أقل شرورًا. من خلال عدد الإجراءات التي تتشابه تقريبًا ، سننظر في هذه المقالة في إجراء واحد فقط - الإجراء الرابع. إنشاء علامة إصدار alpha:
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
دعنا نقول أننا نريد استخدام مكتبتنا mougrim/php-composer-patches-example
في مشروع يعتمد على phpunit/phpunit
. هنا ، لا يمكن الاستغناء عن الشامانية ، سيتعين عليك مرة أخرى تحديد مستودع https://github.com/mougrim/php-code-coverage.git
لتغطية phpunit/php-code-coverage
، وكذلك الإشارة صراحة إلى الاعتماد على phpunit/php-code-coverage
الإصدار 7.0.8-a+myFix
(وإلا لن ينجح التثبيت):
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
يرجى ملاحظة أن php-composer-patches-example متصل كمستودع ، لأن هذا المستودع هو مجرد مثال وبالتالي لم تتم إضافته إلى Packagist. في حالتك ، من المرجح أن يتم تخطي هذه الخطوة.
لتلخيص استخدام الشوك.
مزايا هذا النهج:
- لا حاجة لتثبيت الإضافات للملحن.
سلبيات هذا النهج:
- إذا كنت تستخدم
roave/security-advisories
، فلن ترى معلومات تفيد بأن إصدار التبعية التي قمت بتشكيلها وتعديلها يحتوي على ثغرة أمنية ؛ - عندما تظهر نسخة جديدة من التبعية ، يجب تكرار قصة الشوكة من جديد ؛
- إذا كنت ترغب في إصلاح تبعية التبعية ، كما هو موضح في المثال المدروس ، فلن يعمل dev
dev-*
أجله وعليك أن تشعري بالإصدارات أو الشوكة للتبعيات المتعارضة ؛ - إذا كانت هناك مشاريع تعتمد على مكتبتك ، فلن تضطر إلى تثبيت المكتبة في المشروع بأكثر الطرق وضوحًا وملاءمة ؛
- إذا كانت هناك مشاريع تعتمد على مكتبتك ،
phpunit/php-code-coverage
إصدار phpunit/php-code-coverage
بالنسبة لهم ، وهو أمر غير مقبول دائمًا ؛ - علاوة على ذلك ، إذا كانت المشاريع من النقاط أعلاه متشعبة بالفعل تغطية كود PHP لسبب آخر ، فسيصبح كل شيء أكثر تعقيدًا.
أعتقد أنك أدركت بالفعل أن إدمان الشوكة ليست فكرة جيدة.
باستخدام cweagans / بقع الملحن
مرة أخرى أعاني الألم والمعاناة من استخدام الشوك ، صادفت cweagans/composer-patches
في PHP Digest No. 101 (بالمناسبة ، لدى pronskiy مدونة مفيدة ، أوصي بالاشتراك). هذا هو مكون إضافي لبرنامج omposer ، والذي يسمح لك بتطبيق تصحيحات على التبعيات. بعد قراءة الوصف ، أعتقد أن هذا هو بالضبط ما تحتاجه.
كيفية استخدام بقع cweagans / الملحن:
- استنساخ تغطية رمز PHP:
cd ../ rm -rf php-code-coverage git clone git@github.com:sebastianbergmann/php-code-coverage.git cd php-code-coverage
- انتقل إلى الإصدار الذي نريد تصحيحه:
git checkout 7.0.8
- نجري التغييرات اللازمة.
- إنشاء تصحيح:
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
- في مشروعنا نربط
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'
- لتكوين
cweagans/composer-patches
أضف ما يلي إلى composer.json
(يمكنك تحديد عدة تصحيحات لحزمة واحدة):
{ "config": { "preferred-install": "source" }, "extra": { "patches": { "phpunit/php-code-coverage": { "My fix description": "patches/phpunit/php-code-coverage/myFix.patch" } }, "enable-patching": true } }
- تحديث التبعيات:
composer.phar update
- إذا حدث خطأ ما ، يمكن ملاحظة ذلك في إخراج الأمر السابق ، ولكن في حالة حدوث ذلك ، يمكنك التحقق من تطبيق التغييرات التي أجريناها:
$ grep example vendor/phpunit/php-code-coverage/src/CodeCoverage.php // for example some changes here
- الالتزام ودفع النتيجة:
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
نتأكد من أنه عند تثبيت مكتبتنا في المشروع ، سيتم تطبيق التصحيح أيضًا.
إنشاء مشروع:
cd ../ rm -rf php-project mkdir php-project cd php-project composer.phar require phpunit/phpunit '^8.4.2'
أضف الأسطر التالية إلى composer.json
:
{ "extra": { "enable-patching": true } }
تثبيت 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
يبدو أنه عند توصيل الحزمة كان ينبغي أن يكون هناك محاولة لتطبيق التصحيح ، ولكن لا.
نقوم بتحديث الحزم بحيث ينطبق التصحيح ، ولكن هذا لا يحدث:
$ 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
بعد البحث في أداة تتبع الأخطاء ، وجدت أن التصحيحات القائمة على الملفات لا يتم حلها في علة التبعيات . اتضح أنه يجب عليك إما تحديد عنوان URL قبل التصحيح (مما يعني تنزيله من مكان ما) ، أو تحديد المسار إلى التصحيح يدويًا في كل مشروع حيث تقوم بتثبيت تبعية تتطلب تصحيحات.
لتلخيص استخدام cweagans/composer-patches
.
مزايا هذا النهج:
- البرنامج المساعد لديه مجتمع.
roave/security-advisories
لن تتوقف عن العمل ؛- عندما يتم إصدار إصدار جديد من التبعية ، إذا تم تطبيق التصحيح بنجاح ، فسيكون ذلك كافيًا للتأكد من أن كل شيء يعمل مع الإصدار الجديد (بالنسبة للإصدارات الثانوية ، مع احتمال كبير أنها ستعمل من تلقاء نفسها ، بالنسبة للإصدارات الرئيسية ، من المحتمل أيضًا ألا يتطلب الأمر أي شيء) ؛
- إذا كانت هناك مشاريع تعتمد على مكتبتك ، فلن يتم تثبيت إصدار
phpunit/php-code-coverage
بدقة لهما ؛ - علاوة على ذلك ، في حالة الفقرة أعلاه ، سيكون مثل هذا المشروع قادرًا على تطبيق تصحيحاته في تغطية كود PHP.
سلبيات:
- هذا هو المكون الإضافي لـ Composer ، مما يعني أنه عند تحديث Composer ، قد ينكسر ؛
enable-patching=true
يجب تحديده بحيث يتم تطبيق تصحيحات من التبعيات ؛- ليس لدى مشرف المشروع الرئيسي الكثير من الوقت للتعامل معه ، لذلك عادة ما يقبل طلبات السحب ، لكنه لا يطور المشروع فعليًا (على سبيل المثال ، كان لديه أفكار للإصدار الثاني في المهمة ، لكن لم يتغير شيء يذكر بعد ثلاث سنوات) ؛
- هناك تصحيحات قائمة على الملفات لا يتم حلها في خلل التبعيات ، وهو أمر غير مريح وتم تعليقه في العمل المتراكم منذ ثلاث سنوات ؛
- لا يمكنك استخدام تصحيحات مختلفة لإصدارات مختلفة من التبعيات.
أصبحت النقطة الأخيرة حاجزا بالنسبة لي. أولا قدمت طلب ميزة . كتب المشرف أنه لا يريد إضافة هذه الميزة إلى الكود الرئيسي ، ولكن في الإصدار الثاني سيكون من الممكن كتابة ملحق (نعم ، مكوّن إضافي للمكون الإضافي لـ Composer). كانت توقعات الإصدار الثاني غامضة ، لذلك قررت البحث عن بدائل. من بين القائمة الصغيرة لم أجد مكونًا إضافيًا مدعومًا.
لم أكن أرغب في الدخول إلى رمز المكوّن الإضافي ، لذلك قررت أن تتخلى عن الشوك - بالتأكيد ، شخص ما قد واجه المشكلة بالفعل وحلها.
باستخدام بقع Vaimo الملحن
في معظم الشوكات لم تكن هناك اختلافات على الإطلاق عن الأصل (لماذا حتى الشوكة؟). تم إجراء جزء من الشوك لطلبات السحب التي تم دمجها بالفعل مع المكتبة الرئيسية. ومع ذلك ، كان هناك مرشح واحد مثير للاهتمام الذي كان يحل مشكلتي - Vaimo Composer Patches . في ذلك الوقت كان لا يزال مؤطرًا على أنه شوكة ، ولكن يبدو أن مشرفه لم يكن يقوم بطلب طلبات السحب. من بين أشياء أخرى ، على سبيل المثال ، قام بالفعل بتغيير اسم الحزمة إلى vaimo/composer-patches
. ولكن كانت هناك مشكلة: تم تعطيل المشكلات ، أي أنه لم تكن هناك تعليقات من المؤلف على الإطلاق. أيضا ، لم يستضاف البرنامج المساعد على Packagist .
لا ينبغي أن تضيع هذه الشوكة الجيدة في كومة من الشوكات الأخرى عديمة الفائدة. لذلك ، اتصلت بالمؤلف وطلب تمكين المشكلات وإضافة حزمة إلى Packagist. بعد شهر تقريبًا ، أجاب المؤلف وقام بكل هذا. :)
لا vaimo/composer-patches
استخدام vaimo/composer-patches
عن استخدام المكون الإضافي السابق ، لكن يمكنك تحديد تصحيحات مختلفة لإصدارات مختلفة.
- نرجع مكتبتنا (حذف مجلد
vendor
ضروري ، نظرًا لأن الإضافات cweagans/composer-patches
و vaimo/composer-patches
لا تتوافق كثيرًا مع بعضها البعض):
cd ../php-composer-patches-example git checkout master rm -rf vendor/ composer.phar update
- نقوم بتنفيذ النقاط 1-4 من القسم السابق.
- في مشروعنا
vaimo/composer-patches
:
cd ../php-composer-patches-example git checkout -b vaimoComposerPatches composer.phar require vaimo/composer-patches '^4.20.2'
- لتكوين
vaimo/composer-patches
أضف ما يلي إلى composer.json
(يمكن الاطلاع على الوثائق هنا ):
{ "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" } } } } }
- تحديث التبعيات:
composer.phar update
- إذا حدث خطأ ما ، فيمكن رؤية ذلك في إخراج الأمر السابق ، ولكن في حالة حدوث ذلك ، يمكنك التأكد من تطبيق تغييراتنا:
$ grep example vendor/phpunit/php-code-coverage/src/CodeCoverage.php // for example some changes here
- الالتزام ودفع النتيجة:
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
نتأكد من أنه عند تثبيت مكتبتنا في المشروع ، سيتم تطبيق التصحيح أيضًا.
قم بإنشاء مشروع وتثبيت 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
فقط في حالة ، يمكنك التأكد من أن تغييراتنا قد طبقت:
$ grep example vendor/phpunit/php-code-coverage/src/CodeCoverage.php // for example some changes here
لتلخيص استخدام vaimo/composer-patches
.
مزايا هذا البرنامج المساعد هي تقريبا نفس الميزات السابقة ، ولكن تشمل أيضا ما يلي:
- يقوم المشرف بنشاط بتطوير البرنامج المساعد وأصدر بالفعل الإصدار الرئيسي الرابع ؛
- ليست هناك حاجة لوصف أي شيء إضافي للبقع من التبعيات لتطبيقها ؛
- يمكنك استخدام تصحيحات مختلفة لإصدارات مختلفة من التبعيات.
- يحتوي المكون الإضافي على الكثير من الإعدادات ، لذا إذا كانت الوظيفة الموضحة في المقالة غير كافية لك ، فراجع الوثائق - ربما الميزة التي تحتاجها قد تم تنفيذها بالفعل.
سلبيات:
- مثل سابقه ، هذا هو البرنامج المساعد للملحن ، وهو ما يعني أنه عند تحديث الملحن قد كسر ؛
- على عكس المكوّن الإضافي السابق ، فإن هذا المجتمع لديه عدد أقل.
النتائج
لتلخيص النتائج العامة:
- استخدام حزمة الشوك لأية إصلاحات بسيطة غير مريح ؛
cweagans/composer-patches
هو البرنامج المساعد جيد ، ولكن يتطور بشكل سيء ، لذلك أنا لا أوصي به ؛- يعد Vaimo Composer Patches مكونًا ممتازًا يحل مشكلة إصلاح التبعيات جيدًا ، كما أنه يحتوي على مجموعة من الإعدادات ؛
- يحتوي Vaimo Composer Patches على مجتمع صغير ، لكنني آمل أن تزيد هذه المقالة ؛
- إذا كانت هناك حاجة إلى الكثير من التغييرات في التبعية ، فقد يكون من الأسهل اللجوء إلى مفترق صلب (احتفظ بالشوكة مستقلة عن التبعية الأصلية).
لقد توصلت أيضًا إلى نتيجة غير مباشرة: إذا لم يوفر نوع من التبعية الوظيفة اللازمة ، فقد يكون هناك شوكات تنفذ هذه الوظيفة وأكثر من ذلك.
في Badoo ، نستخدم Vaimo Composer Patches في حالتين:
- في SoftMocks لرقع PHPUnit وتغطية كود PHP ؛
- في المستودع الداخلي لإصلاح Webmozart Assert للتوافق مع SoftMocks كحل مؤقت (بينما لا تدعم
array_map(array('static', 'valueToString')
إنشاءات array_map(array('static', 'valueToString')
).
رينات اخميديف مطور PHP
UPD1 : شكرًا على BoShurik على الرابط إلى الأسماء المستعارة . إضافة نقطة حول الأسماء المستعارة لهذه المقالة.