Як встановити модуль, що включає іншу версію Symfony?


17

Я розробник та підтримуючий проект CiviCRM. Ми намагалися зробити CiviCRM з версією Drupal 8 і пройшли довгий шлях. Ми б’ємось головами об наші колективні клавіатури, намагаючись визначити головний блокатор проекту.

CiviCRM вже деякий час використовує Symfony, і версія, яка включена, відрізняється від тієї, що постачається з Drupal.

Ми можемо встановити CiviCRM разом з Drupal 8, але після його встановлення ми не зможемо встановити жоден інший модуль Drupal.

Я вважаю, що це зводиться до ситуації, коли якимось чином версія CiviCRM Symfony завантажується до версії Drupal, і це спричиняє проблеми.

Хтось знає про модуль Drupal 8, який включає іншу версію Symfony, ніж та, яка постачається з Drupal?

Нещодавно я натрапив на проект Людвіга. Цей модуль дозволяє реєструвати простори імен у класі, який розширюєтьсяServiceProviderBase .

Чи можливо, щоб версія Drupal 8 модуля CiviCRM включала файл CivicrmServiceProvider.php, який визначає CivicrmServiceProviderклас, і register()метод, який додає простір імен контейнерів, щоб дозволити цьому працювати?

У багатьох файлах CiviCRM є useтакі заяви, як Drupal, починаючи з Symfony, як тут .

Ми фактично поміщаємо CiviCRM Core в папку Druc doc_root / бібліотеки і використовуємо модуль бібліотек.

Це репортаж для версії модуля 8.x CiviCRM Drupal , якщо хтось хоче подивитися, що ми отримали до цього часу. Якщо у когось є чарівний еліксир для цього, я можу вам сказати, що в нашій громаді буде багато щасливих людей. Тож якщо ви знаєте, як нам допомогти, будь ласка.

CiviCRM встановлюється, а сторінки CiviCRM працюють. Що не працює, це те, що після встановлення CiviCRM ми не можемо встановлювати інші модулі через сторінку адмін / модулі. Наскільки я знаю, це єдине, що порушено. Також установка модулів за допомогою Drush після установки CiviCRM працює.

Спроба встановити інший модуль після встановлення CiviCRM викликає таку помилку:

Фатальна помилка PHP: виклик невизначеного методу Symfony \ Компонент \ DependencyInjection \ Визначення :: setFactory () в /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php на лінії 206

Це в Drupal 8.3.5. Спроба встановити CiviCRM для Drupal 8 в чистий примірник Drupal 8.4-dev викликає таку помилку:

Drupal \ Component \ Serialization \ Exception \ InvalidDataTypeException: Зарезервований індикатор "@" не може запустити звичайний скаляр; вам потрібно навести скаляр у рядку 8 (біля "аргументів: [@string_translation, @ civicrm.page_state]"). в Drupal \ Component \ Serialization \ YamlSymfony :: decode () (рядок 40 /var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.php).


На мобільному, але яка версія Symfony? 8.4 буде використовувати 3.x, стрибок з v2.
Метт Гламан

Ми в версії 2.5.0 в CiviCRM
jackrabbithanna

Деяка документація випуску: issues.civicrm.org/jira/browse/CRM-17652 .... Одна людина повідомляє, що не бачив проблеми, але я не впевнений у цьому, всі інші, хто намагається отримати помилку як повідомлялося там
jackrabbithanna

4
Я не думаю, що це можливо. Drupal 8.4 фактично вже перейшов на Symfony3, хоча досі існують подібні дискусії, пов’язані з барабанкою, яка має ту саму проблему. Неможливо завантажити дві різні версії symfony: або ви порушите інтеграцію, або зламаєте Drupal. Можливо, symfony3 ще не буде в 8.4, але підтримка безпеки symfony2 закінчиться перед підтримкою безпеки Drupal8, тому в якийсь момент нам доведеться перейти
Бердір

1
@Berdir, що може дати хорошу відповідь?
Клайв

Відповіді:


8

Отже, я думаю, якби CiviCRM був встановлений у Drupal 8 через композитор (тобто composer require civicrm/civicrm-coreв корінь Drupal), а використання CiviCRM Symfony було сумісно з Symfony 2.8 або 3.x (тобто не використовуючи застарілу функціональність), це може спрацювати.

Це отримає все, встановлене в каталозі постачальників Drupal, а не два, і це означатиме, що CiviCRM буде використовувати версію Symfony в Drupal 8. Але якщо CiviCRM був сумісний з більш пізніми версіями Symfony (навіть якщо він постачав старішу версію для Drupal 6 та 7 та інших CMS), це повинно бути добре.

Я думаю?

ОНОВЛЕНО: Так, це працює - я спробував. :-) Я спочатку розміщував нижче в черзі випуску CiviCRM ( CRM-17652 ), але повторно розміщую тут для повноти.

Велика ідея:

Оскільки композитор є досить новим для багатьох людей, я намагаюся йти крок за кроком, від деяких композицій високого рівня композитора аж до одного способу, що це можна зробити в CiviCRM:

  • Композитор дозволяє програмам вимагати потрібні йому бібліотеки (а бібліотеки, звичайно, можуть вимагати інших бібліотек).
  • Бібліотеки мають файл composer.json, який говорить про те, які інші бібліотеки йому потрібні та які версії сумісні з цим (але не обов'язково окремою окремою версією - зазвичай це ряд версій, як, наприклад, ^2.4.3мінімум від 2.4.3 і вище (але не у тому числі) 3.0.0)
  • У додатках є composer.json, який аналогічно описує необхідні бібліотеки та сумісність із діапазоном версій, але діапазон дійсно допомагає оновити. У додатку також буде composer.lock, який є певним набором окремих версій
  • Бібліотеки також можуть мати composer.lock для власного тестування або розповсюдження (наприклад, побудова випуску тарболу із залежностями, що в комплекті), але це ігнорується, коли додатку потрібна дана бібліотека (див. Https://getcomposer.org/doc/02 -libraries.md # замок-файл )
  • Коли програма хоче вимагати нової бібліотеки, композитор знаходить перетин сумісності версій між усіма речами, які вимагає додаток (включаючи всі вже встановлені бібліотеки та їх залежність) та новою бібліотекою, можливо, виконуючи деякі оновлення, щоб все вирівнялося ( або помилка, якщо вона не може знайти сумісну суміш версій)
  • У цьому випадку CiviCRM - це бібліотека, а певний сайт Drupal 8 - це додаток (ядро Drupal - саме бібліотека)
  • CiviCRM може сказати, що "вимагає" Symfony ^2.5у своєму composer.json, а це означає, що він сумісний з версіями 2.5.0 до (але не включаючи) 3.0.0
  • Коли сайт Drupal 8 хоче використовувати CiviCRM, адміністратор сайту composer require civicrm/civicrm-coreвимагає бібліотеки CiviCRM та всіх її залежностей. Якщо CiviCRM сумісний із Symfony 2.8 (на зразок, який використовується у Drupal 8.3.x), все встановиться та працює нормально, використовуючи єдиний Symfony 2.8 від Drupal. Усі залежності опиняються в каталозі постачальників Drupal.
  • Однак CiviCRM міг би зберегти Symfony 2.5 у своєму composer.lock, а значить, тести використовували б це, а тарболи для Drupal 6 & 7 та інших CMS би вбудовували Symfony 2.5

Пропозицію:

  1. Оновіть composer.json CiviCRM, щоб його можна було використовувати як бібліотеку CMS на основі композиторів, як Drupal 8 (але, мабуть, інші можуть рухатися таким чином у майбутньому - композитор стає досить популярним)
  2. Переконайтесь, що ядро ​​CiviCRM сумісне з Symfony 2.8 та 3.0 (використовується Drupal 8.3.x та 8.4.x відповідно), але зберігайте "офіційно підтримувану" версію (в даний час Symfony 2.5) у composer.lock для тестування та тарболу для розповсюдження. Сумісність з декількома версіями Symfony може не бути такою важкою, як це звучить - є кілька бібліотек, сумісних як із Symfony 2.8, так і 3.0. Це може бути просто питання уникнення застарілих методів / класів / особливостей! Composer.json потрібно буде оновити, щоб відобразити це
  3. Використовуйте композитор для встановлення бібліотеки CiviCRM на Drupal 8, а не копіювання в каталог бібліотек. Це стає нормальним способом встановлення сторонніх бібліотек PHP в Drupal 8 (це широко використовується, наприклад, Drupal Commerce)

Для композиторів, що базуються на композиціях, я дійсно думаю, що це правильний шлях. Хоча ця проблема в даний час зачіпає Symfony та Drupal, оскільки PHP-спільнота починає використовувати все більше і більше сторонніх бібліотек через композитора, це може дуже вплинути на інші CMS з іншими конфліктами версій.

Деякі робочі коди для тестування:

Отже, як я і обіцяв, я фактично змусив це працювати в обмеженій мірі :-) Я цілком підходжу до цього з точки зору Drupal / Composer / Symfony - у мене немає тони досвіду CiviCRM, тому, мабуть, є деякі кращі способи зробити мій процес нижче. Я вітаю будь-яку пораду!

  1. Завантажте та встановіть Drupal 8.3.5 (або найновіший розробник Drupal 8.4.x!)
  2. Перейдіть до кореневого каталогу в оболонці та запустіть ці команди, щоб встановити CiviCRM через композитор: https://gist.github.com/dsnopek/56311dbea347874e75180883efabb620
  3. Якщо ви використовуєте Apache, видаліть файл постачальника / .htacess. Це захід безпеки від Drupal, який запобігає завантаженню таких ресурсів, як CSS / JS. Для того, щоб знайти правильне рішення, знадобиться деяка співпраця з проектом Drupal, оскільки видалення цього файлу взагалі є поганою ідеєю при виробництві. Дивіться: постачальник / .htaccess, що блокує активи CSS / JS з бібліотек композиторів .
  4. Перейдіть до каталогу / module і зробіть git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
  5. Перейдіть на сторінку "Розширення" ( /admin/modules) та встановіть модуль CiviCRM
  6. Очистити кеш drupal через Drush ( drush cr)
  7. Вийдіть та увійдіть знову за CRM-19878
  8. CiviCRM працює! :-)

Після всього цього, CiviCRM використовує Symfony 2.8 від Drupal та залежності в каталозі постачальників Drupal, і не завантажує нічого з власної каталогу постачальників. Huzzah!

Я перевірив включення модуля "Телефон", який не вдався до цих змін (див. Мої кроки для відтворення ), але добре працює з ними. :-)


Ось ось питання, пов’язане з усім цим, використовуючи композитор .... чи можна одним пакетом використовувати Symfony 2.8, а іншим пакетом використовувати Symfony 3.2 ....
jackrabbithanna

Для CiviCRM досить складний інституційний опір, щоб вимагати завжди використовувати ту версію Symfony, яку робить Drupal 8/9.
jackrabbithanna

1
"Використовуючи композитор .... чи можливо один пакет використовувати Symfony 2.8, а інший пакет використовувати Symfony 3.2" -> Ні, PHP не може мати два класи з однаковою назвою. Це насправді не композитор.
Девід Снопек

"Існує досить складний інституційний опір CiviCRM, щоб вимагати завжди використовувати ту версію Symfony, яку робить Drupal 8/9" -> Все, що потрібно для ядра CiviCRM вгору, - це те, що код сумісний з більш пізньою Symfony, що використовується в Drupal. Він не повинен був би його зв'язувати або використовувати за замовчуванням, просто бути сумісним, тобто. уникати застарілих методів / класів / особливостей.
Девід Снопек

Я розумію, чому було б цікаво запустити дві основні версії Symfony паралельно - сорт SemVer передбачає необхідність. Але я думаю, що важливо, щоб великі ділянки компонентів Symfony були схожими у v2 / v3, і інтеграція Civi v2 була досить скромною. Тож я оптимістично налаштований на отримання PHP-коду, сумісного з обома. ІМХО, справжня робота - оновлення каналу розподілу та структури каталогів.
Тім Оттен

5

Я не думаю, що це можливо.

Drupal 8.4 фактично вже перейшов на Symfony 3, хоча досі існують подібні дискусії, пов’язані з барабанкою, яка має ту саму проблему. див. Drush 8.x не встановлює Drupal 8.4.x, а Drush master не встановлює Drupal 8.3.x, а компоненти Symfony оновлено до 3.2.6

Неможливо завантажити дві різні версії symfony: або ви порушите інтеграцію, або зламаєте Drupal. Можливо, symfony3 ще не буде в 8.4, але підтримка безпеки symfony2 закінчиться перед підтримкою безпеки Drupal8, тому в якийсь момент нам доведеться переключитися.


Ну ..... Все працює, крім установки модулів з адміністратора / модулів .... установка модулів за допомогою Drush працює ... Всі сторінки CiviCRM працюють. Тож я не переконаний у її неможливості. Чому це було б неможливо?
jackrabbithanna

1
Не можна завантажувати одночасно дві різні версії одного класу, це неможливо. Помилка звучить точно так, як я очікував, що трапиться. Вам вдалося спочатку завантажити версію 2.5 класу Definition, а потім Drupal розриває, оскільки очікує існування методу, який насправді не має. І різниці будуть зростати, коли Drupal переходить на Symfony 3. Я не зовсім розумію, чому ви застрягли з 2.5, 2.8 - це незначне оновлення і має бути сумісним назад (але не навпаки, як ви дізналися). Отже, ви повинні мати можливість оновити CiviCRM, щоб вимагати 2.8?
Бердір

1
Як я вже згадував у своєму коментарі, я припускав, що вам не сподобається, що я відповім, але це не змінить. Жоден із цих проектів, про які ви згадуєте, не використовує symfony (схоже, що Joomal використовує декілька компонентів, які можуть не конфліктувати, але, можливо, згодом), тому ви не можете порівняти це. Технічно неможливо завантажити дві суперечливі версії одного класу, нічого це не може змінити. Ось чому залежності - це складний бізнес і чому композитор існує. Замість використання бібліотек вам, мабуть, варто вивчити використання композитора та зробити CiviCRM сумісним із кількома версіями
Symfony

2
Крім того, підтримка безпеки для Symfony 2.5 закінчилася в 2015 році відповідно до symfony.com/roadmap?version=2.5#checker , що означає, що CiviCRM побудований на незахищеній та застарілій версії symfony. Одного лише цього повинно бути достатньо, щоб переконати їх у необхідності оновлення, принаймні до версії 2.8, справа не лише в Drupal8.
Бердір

1
@DavidSnopek вірно, те, що ви написали у своїй відповіді, це в основному те, що я згадував у своїх коментарях, але поки composer.json специфіки CiviCRM "~ 2.5.0" для своїх компонентів symfony, це не спрацює. Див. Github.com/civicrm/civicrm-core/blob/master/composer.json . Тож моя відповідь "ви не можете використовувати дві різні версії" все-таки правильна IMHO, ви можете лише покращити / оновити контракти на версії в civicrm, а потім встановити її через композитор і використовувати ту саму версію.
Бердір

1

Теоретично єдиними проблемами є розташування файлів та простір імен класів. На жаль, єдині інструменти, про які я знаю в композиторі, для виконання яких не дозволяють вказувати за ВЕРСІЮ, лише за назвою пакета.

Ви намагалися налаштувати його як повністю окремий автонавантажувач?


Чи можете ви пояснити більш детально, що ви маєте на увазі?
jackrabbithanna

getcomposer.org/doc/faqs/… - це як зробити спеціальне розташування. Я бачив, як люди роздрібнюють проект лише для того, щоб зробити це можливим ... Також getcomposer.org/doc/06-config.md#prepend-autoloader за можливість зберігати автозавантажувач композитора окремо. Зрештою, автозавантажувач - це лише файл PHP, щоб ви могли написати власний автозавантажувач, який вирішить, який з них включити залежно від факторів, які вам подобаються.
Ohthehugemanatee


Будьте зрозумілі, в банкоматах немає способу встановлення композитора для встановлення Civi з D8. Я мав, хоча, можливо, це був один із способів досягти цього. Саме про це йшлося про об'єкт ServiceProvider, про який йдеться у запитанні, як, наприклад, додавання простору імен PSR-4 в Drupal, щоб вказати на бібліотеку CiviCRM ... Якби я це зробив, Civi потрібно було б змінити всі свої файли з «використання Symfony \ .... 'для' використання Civicrm \ Symfony \ .. '? Вибачте моє незнання композитора pls.
jackrabbithanna
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.