it-swarm.com.de

Wie installiere ich ein Modul, das eine andere Version von Symfony enthält?

Ich bin Entwickler und Betreuer des CiviCRM-Projekts. Wir haben versucht, eine Drupal 8-Version von CiviCRM zu erstellen, und haben einen langen Weg zurückgelegt. Wir schlagen unsere Köpfe gegen unsere kollektiven Tastaturen und versuchen, einen wichtigen Blocker für das Projekt zu finden.

CiviCRM verwendet Symfony seit einiger Zeit und die mitgelieferte Version unterscheidet sich von der mit Drupal gelieferten.

Wir können CiviCRM mit Drupal 8) installieren, aber nachdem Sie es installiert haben, können wir kein anderes Drupal) Modul installieren.

Ich glaube, es läuft auf eine Situation hinaus, in der die CiviCRM-Version von Symfony vor der Version Drupal) geladen wird und dies Probleme verursacht.

Kennt jemand ein Drupal 8-Modul, das eine andere Version von Symfony enthält als die, die mit Drupal geliefert wird?

Kürzlich bin ich auf das Ludwig-Projekt gestoßen. Dieses Modul ermöglicht die Registrierung von Namespaces in eine Klasse, die ServiceProviderBase erweitert .

Wäre es möglich, dass die Version Drupal 8 des CiviCRM-Moduls eine CivicrmServiceProvider.php-Datei enthält, die eine CivicrmServiceProvider -Klasse und eine register() definiert? Methode, die einen Container-Namespace hinzufügt, damit dies funktioniert?

Viele CiviCRM-Dateien haben use Anweisungen wie Drupal beginnend mit Symfony, wie hier .

Wir legen CiviCRM Core tatsächlich in den Ordner Drupal doc_root/library) und verwenden das Bibliotheksmodul.

Dies ist das Repo für das CiviCRM Drupal Modul 8.x Version , wenn jemand sehen möchte, was wir bisher haben. Wenn jemand das magische Elixier dafür hat Ich kann Ihnen sagen, dass es in unserer Gemeinde viele glückliche Menschen geben würde. Wenn Sie also wissen, wie Sie uns helfen können, tun Sie dies bitte.

CiviCRM wird installiert und die CiviCRM-Seiten funktionieren. Was nicht funktioniert, ist, dass wir nach der Installation von CiviCRM keine anderen Module über die Seite admin/modules installieren können. Soweit ich weiß, ist das das einzige, was kaputt ist. Auch die Installation von Modulen mit Drush nach der Installation von CiviCRM funktioniert.

Der Versuch, ein anderes Modul nach der Installation von CiviCRM zu installieren, führt zu folgendem Fehler:

Schwerwiegender PHP-Fehler: Aufruf der undefinierten Methode Symfony\Component\DependencyInjection\Definition :: setFactory () in /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php in Zeile 206

Das ist in Drupal 8.3.5. Der Versuch, CiviCRM für Drupal 8 in einer sauberen Drupal 8.4-dev-Instanz zu installieren) zu installieren der folgende Fehler:

Drupal\Component\Serialization\Exception\InvalidDataTypeException: Der reservierte Indikator "@" kann keinen einfachen Skalar starten. Sie müssen den Skalar in Zeile 8 zitieren (in der Nähe von "Argumente: [@string_translation, @ civicrm.page_state]"). in Drupal\Component\Serialization\YamlSymfony :: decode () (Zeile 40 von /var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.php).

17
jackrabbithanna

Ich denke also, wenn CiviCRM über Drupal (dh composer require civicrm/civicrm-core Im composer root) in Drupal 8 installiert wäre und CiviCRM Symfony verwendet war kompatibel mit Symfony 2.8 oder 3.x (dh ohne veraltete Funktionalität), dies könnte funktionieren.

Dies würde alles im Herstellerverzeichnis von Drupal installieren, anstatt zwei zu haben, und es würde bedeuten, dass CiviCRM die Symfony-Version in Drupal 8 verwenden würde. Aber wenn CiviCRM mit späteren Symfony-Versionen kompatibel wäre (selbst wenn dies der Fall wäre eine ältere Version für Drupal 6 & 7 und andere CMS gebündelt) sollte es in Ordnung sein.

Ich glaube?

AKTUALISIERT: Ja, es funktioniert - ich habe es versucht. :-) Ich habe das Folgende ursprünglich in der CiviCRM-Problemwarteschlange ( CRM-17652 ) gepostet, aber der Vollständigkeit halber hier erneut gepostet.

Die große Idee:

Da composer für viele Leute ziemlich neu ist, werde ich versuchen, Schritt für Schritt von einigen hochrangigen composer Sachen bis zu einer Möglichkeit zu gehen, die es könnte in CiviCRM durchgeführt werden:

  • Mit Composer können Anwendungen die benötigten Bibliotheken benötigen (und Bibliotheken können natürlich auch andere Bibliotheken benötigen).
  • Bibliotheken haben eine composer.json-Datei, in der angegeben ist, welche anderen Bibliotheken sie benötigen und mit welchen Versionen sie kompatibel sind (jedoch nicht unbedingt eine bestimmte Einzelversion - normalerweise eine Reihe von Versionen wie ^2.4.3, In denen mindestens 2.4.3 angegeben ist und bis zu (aber nicht einschließlich) 3.0.0)
  • Anwendungen haben eine composer.json, die in ähnlicher Weise die benötigten Bibliotheken und die Kompatibilität mit einer Reihe von Versionen beschreibt, aber der Bereich soll wirklich bei der Aktualisierung helfen. Eine Anwendung verfügt auch über ein composer.lock, bei dem es sich um einen bestimmten Satz einzelner Versionen handelt
  • Bibliotheken können auch ein composer.lock für ihre eigenen Tests oder Distributionen haben (z. B. das Erstellen des Release-Tarballs mit den gebündelten Abhängigkeiten). Dies wird jedoch ignoriert, wenn eine Anwendung die angegebene Bibliothek benötigt (siehe https://getcomposer.org) /doc/02-libraries.md#lock-file )
  • Wenn eine Anwendung eine neue Bibliothek benötigen möchte, findet composer einen Schnittpunkt der Versionskompatibilität zwischen allen für die Anwendung erforderlichen Dingen (einschließlich aller bereits installierten Bibliotheken und ihrer Abhängigkeiten) und der neuen Bibliothek, wobei möglicherweise einige Aktualisierungen vorgenommen werden um alles in eine Reihe zu bringen (oder Fehler zu machen, wenn es keinen kompatiblen Mix von Versionen findet)
  • In diesem Fall ist CiviCRM eine Bibliothek, und eine bestimmte Drupal 8-Site ist die Anwendung (Drupal-Kern selbst ist eine Bibliothek).
  • CiviCRM könnte sagen, dass es Symfony ^2.5 In seiner composer.json "benötigt", was bedeutet, dass es mit den Versionen 2.5.0 bis (aber nicht einschließlich) 3.0.0 kompatibel ist
  • Wenn eine Drupal 8-Site CiviCRM verwenden möchte, verwendet der Site-Administrator composer require civicrm/civicrm-core, Um die CiviCRM-Bibliothek und alle ihre Abhängigkeiten zu benötigen. Wenn CiviCRM mit Symfony 2.8 kompatibel ist (wie in Drupal 8.3.x verwendet), wird alles mit dem einzigen Symfony 2.8 von Drupal installiert und funktioniert einwandfrei. Alle Abhängigkeiten landen im Herstellerverzeichnis von Drupal.
  • CiviCRM könnte jedoch Symfony 2.5 in seiner composer.lock behalten, was bedeutet, dass die Tests dies verwenden würden und die Tarballs für Drupal 6 & 7 und andere CMS Symfony 2.5 bündeln würden

Der Antrag:

  1. Aktualisieren Sie die composer.json von CiviCRM, damit sie von Composer-basierten CMS wie Drupal 8 als Bibliothek verwendet werden kann (aber wahrscheinlich könnten sich andere in Zukunft so bewegen - composer wird sehr beliebt)
  2. Stellen Sie sicher, dass der CiviCRM-Kern kompatibel mit Symfony 2.8 und 3.0 (verwendet von Drupal 8.3.x bzw. 8.4.x) ist, aber behalten Sie die "offiziell unterstützte" Version (derzeit Symfony) bei 2.5) im Composer.lock zum Testen und im Tarball zum Verteilen. Die Kompatibilität mit mehreren Symfony-Versionen ist möglicherweise nicht so schwierig, wie es sich anhört. Es gibt eine Reihe von Bibliotheken, die sowohl mit Symfony 2.8 als auch mit Symfony 2.8 kompatibel sind. Es kann nur darum gehen, veraltete Methoden/Klassen/Features zu vermeiden! Die Datei composer.json muss aktualisiert werden, um dies widerzuspiegeln
  3. Verwenden Sie composer, um die CiviCRM-Bibliothek auf Drupal 8 zu installieren, anstatt in das Bibliotheksverzeichnis zu kopieren. Dies wird zur normalen Methode zum Installieren von PHP Bibliotheken von Drittanbietern in Drupal 8 (dies wird beispielsweise häufig von Drupal Commerce verwendet).

Für komponistenbasierte CMS denke ich wirklich, dass dies der richtige Weg ist. Während dieses Problem derzeit Symfony und Drupal betrifft, da die PHP Community immer mehr Bibliotheken von Drittanbietern über Composer verwendet, kann dies sehr gut andere CMS mit anderen Versionskonflikten betreffen.

Einige zu testende Arbeitscodes:

Wie versprochen habe ich das tatsächlich in begrenztem Umfang zum Laufen gebracht :-) Ich komme aus der Perspektive von Drupal/Komponist/Symfony total darauf an - ich habe nicht viel Erfahrung mit CiviCRM, also gibt es wahrscheinlich einige bessere Möglichkeiten, um meinen Prozess unten zu tun. Ich freue mich über jeden Rat!

  1. Laden Sie Drupal 8.3.5 herunter und installieren Sie es (oder den neuesten Entwickler von Drupal 8.4.x!)
  2. Gehen Sie in das Stammverzeichnis der Shell und führen Sie diese Befehle aus, um CiviCRM über Composer zu installieren: https://Gist.github.com/dsnopek/56311dbea347874e75180883efabb62
  3. Wenn Sie Apache verwenden, entfernen Sie die Vendor/.htacess-Datei. Dies ist eine Sicherheitsmaßnahme von Drupal, die verhindert, dass Ressourcen wie CSS/JS geladen werden. Dies erfordert eine gewisse Zusammenarbeit mit dem Projekt Drupal, um eine geeignete Lösung zu finden, da das Entfernen dieser Datei insgesamt eine schlechte Idee für die Produktion ist. Siehe: Vendor/.htaccess blockiert CSS/JS-Assets aus composer -Bibliotheken .
  4. Gehen Sie in das Verzeichnis/modules und machen Sie git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
  5. Gehen Sie zur Seite "Erweitern" (/admin/modules) Und installieren Sie das CiviCRM-Modul
  6. Leere den drupal Cache über Drush (drush cr)
  7. Melden Sie sich ab und wieder an per CRM-19878
  8. CiviCRM funktioniert! :-)

Nach all dem verwendet CiviCRM Symfony 2.8 aus Drupal und den Abhängigkeiten im Drupal-Herstellerverzeichnis und lädt nichts aus dem eigenen Herstellerverzeichnis. Huzzah!

Ich habe die Aktivierung des "Telefon" -Moduls getestet, das vor diesen Änderungen fehlgeschlagen ist (siehe meine Schritte zum Reproduzieren ), funktioniert aber einwandfrei. :-)

8
David Snopek

Ich denke nicht, dass das möglich ist.

Drupal 8.4 hat tatsächlich bereits auf Symfony 3 umgestellt, obwohl es immer noch ähnliche Diskussionen im Zusammenhang mit Drush gibt, das das gleiche Problem hat. siehe Drush 8.x installiert nicht Drupal 8.4.x und Drush Master installiert nicht Drupal 8.3.x und Symfony-Komponenten werden auf 3.2.6 aktualisiert

Es ist nicht möglich, zwei verschiedene Symfony-Versionen zu laden, entweder Sie brechen Ihre Integration oder Sie brechen Drupal. Möglicherweise ist symfony3 noch nicht in 8.4 enthalten, aber die Sicherheitsunterstützung für symfony2 endet vor der Drupal8-Sicherheitsunterstützung. Daher müssen wir irgendwann wechseln.

5
Berdir

Theoretisch sind die einzigen Probleme hier der Dateispeicherort und der Klassennamensraum. Leider können Sie die einzigen Tools, die ich in composer dafür kenne), nicht pro VERSION angeben, sondern nur pro Paketname.

Haben Sie versucht, es als völlig separaten Autoloader einzurichten?

1