Symfony'un farklı bir sürümünü içeren bir modül nasıl kurulur?


17

CiviCRM projesi için geliştirici ve sürdürücüyüm. Drupal 8 versiyon CiviCRM yapmaya çalışıyoruz ve uzun bir yolumuz var. Proje için büyük bir engelleyici bulmaya çalışan kolektif klavyelerimize karşı başımızı atıyoruz.

CiviCRM bir süredir Symfony kullandı ve içerilen versiyon Drupal ile birlikte gelen versiyondan farklı.

CiviCRM'yi Drupal 8 ile kurabiliriz, ancak kurduktan sonra başka bir Drupal modülünü kuramayız.

Ben bir şekilde Symfony CiviCRM sürümünün Drupal sürümünden önce yüklediği bir duruma düştüğüne inanıyorum ve bu sorunlara neden oluyor.

Herkes Symfony Drupal ile birlikte gelen farklı bir sürümünü içeren bir Drupal 8 modülü biliyor mu?

Son zamanlarda Ludwig projesiyle karşılaştım. Bu modül, genişleyen bir sınıftaServiceProviderBase ad alanlarının kaydedilmesini sağlar .

CiviCRM modülünün Drupal 8 sürümünün bir CivicrmServiceProvidersınıfı tanımlayan bir CivicrmServiceProvider.php dosyası ve bunun register()çalışmasına izin vermek için bir kap ad alanı ekleyen bir yöntem içermesi mümkün müdür ?

Birçok CiviCRM dosyaları var useDrupal gibi, Symfony'de ile başlayan ifadeleri burada .

Aslında CiviCRM Core'u Drupal doc_root / libraries klasörüne koyduk ve kütüphaneler modülünü kullanıyoruz.

Bu, CiviCRM Drupal modül 8.x sürümü için bir repo . Birisi bunun için sihirli iksire sahipse, topluluğumuzda birçok mutlu insan olacağını söyleyebilirim. Bize nasıl yardım edeceğinizi biliyorsanız, lütfen yapın.

CiviCRM yüklenir ve CiviCRM sayfaları çalışır. İşe yaramayan şey, CiviCRM kurulduktan sonra, yönetici / modüller sayfası aracılığıyla başka modüller yükleyemiyoruz. Bildiğim kadarıyla kırılan tek şey bu. Ayrıca Drush ile modüller kurmak, CiviCRM kurulduktan sonra çalışır.

CiviCRM kurulduktan sonra başka bir modül takmaya çalışmak aşağıdaki hataya neden olur:

PHP Önemli hata: 206 numaralı satırda /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection \ Definition :: setFactory () yöntemine çağrı 206 satırında

Bu Drupal 8.3.5. Drupal 8 için CiviCRM'yi temiz bir Drupal 8.4-dev örneğine yüklemeye çalışmak aşağıdaki hataya neden olur:

Drupal \ Component \ Serialization \ Exception \ InvalidDataTypeException: Ayrılmış "@" göstergesi düz bir skaler başlatamıyor; skaleri 8. satırda ("argümanlar: [@string_translation, @ civicrm.page_state]" yakınında) alıntılamanız gerekir. Drupal \ Component \ Serialization \ YamlSymfony :: decode () (/var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.php satır 40).


Mobilde, ama Symfony'nin hangi sürümü? 8.4, v2'den bir sıçrama olan 3.x'i kullanacaktır.
Matt Glaman

CiviCRM'de 2.5.0 sürümündeyiz
jackrabbithanna

Sorunun bazı belgeleri: issue.civicrm.org/jira/browse/CRM-17652 .... Bir kişi sorunu görmediğini bildirdi, ancak bundan emin değilim, bir hata almaya çalışan herkes orada rapor gibi
jackrabbithanna

4
Bunun mümkün olduğunu düşünmüyorum. Drupal 8.4 aslında aynı soruna sahip olan drush ile ilgili benzer tartışmalar olmasına rağmen Symfony3'e zaten geçti. İki farklı symfony sürümü yüklemek mümkün değildir, ya entegrasyonunuzu bozarsınız ya da Drupal'ı bozarsınız. Belki symfony3 henüz 8.4'te olmayacak, ancak symfony2 için güvenlik desteği Drupal8 güvenlik desteğinden önce sona erecek, bu yüzden bir noktada geçiş yapmamız gerekecek
Berdir

1
@Berdir bu iyi bir cevap verebilir mi?
Clive

Yanıtlar:


8

Bu yüzden, eğer CiviCRM, besteci (yani composer require civicrm/civicrm-coreDrupal kökünde) aracılığıyla Drupal 8'e yüklenmişse ve CiviCRM'nin Symfony kullanımı Symfony 2.8 veya 3.x (yani kullanımdan kaldırılmış işlevsellik kullanmayan) ile uyumluysa, bu işe yarayabilir.

Bu, her şeye iki sahip olmak yerine Drupal'ın tedarikçi dizinine yüklenir ve CiviCRM'nin Drupal 8'deki Symfony sürümünü kullanacağı anlamına gelir. Ancak CiviCRM daha sonraki Symfony sürümleriyle uyumluysa (Drupal için daha eski bir sürüm olsa bile) 6 ve 7 ve diğer CMS'ler) iyi olmalıdır.

Bence?

GÜNCELLENDİ: Evet, işe yarıyor - denedim. :-) Başlangıçta CiviCRM sayı kuyruğuna ( CRM-17652 ) aşağıda yayınladım , ancak tamlık için burada yeniden gönderiyorum.

Büyük fikir:

Besteci birçok insan için oldukça yeni olduğu için, bazı üst düzey besteciden CiviCRM'de yapılabilecek tek yoldan adım adım ilerlemeye çalışacağım:

  • Composer, uygulamaların ihtiyaç duyduğu kütüphaneleri gerektirmesine izin verir (ve elbette kütüphaneler başka kütüphaneler gerektirebilir).
  • Kütüphaneler, başka hangi kütüphanelere ihtiyaç duyduğunu ve hangi sürümlerle uyumlu olduğunu söyleyen bir composer.json dosyasına sahiptir (ancak belirli bir tek sürüm değil - genellikle ^2.4.3en az 2.4.3 ve en fazla (ancak değil) dahil) 3.0.0)
  • Uygulamalar, gerekli kütüphaneleri ve çeşitli sürümlerle uyumluluğu benzer şekilde açıklayan bir composer.json'a sahiptir, ancak aralık gerçekten güncellemeye yardımcı olmaktır. Bir uygulama aynı zamanda belirli bir sürümler dizisi olan bir composer.lock dosyasına sahip olacaktır.
  • Kütüphaneler ayrıca kendi testleri veya dağıtımları için bir composer.lock'a sahip olabilir (sürüm bağımlılığını paketlenmiş bağımlılıklarla oluşturmak gibi), ancak bir uygulama verilen kütüphaneyi gerektirdiğinde bu dikkate alınmaz (bkz. Https://getcomposer.org/doc/02 -libraries.md # kilit dosyası )
  • Bir uygulama yeni bir kitaplık gerektirmek istediğinde, besteci uygulamanın gerektirdiği her şey (zaten yüklü olan tüm kitaplıklar ve bağımlılıkları dahil) ve yeni kitaplık arasında sürüm uyumluluğunun kesişimini bulur ve muhtemelen her şeyi sıralamak için bazı güncellemeler yapar ( veya uyumlu bir sürüm karışımı bulamazsa hata veriyor)
  • Bu durumda, CiviCRM bir kütüphane ve belirli bir Drupal 8 sitesi uygulama (Drupal çekirdeğinin kendisi bir kütüphane)
  • CiviCRM ^2.5, composer.json içinde Symfony "gerektirir" diyebilir ki bu , 3.0.0 sürümüne (3.0.0 sürümüne kadar)
  • Bir Drupal 8 sitesi CiviCRM kullanmak istediğinde, site yöneticisi composer require civicrm/civicrm-coreCiviCRM kütüphanesini ve tüm bağımlılıklarını talep etmek için kullanır . CiviCRM, Symfony 2.8 (Drupal 8.3.x'te kullanılan gibi) ile uyumluysa, Drupal'ın tek Symfony 2.8'i kullanarak her şey kurulacak ve iyi çalışacaktır. Tüm bağımlılıklar Drupal'ın satıcı dizininde bulunur.
  • Bununla birlikte, CiviCRM, Symfony 2.5'i composer.lock içinde tutabilir, bu da testlerin bunu kullanacağı ve Drupal 6 & 7 ve diğer CMS'lerin tarball'larının Symfony 2.5'i paketleyeceği anlamına gelir.

Teklif:

  1. CiviCRM'nin composer.json dosyasını güncelleyin, böylece Drupal 8 gibi besteci tabanlı CMS'ler tarafından kitaplık olarak kullanılabilir (ancak muhtemelen diğerleri gelecekte bu şekilde hareket edebilir - besteci oldukça popüler hale geliyor)
  2. CiviCRM çekirdeğinin Symfony 2.8 ve 3.0 (sırasıyla Drupal 8.3.x ve 8.4.x tarafından kullanılır) ile uyumlu olduğundan emin olun, ancak test için composer.lock ve dağıtım için tarball'da "resmi olarak desteklenen" sürümü (şu anda Symfony 2.5) saklayın. Birden çok Symfony sürümü ile uyumlu olmak göründüğü kadar zor olmayabilir - hem Symfony 2.8 hem de 3.0 ile uyumlu bir dizi kitaplık var. Sadece kullanımdan kaldırılan yöntemlerden / sınıflardan / özelliklerden kaçınmak meselesi olabilir! Composer.json dosyasının bunu yansıtacak şekilde güncellenmesi gerekecektir
  3. CiviCRM kütüphanesini kütüphaneler dizinine kopyalamak yerine Drupal 8'e kurmak için besteci kullanın. Bu, Drupal 8'de 3. taraf PHP kitaplıklarını kurmanın normal yolu haline geliyor (örneğin, Drupal Commerce tarafından yaygın olarak kullanılmaktadır)

Besteci tabanlı CMS'ler için bunun doğru yol olduğunu düşünüyorum. Bu sorun şu anda Symfony ve Drupal'ı etkilemekle birlikte, PHP topluluğu besteci aracılığıyla daha fazla 3. parti kitaplığı kullanmaya başladığından, bu durum diğer sürüm çakışmalarına sahip diğer CMS'leri çok iyi etkileyebilir.

Test etmek için bazı çalışma kodları:

Söz verdiğim gibi, aslında bunu sınırlı derecede çalışmak için aldım :-) Tamamen buna bir Drupal / Composer / Symfony perspektifinden geliyorum - Bir ton CiviCRM deneyimim yok, bu yüzden muhtemelen bazı işlemimi aşağıda daha iyi yapmanın yolları. Ben herhangi bir tavsiye edilir!

  1. Drupal 8.3.5'i (veya Drupal 8.4.x'in en son geliştiricisini) indirin ve yükleyin.
  2. Kabuktaki kök dizine gidin ve CiviCRM'yi besteci aracılığıyla yüklemek için şu komutları çalıştırın: https://gist.github.com/dsnopek/56311dbea347874e75180883efabb620
  3. Apache kullanıyorsanız, vendor / .htacess dosyasını kaldırın. Bu, Drupal'ın CSS / JS gibi kaynakların yüklenmesini engelleyen bir güvenlik önlemidir. Bunun uygun bir çözüm bulmak için Drupal projesiyle biraz işbirliği yapması gerekecektir, çünkü bu dosyanın tamamen kaldırılması üretim konusunda kötü bir fikirdir. Bkz . Besteci kitaplıklarından CSS / JS varlıklarını engelleyen vendor / .htaccess .
  4. / Modules dizinine gidin ve git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
  5. "Genişlet" sayfasına gidin ( /admin/modules) ve CiviCRM modülünü kurun
  6. Drush ( drush cr) ile drupal önbelleği temizle
  7. Oturumu kapatın ve CRM-19878'e göre yeniden oturum açın
  8. CiviCRM çalışıyor! :-)

Tüm bunlardan sonra, CiviCRM, Drupal'dan Symfony 2.8 ve Drupal'ın satıcı dizinindeki bağımlılıkları kullanıyor ve kendi satıcı dizininden hiçbir şey yüklemiyor. Huzzah!

Bu değişikliklerden önce başarısız olan "Telefon" modülünü etkinleştirmeyi test ettim ( çoğaltma adımlarıma bakın ), ancak onlarla iyi çalışıyor. :-)


İşte tüm bunlarla ilgili bir soru, besteci kullanarak .... bir paket Symfony 2.8 kullanmak ve başka bir paket Symfony 3.2 kullanmak mümkün ....
jackrabbithanna

Drupal 8/9'un her zaman hangi Symfony sürümünü kullanması için CiviCRM'ye karşı oldukça zor kurumsal direnç gerekiyor.
jackrabbithanna

1
"composer .... kullanarak bir paket Symfony 2.8 kullanmak ve başka bir paket Symfony 3.2 kullanmak mümkün" -> Hayır, PHP aynı ada sahip iki sınıf olamaz. Bu gerçekten besteci değil.
David Snopek

"Her zaman Drupal 8/9'un hangi Symfony sürümünü kullandığını kullanmak için CiviCRM'ye karşı oldukça zor kurumsal direnç var" -> Yukarı akım CiviCRM çekirdeği için gereken tek şey, kodun Drupal'da kullanılan sonraki Symfony ile uyumlu olmasıdır . Paketlemek veya varsayılan olarak kullanmak zorunda kalmaz, sadece uyumlu olur, yani. kullanımdan kaldırılmış yöntemlerden / sınıflardan / özelliklerden kaçının.
David Snopek

Birinin Symfony'un iki ana versiyonunu yan yana çalıştırmakla neden ilgilendiğini anlıyorum - SemVer sorta gerekliliği ima ediyor. Ancak, Symfony bileşenlerinin büyük alanlarının v2 / v3'te benzer olması ve Civi'nin v2 entegrasyonunun oldukça mütevazı olduğunu düşünüyorum. Yani her ikisi ile uyumlu PHP kodu sahip veya elde konusunda iyimserim. IMHO, asıl çalışma dağıtım kanalı ve dizin yapısını güncelliyor.
Tim Otten

5

Bunun mümkün olduğunu düşünmüyorum.

Drupal 8.4 aslında aynı problemi olan drush ile ilgili benzer tartışmalar olmasına rağmen Symfony 3'e zaten geçti. bkz Drush 8.x Drupal 8.4.x yüklenmez ve Drush ustası Drupal 8.3.x yüklenmez ve Symfony'nin bileşenleri 3.2.6 için güncellenir

İki farklı symfony sürümü yüklemek mümkün değildir, ya entegrasyonunuzu bozarsınız ya da Drupal'ı bozarsınız. Belki symfony3 henüz 8.4'te olmayacak, ancak symfony2 için güvenlik desteği Drupal8 güvenlik desteğinden önce sona erecek, bu yüzden bir noktada geçiş yapmamız gerekecek.


Peki ..... Yönetici / modüllerden modül kurmak dışında her şey işe yarar .... Drush ile modül kurmak işe yarar ... Tüm CiviCRM sayfaları işe yarar. Bu yüzden imkansız olduğuna ikna olmadım. Neden imkansız olurdu?
jackrabbithanna

1
Aynı sınıfın iki farklı sürümünü aynı anda yükleyemezsiniz, bu mümkün değildir. Hata tam olarak olmasını beklediğim gibi geliyor. Öncelikle Definition sınıfının 2.5 sürümünü yüklemeyi başardınız ve daha sonra Drupal kesiliyor, çünkü aslında olmayan bir yöntem var. Ve Drupal, Symfony 3'e geçtikçe farklar daha da büyüyecek. 2.5, 2.8 ile neden sıkışıp kaldığınızı tam olarak anlamıyorum, 2.8 küçük bir güncellemedir ve geriye dönük olarak uyumlu olmalıdır (ancak bulduğunuz gibi değil). Yani CiviCRM'yi 2.8 gerektirecek şekilde güncelleyebilmelisiniz?
Berdir

1
Yorumumda bahsettiğim gibi, cevap vermemi istemediğinizi varsaydım, ama bu değişmedi. Bahsettiğiniz bu projelerin hiçbiri symfony (joomal, çatışmayabilecek, ancak muhtemelen sonunda olacak) bir avuç bileşen kullanıyor gibi görünüyor, bu yüzden bunu karşılaştıramazsınız. Is, aynı sınıfın birbiriyle çelişen iki sürümünü yüklemek için teknik olarak imkansızdır, hiçbir şey bunu değiştiremez. Bu nedenle bağımlılıklar karmaşık bir iştir ve besteci neden mevcuttur. Kütüphaneler kullanmak yerine, muhtemelen besteci kullanmayı ve
CiviCRM'yi

2
Ayrıca, Symfony 2.5 için güvenlik desteği symfony.com/roadmap?version=2.5#checker'a göre 2015 yılında sona erdi , bu da CiviCRM'nin güvensiz ve güncel olmayan bir symfony sürümü üzerine inşa edildiği anlamına geliyor. Bu tek başına onları en azından 2.8 sürümü için bir güncellemenin gerekli olduğuna ikna etmek için yeterli olmalı, sadece Drupal8 ile ilgili değil.
Berdir

1
@DavidSnopek doğru, cevabınızda yazdığınız şey temel olarak yorumlarımda da bahsettiğim şeydir, ancak CiviCRM'nin composer.json'u symfony bileşenleri için "~ 2.5.0" belirttiği sürece, bu işe yaramayacaktır. Bkz. Github.com/civicrm/civicrm-core/blob/master/composer.json . Yani cevabım "iki farklı sürümü kullanamazsınız" hala doğru IMHO, sadece civicrm'deki sürüm kontratılarını geliştirebilir / güncelleyebilir ve daha sonra besteci aracılığıyla yükleyebilir ve aynı sürümü kullanabilirsiniz.
Berdir

1

Teorik olarak buradaki tek sorun dosya konumu ve sınıf ad alanıdır. Ne yazık ki besteci için bildiğim tek araç VERSION başına, sadece paket adı başına belirtmenize izin vermiyor.

Tamamen ayrı bir otomatik yükleyici olarak ayarlamayı denediniz mi?


Ne demek istediğinizi daha ayrıntılı açıklayabilir misiniz?
jackrabbithanna

getcomposer.org/doc/faqs/… özel konumun nasıl yapılacağıdır. İnsanların sadece bunu mümkün kılmak için bir projeye çatallandıklarını gördüm ... Ayrıca bestecinin otomatik yükleyicisini ayrı tutma seçeneği için getcomposer.org/doc/06-config.md#prepend-autoloader . Sonunda otomatik yükleyici sadece bir php dosyasıdır, bu nedenle hangi otomatik yükleyicinizi istediğiniz faktörlere bağlı olarak dahil edeceğinize karar veren kendi otomatik yükleyicinizi yazabilirsiniz.
Ohthehugemanatee


Net olun, ATM, Civi'yi D8 ile kurmak için besteci tabanlı bir kurulum yöntemi yoktur. Belki de bunu başarmanın bir yolu vardı. Soruda bahsedilen ServiceProvider nesnesi, CiviCRM kütüphanesine işaret etmek için Drupal'a bir PSR-4 ad alanı eklemek gibi bir şeydi ... Bunu yapsaydım, Civi'nin tüm dosyalarını 'Symfony kullan \ .... 'Civicrm \ Symfony \ ..' kullanmak için? Pardon besteci benim cehalet pls.
jackrabbithanna
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.