PHP Scoper: Besteci Bağımlılıklarınızdaki Ad Alanı Sorunlarından Nasıl Kaçının


Besteci. PHP ile herhangi bir süre çalıştıysanız, muhtemelen Composer'ı duymuş veya kullanmışsınızdır. Daha önce blogda bunun hakkında bir sürü şey yazdık ve projeniz için bağımlılıkları kapmak için harika bir araç (özellikle PEAR 😬'ı hatırlayan bizler için).

Bununla birlikte, özellikle WordPress ile sorunsuz değildir. Iain, bağımlılık yönetimi ve WordPress hakkında bir makale yazdı – bunun en önemli noktası, bağımlılıkları WordPress eklentileriyle bir araya getirmenin zor olmasıdır. Bunun nedeni, eklentinizle bir bağımlılığı paketlerseniz ve başka bir eklenti aynı bağımlılığı ancak farklı bir sürümü paketlerse, bir yarış koşuluyla karşılaşabilirsiniz. Temel olarak bu, bağımlılıkların hangi sırayla yükleneceğini bilmediğiniz anlamına gelir:

tak tak
Yarış kondisyonu
Oradaki kim?

Tamam, peki bunu nasıl düzeltirsiniz? Composer'dan kaçının ve her şeyi sıfırdan mı yazacaksınız? Bunu yapabilirsin, ama diğer insanların yazdığı tüm harika şeyleri kaçırıyor olacaksın, böylece tekerleği yeniden icat etmeyeceksin.

Başka bir seçenek de, burada Delicious Brains'te kullandığımız PHP-Scoper adlı küçük bir araçtır. Bu yazıda, bağımlılıklarınızı adlandırmak ve dünyanın en kötü tak tak şakasından kaçınmak için PHP-Scoper'ı nasıl kullanabileceğinizi göreceğiz.

Başlarken

PHP-Scoper'ı kurmak oldukça kolaydır, standart bir Composer global kurulumudur, böylece sisteminizdeki herhangi bir projede kullanabilirsiniz:

composer global require humbug/php-scoper

Ayrıca, doğrudan Composer bin eklentisiyle projeniz için yükleyebilirsiniz:

 composer require --dev bamarni/composer-bin-plugin composer bin php-scoper require --dev humbug/php-scoper

Paketi global veya yerel olarak yükledikten sonra, çalışma dizininizde add-prefix komutunu çalıştırmanız yeterlidir:

php-scoper add-prefix

Bu komutu proje dizininizde çalıştırmak PHP Scoper sürecini başlatacak ve tüm proje dosyalarınızı (bağımlılıklar dahil) yeni bir 'build' klasörüne kopyalayacaktır. Bunu yaparken, herhangi bir bağımlılık use ifadesini de yeni yerel sürüme güncelleyecektir.

Örneğin, PHP Scoper'ı çalıştırmadan önce, Composer vendor klasörünüzdeki koda başvuran kodunuz olabilir:

 namespace DeliciousBrains\WPMDB; use DI;

PHP-Scoper'ı çalıştırdıktan sonra use ifadesi, bağımlılığın yerel sürümüne başvuracak ve bir yapılandırma parametresi olarak ilettiğiniz öneki kullanacak. Bu durumda DeliciousBrains\WPMDB\Container kullandım:

 namespace DeliciousBrains\WPMDB; use DeliciousBrains\WPMDB\Container\DI;

Derleme klasörünün örnek çıktısı:

PHP Scoper derleme çıktısı

Derleme tamamlandıktan sonra, otomatik yükleyiciyi güncellemek için derleme klasöründe composer dump-autoload çalıştırmanız gerekecek, ancak bu kadar. Artık tüm ön ekli bağımlılıklarınızı içeren projenizin bir yapısına sahipsiniz. Havalı değil mi?

Yapılandırma

Bazı projeler için tüm ihtiyacınız olan varsayılan yapılandırma olabilir. WP Migrate DB Pro için ÇOK SAYIDA sınıf ve dosyamız var, bu nedenle PHP-Scoper'ı tüm proje dosyalarında çalıştırmak biraz zaman alır ve gerekli değildir. Şimdilik, kod tabanının derinliklerinde Composer bağımlılıklarını kullanmadığımız için taranan dosya sayısını azaltmak için filtreler kullanabiliriz.

PHP-Scoper, hangi dosya ve klasörleri çalıştıracağını belirlemek için bazı kullanışlı yapılandırma seçenekleriyle birlikte gelir. php-scoper init çalıştırırsanız, değiştirebileceğiniz bir dizi önceden yapılandırılmış filtre içeren scoper.inc.php dosyası oluşturacaktır.

Dahili olarak, PHP-Scoper süper güçlü olan Finder Symfony bileşenini kullanır. WP Migrate DB Pro için, eklenti zip dosyasını birlikte paketlemek için bir derleme komut dosyası kullandığımızdan, özellik kümesinin yalnızca küçük bir alt kümesini kullanıyoruz. İşte minimum yapılandırmamız:

 'finders' => [ Finder::create() ->files() ->ignoreVCS( true ) ->in( __DIR__ . '/build-cfg/composer-tmp/vendor/' ), Finder::create()->append( [ __DIR__ . '/build-cfg/composer-tmp/composer.json', ] ), ]

Kullanım durumumuz için, PHP-Scoper'ın tüm Composer bağımlılıklarımızı değil, yalnızca bir paketi (yeni fantezi bağımlılık ekleme kapsayıcımız, PHP DI) üzerinden geçmesini istedim. Yaptığı şey, yalnızca bir paketi içeren yeni bir composer.json dosyası oluşturmaktı. Elbette, Composer tüm bağımlılıkları düzleştirir (ve PHP DI birkaç başka bağımlılık içerir), böylece PHP-Scoper yalnızca birkaç paket içeren bir satıcı klasöründe çalışır.

Her şey bittikten sonra PHP Scoper ve composer dump-autoload çalıştıran temel betik aşağıdadır:

 #!/usr/bin/env bash php-scoper add-prefix --output-dir=builds/php-scoper-output --force cd builds/php-scoper-output && composer dump-autoload

Derleme betiğimizde daha sonra sed komutuyla composer dump-autoload ve diğer birkaç bul ve değiştir komutunu çalıştırdım.

 <?php shell_exec("mv $tmp_dir/php-scoper-output/vendor $tmp_dir/$plugin_name"); shell_exec("sed -i '' 's/\/\.\.\/\.\.\/vendor/\/vendor/' builds/wp-migrate-db-pro/wp-migrate-db-pro.php"); // Move vendor folder into build folder shell_exec("sed -i '' 's/use DI/use DeliciousBrains\\\WPMDB\\\Container\\\DI/' builds/wp-migrate-db-pro/class/WPMDBDI.php"); // Manually swap namespace shell_exec("sed -i '' 's/\/\/ @build replacement/use DeliciousBrains\\\WPMDB\\\Container\\\DI;/' builds/wp-migrate-db-pro/class/WPMDBDI_Config.php"); // Manually swap namespace shell_exec("rm -rf $tmp_dir/php-scoper-output/");

plugin-build , bir dizi önceden tanımlanmış değişken içeren bir PHP betiği olduğu için burada shell_exec() kullanıyorum.

Yukarıdaki sed komutlarında, birkaç 'kullanım' ifadesini manuel olarak değiştirdiğimi not edeceksiniz. Bunun nedeni, PHP-Scoper'ı iki dosya üzerinde çalıştırmanın aşırıya kaçmasıydı. Herhangi bir araçta olduğu gibi, iyi kullanım durumları ve kötü kullanım durumları vardır. Bu durumda, PHP-Scoper'ı iki dosya üzerinde çalıştırmak, çıktı dizininde başka bir alt klasör oluşturdu, bu yüzden onu burada kullanmak aslında daha fazla işti.

uyarılar

Tamam, kulağa hoş geliyor, ancak PHP-Scoper kullanmanın herhangi bir sakıncası var mı? Fark ettiğim bir şey, sürecin tüm dosyalarımızda gevşemesine izin verirsem, biraz zaman alacak ve Macbook'umun CPU'sunu gerçekten artıracaktı. Bunun nedeni, her geliştiricinin node_modules klasöründeki düşmanıydı:

Evrendeki en ağır nesneler

PHP tek iş parçacıklı olduğundan, bir seferde yalnızca bir CPU çekirdeği kullanılabilir, bu nedenle dikkatli olmazsanız zayıf CPU'nuzu sabitleyebilirsiniz. Neyse ki yukarıda bahsettiğim Finder konfigürasyonu ile bu durumun önüne geçilebiliyor ancak dikkat edilmesi gereken bir durum.

Ayrıca benzer şeyler yapan birkaç seçenek daha olduğunu ve genellikle PHP-Scoper ile aynı sorunu çözdüğünü belirtmeliyim. Ancak, WP Offload Media ekibi eklentilerini oluşturmak için PHP-Scoper kullanıyor (görünüşe göre Yoast SEO da yapıyor), bu yüzden Yoast ve Jonesy için yeterince iyi olup olmadığını düşündüm, benim için yeterince iyi!

Sarmak

PHP-Scoper'ı kullanmak gerçekten bu kadar. Eklentinizde Composer bağımlılıklarını endişelenmeden kullanmanıza ve koşulları çalıştırmanıza ve diğer kodlarla çakışmalarına izin veren harika bir araçtır.

WordPress kodunuzla Composer veya diğer bağımlılıkları kullanıyor musunuz? Çatışmaları nasıl yönetiyorsunuz? Aşağıda bize bildirin!

Copyright statement: Unless otherwise noted, this article is Collected from the Internet, please keep the source of the article when reprinting.

Check Also

Divi's Theme Builder ile Özel Global Başlık Nasıl Oluşturulur

Artık Tema Oluşturucu burada olduğuna göre, web sitenizi A'dan Z'ye kurmanıza yardımcı olacak yeni eğitimlere dalmak için sabırsızlanıyoruz. Buna Divi'nin yerleşik seçeneğini kullanarak özel başlıklar oluşturma da dahildir. Bu eğitimde Divi's Theme Builder'ı kullanarak global bir başlık oluşturmaya odaklanacağız. Bu sayfaya veya gönderiye farklı bir başlık atamadıysanız, web sitenizin her yerinde genel bir başlık görünecektir.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir