Làm cách nào để cài đặt một mô-đun bao gồm một phiên bản khác nhau của Symfony?


17

Tôi là nhà phát triển và bảo trì cho dự án CiviCRM. Chúng tôi đã cố gắng tạo ra một phiên bản Drupal 8 CiviCRM và đã đi được một chặng đường dài. Chúng tôi đang đập đầu vào bàn phím tập thể của chúng tôi để cố gắng tìm ra một công cụ chặn chính cho dự án.

CiviCRM đã sử dụng Symfony trong một thời gian và phiên bản đi kèm khác với những gì được phát hành với Drupal.

Chúng tôi có thể cài đặt CiviCRM với Drupal 8, nhưng sau khi bạn cài đặt nó, chúng tôi không thể cài đặt bất kỳ mô-đun Drupal nào khác.

Tôi tin rằng nó đã đi sâu vào tình huống bằng cách nào đó phiên bản Symfony của CiviCRM tải trước phiên bản Drupal và điều này gây ra sự cố.

Có ai biết mô-đun Drupal 8 bao gồm một phiên bản Symfony khác với phiên bản đi kèm với Drupal không?

Gần đây tôi chạy qua dự án Ludwig. Mô-đun này cho phép đăng ký không gian tên trong một lớp mở rộngServiceProviderBase .

Phiên bản Drupal 8 của mô-đun CiviCRM có thể bao gồm tệp CivicrmServiceProvider.php, định nghĩa một CivicrmServiceProviderlớp và register()phương thức thêm không gian tên container để cho phép nó hoạt động không?

Nhiều tệp CiviCRM có các usecâu lệnh như Drupal bắt đầu bằng Symfony, như ở đây .

Chúng tôi thực sự đã đưa CiviCRM Core vào thư mục Drupal doc_root / library và sử dụng mô-đun thư viện.

Đây là repo cho mô-đun CiviCRM Drupal phiên bản 8.x , nếu ai đó muốn xem xét những gì chúng tôi đã nhận được cho đến nay. Nếu ai đó có thuốc tiên cho điều này, tôi có thể nói với bạn rằng sẽ có nhiều người hạnh phúc trong cộng đồng của chúng ta. Vì vậy, nếu bạn biết làm thế nào để giúp chúng tôi, xin vui lòng làm.

CiviCRM không cài đặt và các trang CiviCRM hoạt động. Điều không hiệu quả là sau khi CiviCRM được cài đặt, chúng tôi không thể cài đặt các mô-đun khác thông qua trang quản trị / mô-đun. Theo tôi biết đó là điều duy nhất bị phá vỡ. Cũng cài đặt các mô-đun với Drush, sau khi cài đặt CiviCRM, không hoạt động.

Cố gắng cài đặt một mô-đun khác sau khi CiviCRM được cài đặt gây ra lỗi sau:

Lỗi nghiêm trọng của PHP: Gọi đến phương thức không xác định Symfony \ Component \ DependencyInjection \ Định nghĩa :: setFactory () trong /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php

Đó là trong Drupal 8.3.5. Cố gắng cài đặt CiviCRM cho Drupal 8 vào phiên bản Drupal 8.4-dev sạch sẽ gây ra lỗi sau:

Drupal \ Thành phần \ Tuần tự hóa \ Ngoại lệ \ UnlimitedDataTypeException: Chỉ báo dành riêng "@" không thể khởi động vô hướng đơn giản; bạn cần trích dẫn vô hướng ở dòng 8 (gần "đối số: [@opes_translation, @ civicrm.page_state]"). trong Drupal \ Thành phần \ Tuần tự hóa \ YamlSymfony :: decode () (dòng 40 của /var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.php).


Trên di động, nhưng phiên bản nào của Symfony? 8.4 sẽ sử dụng 3.x, một bước nhảy từ v2.
Matt Glaman

Chúng tôi đang ở phiên bản 2.5.0 trong CiviCRM
jackrabbithanna

Một số tài liệu về vấn đề: problems.civicrm.org/jira/browse/CRM-17652 .... Một người báo cáo rằng anh ta đã không nhìn thấy vấn đề, nhưng tôi không chắc về điều đó, những người khác cố gắng gặp lỗi như đã báo cáo ở đó
jackrabbithanna

4
Tôi không nghĩ rằng điều này là có thể. Drupal 8.4 thực sự đã chuyển sang Symfony3 mặc dù vẫn còn các cuộc thảo luận tương tự liên quan đến drush, có cùng một vấn đề. Không thể tải hai phiên bản symfony khác nhau, hoặc bạn phá vỡ sự tích hợp của bạn hoặc bạn phá vỡ Drupal. Có thể symfony3 chưa có trong 8.4, nhưng hỗ trợ bảo mật cho symfony2 sẽ kết thúc trước khi hỗ trợ bảo mật Drupal8, vì vậy, đến một lúc nào đó, chúng tôi sẽ phải chuyển đổi
Berdir

1
@Berdir có thể làm cho một câu trả lời tốt?
Clive

Câu trả lời:


8

Vì vậy, tôi nghĩ rằng nếu CiviCRM được cài đặt vào Drupal 8 thông qua trình soạn thảo (tức là composer require civicrm/civicrm-coretrong gốc Drupal) và việc sử dụng Symfony của CiviCRM tương thích với Symfony 2.8 hoặc 3.x (tức là không sử dụng chức năng không dùng nữa), điều này có thể hoạt động.

Điều này sẽ giúp mọi thứ được cài đặt trong thư mục nhà cung cấp của Drupal, thay vì có hai, và điều đó có nghĩa là CiviCRM sẽ sử dụng phiên bản Symfony trong Drupal 8. Nhưng nếu CiviCRM tương thích với các phiên bản Symfony sau này (ngay cả khi nó có phiên bản cũ hơn cho Drupal 6 & 7 và các CMS khác) nó sẽ ổn.

Tôi nghĩ?

CẬP NHẬT: Có, nó hoạt động - Tôi đã thử nó. :-) Ban đầu tôi đã đăng bài dưới đây trong hàng đợi vấn đề CiviCRM ( CRM-17652 ), nhưng đăng lại ở đây cho đầy đủ.

Ý tưởng lớn:

Vì nhà soạn nhạc khá mới đối với nhiều người, tôi sẽ cố gắng từng bước, từ một số nhà soạn nhạc cấp cao cho đến một cách có thể được thực hiện trong CiviCRM:

  • Trình soạn thảo cho phép các ứng dụng yêu cầu các thư viện cần thiết (và tất nhiên, các thư viện có thể yêu cầu các thư viện khác).
  • Các thư viện có tệp composer.json cho biết các thư viện khác cần gì và phiên bản nào tương thích với nó (nhưng không nhất thiết phải là một phiên bản cụ thể - thường là một loạt các phiên bản, như ^2.4.3có tối thiểu 2.4.3 và tối đa (nhưng không bao gồm) 3.0.0)
  • Các ứng dụng có một composer.json mô tả tương tự các thư viện cần thiết và khả năng tương thích với một loạt các phiên bản, nhưng phạm vi này thực sự giúp ích cho việc cập nhật. Một ứng dụng cũng sẽ có một composer.lock, đó là một bộ các phiên bản riêng biệt
  • Các thư viện cũng có thể có một composer.lock để thử nghiệm hoặc phân phối riêng của họ (như xây dựng tarball phát hành với các gói phụ thuộc), nhưng điều này bị bỏ qua khi một ứng dụng yêu cầu thư viện đã cho (xem https://getcomposer.org/doc/02 -lologists.md # lock-file )
  • Khi một ứng dụng muốn yêu cầu một thư viện mới, nhà soạn nhạc tìm thấy sự giao thoa giữa khả năng tương thích phiên bản giữa tất cả những thứ mà ứng dụng yêu cầu (bao gồm tất cả các thư viện đã được cài đặt và phụ thuộc của chúng) và thư viện mới, có thể thực hiện một số cập nhật để sắp xếp mọi thứ ( hoặc lỗi nếu không thể tìm thấy kết hợp các phiên bản tương thích)
  • Trong trường hợp này, CiviCRM là một thư viện và một trang web Drupal 8 cụ thể là ứng dụng (chính lõi Drupal là một thư viện)
  • CiviCRM có thể nói nó "yêu cầu" Symfony ^2.5trong composer.json, có nghĩa là nó tương thích với các phiên bản 2.5.0 cho đến (nhưng không bao gồm) 3.0.0
  • Khi trang web Drupal 8 muốn sử dụng CiviCRM, quản trị viên trang sử dụng composer require civicrm/civicrm-coređể yêu cầu thư viện CiviCRM và tất cả các phụ thuộc của nó. Nếu CiviCRM tương thích với Symfony 2.8 (như được sử dụng trong Drupal 8.3.x), mọi thứ sẽ cài đặt và hoạt động tốt, sử dụng Symfony 2.8 duy nhất từ ​​Drupal. Tất cả các phụ thuộc kết thúc trong thư mục nhà cung cấp của Drupal.
  • Tuy nhiên, CiviCRM có thể giữ Symfony 2.5 trong trình soạn thảo.lock, điều đó có nghĩa là các bài kiểm tra sẽ sử dụng điều đó và các tarball cho Drupal 6 & 7 và các CMS khác sẽ gói Symfony 2.5

Đề xuất:

  1. Cập nhật composer.json của CiviCRM để nó có thể được sử dụng làm thư viện bởi các CMS dựa trên nhà soạn nhạc như Drupal 8 (nhưng có lẽ những người khác có thể di chuyển theo cách đó trong tương lai - nhà soạn nhạc đang trở nên khá phổ biến)
  2. Đảm bảo lõi CiviCRM tương thích với Symfony 2.8 và 3.0 (được sử dụng bởi Drupal 8.3.x và 8.4.x) nhưng vẫn giữ phiên bản "được hỗ trợ chính thức" (hiện là Symfony 2.5) trong composer.lock để thử nghiệm và tarball để phân phối. Tương thích với nhiều phiên bản Symfony có thể không khó như âm thanh - có một số thư viện ngoài đó tương thích với cả Symfony 2.8 và 3.0. Nó có thể chỉ là vấn đề tránh các phương thức / lớp / tính năng không dùng nữa! Composer.json sẽ cần được cập nhật để phản ánh điều này
  3. Sử dụng trình soạn thảo để cài đặt thư viện CiviCRM trên Drupal 8 thay vì sao chép vào thư mục thư viện. Điều này đang trở thành cách thông thường để cài đặt thư viện PHP của bên thứ 3 trong Drupal 8 (ví dụ, điều này được sử dụng rộng rãi bởi Drupal Commerce)

Đối với các CMS dựa trên nhà soạn nhạc, tôi thực sự nghĩ rằng đây là cách đúng đắn. Mặc dù vấn đề này hiện đang ảnh hưởng đến Symfony và Drupal, vì cộng đồng PHP bắt đầu sử dụng ngày càng nhiều thư viện của bên thứ 3 thông qua trình soạn thảo, điều này rất có thể ảnh hưởng đến các CMS khác với các xung đột phiên bản khác.

Một số mã làm việc để kiểm tra:

Vì vậy, như đã hứa, tôi thực sự đã làm việc này ở một mức độ hạn chế :-) Tôi hoàn toàn hiểu điều này từ góc độ Drupal / Nhà soạn nhạc / Symfony - Tôi không có nhiều kinh nghiệm về CiviCRM, vì vậy có lẽ có một số cách tốt hơn để làm quá trình của tôi dưới đây. Tôi hoan nghênh mọi lời khuyên!

  1. Tải xuống và cài đặt Drupal 8.3.5 (hoặc nhà phát triển mới nhất của Drupal 8.4.x!)
  2. Đi vào thư mục gốc trong shell và chạy các lệnh này để cài đặt CiviCRM thông qua trình soạn thảo: https://gist.github.com/dsnopek/56311dbea347874e75180883efabb620
  3. Nếu bạn sử dụng Apache, hãy xóa tệp nhà cung cấp / .htacess. Đây là một biện pháp bảo mật từ Drupal, nhằm ngăn chặn các tài nguyên như CSS / JS được tải. Điều này sẽ cần một số sự hợp tác với dự án Drupal để tìm ra một giải pháp thích hợp bởi vì loại bỏ hoàn toàn tệp này là một ý tưởng tồi trong sản xuất. Xem: nhà cung cấp / .htaccess chặn tài sản CSS / JS từ thư viện nhà soạn nhạc .
  4. Đi vào thư mục / mô-đun và làm git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
  5. Chuyển đến trang "Gia hạn" ( /admin/modules) và cài đặt mô-đun CiviCRM
  6. Xóa bộ nhớ cache drupal qua Drush ( drush cr)
  7. Đăng xuất và đăng nhập lại theo CRM-19878
  8. CiviCRM hoạt động! :-)

Sau tất cả những điều này, CiviCRM đang sử dụng Symfony 2.8 từ Drupal và các phụ thuộc trong thư mục nhà cung cấp của Drupal và không tải bất cứ thứ gì từ thư mục nhà cung cấp riêng của nó. Huzzah!

Tôi đã thử nghiệm kích hoạt mô-đun "Điện thoại" bị lỗi trước những thay đổi này (xem các bước để tạo lại ), nhưng hoạt động tốt với chúng. :-)


Vì vậy, đây là một câu hỏi liên quan đến tất cả những điều này, sử dụng nhà soạn nhạc .... có thể có một gói sử dụng Symfony 2.8 và một gói khác sử dụng Symfony 3.2 ....
jackrabbithanna

Có một sự kháng cự khá khó khăn đối với CiviCRM khi luôn phải sử dụng phiên bản Symfony mà Drupal 8/9 thực hiện.
jackrabbithanna

1
"bằng cách sử dụng trình soạn thảo .... có thể có một gói sử dụng Symfony 2.8 và gói khác sử dụng Symfony 3.2" -> Không, PHP không thể có hai lớp có cùng tên. Đây không thực sự là một điều nhà soạn nhạc.
David Snopek

"Yêu cầu về thể chế khá khó khăn đối với CiviCRM là luôn luôn phải sử dụng phiên bản Symfony mà Drupal 8/9 làm" -> Tất cả những gì sẽ được yêu cầu đối với lõi CiviCRM ngược dòng là mã tương thích với Symfony sau này được sử dụng trong Drupal. Nó sẽ không phải gói nó hoặc sử dụng nó theo mặc định, chỉ cần tương thích, tức là. tránh các phương thức / lớp / tính năng không dùng nữa.
David Snopek

Tôi hiểu lý do tại sao một người sẽ quan tâm đến việc chạy hai phiên bản chính của Symfony cạnh nhau - SemVer sorta ngụ ý sự cần thiết. Nhưng tôi nghĩ điều quan trọng là các thành phần lớn của Symfony tương tự như trong v2 / v3 và sự tích hợp v2 của Civi khá khiêm tốn. Vì vậy, tôi lạc quan về việc có hoặc đạt được mã PHP tương thích với cả hai. IMHO, công việc thực sự đang cập nhật cấu trúc kênh phân phối và thư mục.
Tim Otten

5

Tôi không nghĩ rằng điều này là có thể.

Drupal 8.4 thực sự đã chuyển sang Symfony 3 mặc dù vẫn còn các cuộc thảo luận tương tự liên quan đến drush, có cùng một vấn đề. xem Drush 8.x không cài đặt Drupal 8.4.x và Drush master không cài đặt Drupal 8.3.x các thành phần Symfony được cập nhật lên 3.2.6

Không thể tải hai phiên bản symfony khác nhau, hoặc bạn phá vỡ sự tích hợp của bạn hoặc bạn phá vỡ Drupal. Có thể symfony3 sẽ không ở trong 8.4, nhưng hỗ trợ bảo mật cho symfony2 sẽ kết thúc trước khi hỗ trợ bảo mật Drupal8, vì vậy tại một số điểm, chúng tôi sẽ phải chuyển đổi.


Chà ..... Mọi thứ hoạt động trừ cài đặt các mô-đun từ quản trị viên / mô-đun .... cài đặt các mô-đun với Drush đều hoạt động ... Tất cả các trang CiviCRM đều hoạt động. Vì vậy, tôi không tin rằng nó không thể. Tại sao nó là không thể?
jackrabbithanna

1
Bạn không thể tải hai phiên bản khác nhau của cùng một lớp cùng một lúc, điều đó là không thể. Lỗi nghe có vẻ chính xác như những gì tôi dự kiến ​​sẽ xảy ra. Bạn đã quản lý để tải phiên bản 2.5 của lớp Định nghĩa trước và sau đó Drupal nghỉ vì nó hy vọng một phương thức tồn tại mà thực tế không có. Và sự khác biệt sẽ ngày càng lớn hơn khi Drupal chuyển sang Symfony 3. Tôi không hiểu tại sao bạn bị mắc kẹt với 2.5, 2.8 là một bản cập nhật nhỏ và nên tương thích ngược (nhưng không phải là cách khác như bạn đã tìm ra). Vậy bạn có thể cập nhật CiviCRM để yêu cầu 2.8?
Berdir

1
Như tôi đã đề cập trong bình luận của mình, tôi cho rằng bạn sẽ không thích tôi trả lời, nhưng điều đó không thay đổi nó. Không có dự án nào bạn đề cập sử dụng symfony (joomal dường như sử dụng một số ít các thành phần có thể không xung đột nhưng cuối cùng có thể sẽ xảy ra), vì vậy bạn không thể so sánh điều đó. Về mặt kỹ thuật là không thể tải hai phiên bản xung đột của cùng một lớp, không có gì có thể thay đổi điều đó. Đó là lý do tại sao phụ thuộc là một doanh nghiệp phức tạp và tại sao nhà soạn nhạc tồn tại. Thay vì sử dụng các thư viện, có lẽ bạn nên xem xét việc sử dụng trình soạn thảo và làm cho CiviCRM tương thích với nhiều phiên bản symfony
Berdir

2
Ngoài ra, hỗ trợ bảo mật cho Symfony 2.5 đã kết thúc vào năm 2015 theo symfony.com/roadmap?version=2.5#checker , có nghĩa là CiviCRM được xây dựng trên phiên bản symfony không an toàn và lỗi thời. Điều đó thôi cũng đủ để thuyết phục họ rằng một bản cập nhật là cần thiết, ít nhất là với phiên bản 2.8, nó không chỉ là về Drupal8.
Berdir

1
@DavidSnopek đúng, những gì bạn đã viết trong câu trả lời của bạn về cơ bản là những gì tôi đã đề cập trong các nhận xét của mình, nhưng miễn là composer.json của các đặc tả CiviCRM "~ 2.5.0" cho các thành phần symfony của nó, điều đó sẽ không hoạt động. Xem github.com/civicrm/civicrm-core/blob/master/composer.json . Vì vậy, câu trả lời của tôi "bạn không thể sử dụng hai phiên bản khác nhau" vẫn là IMHO chính xác, bạn chỉ có thể cải thiện / cập nhật các hạn chế phiên bản trong civicrm và sau đó cài đặt nó thông qua trình soạn thảo và sử dụng cùng một phiên bản.
Berdir

1

Về mặt lý thuyết, vấn đề duy nhất ở đây là vị trí tệp và không gian tên lớp. Thật không may, các công cụ duy nhất tôi biết trong trình soạn thảo để thực hiện điều đó không cho phép bạn chỉ định cho mỗi PHIÊN BẢN, chỉ mỗi tên gói.

Bạn đã thử thiết lập nó như một trình tải tự động hoàn toàn riêng biệt chưa?


Bạn có thể giải thích chi tiết hơn những gì bạn có ý nghĩa?
jackrabbithanna

getcomposer.org/doc/faqs/ trộm là cách thực hiện vị trí tùy chỉnh. Tôi đã thấy mọi người chia rẽ một dự án chỉ để thực hiện điều này ... Ngoài ra getcomposer.org/doc/06-config.md#prepend-autoloader cho tùy chọn tách riêng trình tải tự động của nhà soạn nhạc. Cuối cùng, trình tải tự động chỉ là một tệp php, vì vậy bạn có thể viết trình tải tự động của riêng bạn để quyết định cái nào sẽ bao gồm tùy thuộc vào bất kỳ yếu tố nào bạn thích.
Ohthehugemanatee


Hãy rõ ràng, ATM không có phương pháp cài đặt dựa trên trình soạn thảo để cài đặt Civi với D8. Tôi đã có mặc dù có lẽ đó là một cách để thực hiện điều này. Đó là những gì đối tượng ServiceProvider được đề cập trong câu hỏi nói về, như thêm một không gian tên PSR-4 vào Drupal để trỏ đến thư viện CiviCRM ... Nếu tôi đã làm điều này, Civi có cần thay đổi tất cả các tệp của nó từ 'sử dụng Symfony \ .... 'để' sử dụng Civicrm \ Symfony \ .. '? Xin tha thứ cho sự thiếu hiểu biết của tôi về nhà soạn nhạc.
jackrabbithanna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.