다른 버전의 Symfony가 포함 된 모듈을 설치하는 방법은 무엇입니까?


17

CiviCRM 프로젝트의 개발자이자 관리자입니다. 우리는 Drupal 8 버전 CiviCRM을 만들려고 노력했으며 먼 길을 왔습니다. 우리는 프로젝트의 주요 차단제를 찾으려고 노력하는 단체 키보드에 대해 머리를 숙이고 있습니다.

CiviCRM은 한동안 Symfony를 사용했으며 포함 된 버전은 Drupal과 함께 제공되는 버전과 다릅니다.

Drupal 8과 함께 CiviCRM을 설치할 수 있지만 설치 한 후에는 다른 Drupal 모듈을 설치할 수 없습니다.

나는 그것이 Drupal 버전 이전에 CifonCRM 버전의 Symfony가 어떻게 든로드되는 상황으로 요약되며 이는 문제를 일으킨다.

Drupal과 함께 제공되는 것과 다른 버전의 Symfony를 포함하는 Drupal 8 모듈에 대해 아는 사람이 있습니까?

최근에 나는 Ludwig 프로젝트를 가로 질러 달렸다. 이 모듈을 사용하면 확장하는 클래스ServiceProviderBase 에 네임 스페이스를 등록 할 수 있습니다 .

Drupal 8 버전의 CiviCRM 모듈에 CivicrmServiceProvider클래스 를 정의하는 CivicrmServiceProvider.php 파일과이 register()작업을 수행 할 수 있도록 컨테이너 네임 스페이스를 추가하는 메소드가 포함될 수 있습니까?

많은 CiviCRM 파일에는 use다음과 같이 Symfony로 시작하는 Drupal과 같은 명령문이 있습니다 .

실제로 CiviCRM Core를 Drupal doc_root / libraries 폴더에 넣고 라이브러리 모듈을 사용합니다.

누군가가 우리가 지금까지 얻은 것을보고 싶다면 CiviCRM Drupal 모듈 8.x 버전의 저장소입니다 . 누군가가 이것을 위해 마법의 비약을 가지고 있다면, 나는 우리 공동체에 많은 행복한 사람들이 있다고 말할 수 있습니다. 도움이 필요하시면 알려주세요.

CiviCRM이 설치되고 CiviCRM 페이지가 작동합니다. 작동하지 않는 것은 CiviCRM을 설치 한 후 관리자 / 모듈 페이지를 통해 다른 모듈을 설치할 수 없다는 것입니다. 내가 아는 한 그것이 깨지는 유일한 것입니다. CiviCRM을 설치 한 후 Drush로 모듈을 설치해도 작동합니다.

CiviCRM을 설치 한 후 다른 모듈을 설치하려고하면 다음 오류가 발생합니다.

PHP 치명적 오류 : 206 행의 /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php에서 정의되지 않은 메소드 Symfony \ Component \ DependencyInjection \ Definition :: setFactory () 호출

Drupal 8.3.5에 있습니다. Drupal 8 용 CiviCRM을 깨끗한 Drupal 8.4-dev 인스턴스에 설치하려고하면 다음 오류가 발생합니다.

Drupal \ Component \ Serialization \ Exception \ InvalidDataTypeException : 예약 된 표시기 "@"은 일반 스칼라를 시작할 수 없습니다. 8 행에서 스칼라를 인용해야합니다 ( "인수 : [@string_translation, @ civicrm.page_state]"근처). Drupal \ Component \ Serialization \ YamlSymfony :: decode () (/ var / www / html / drupal84 / core / lib / Drupal / Component / Serialization / YamlSymfony.php의 40 행)


모바일에서 Symfony의 버전은 무엇입니까? 8.4는 v2에서 점프 한 3.x를 사용합니다.
매트 글 래먼

우리는 CiviCRM 버전 2.5.0에 있습니다
jackrabbithanna

문제에 대한 일부 문서 : issues.civicrm.org/jira/browse/CRM-17652 .... 한 사람이 자신이 문제를 보지 못했다고보고하지만 그 사실을 확신하지 못하는 사람은 모두 다른 사람이 등이보고
jackrabbithanna

4
나는 이것이 가능하지 않다고 생각합니다. Drupal 8.4는 실제로 동일한 문제가있는 drush와 관련된 토론이 여전히 있지만 Symfony3으로 이미 전환했습니다. 두 가지 다른 심포니 버전을로드 할 수 없습니다. 통합을 중단하거나 Drupal을 중단하십시오. 어쩌면 symfony3은 아직 8.4에 있지 않을 것입니다.하지만 symfony2에 대한 보안 지원은 Drupal8 보안 지원 이전에 종료 될 것이므로 어느 시점에서 전환해야합니다
Berdir

1
@Berdir 좋은 답변이 될까요?
Clive

답변:


8

따라서 CiviCRM이 작곡가 (예 : composer require civicrm/civicrm-coreDrupal 루트) 를 통해 Drupal 8에 설치되었고 CiviCRM의 Symfony 사용이 Symfony 2.8 또는 3.x (더 이상 사용되지 않는 기능을 사용하지 않음)와 호환되면 작동 할 수 있다고 생각합니다.

이렇게하면 Drupal의 공급 업체 디렉토리에 모든 것이 설치되며, 두 개가 아닌 CiviCRM이 Drupal 8의 Symfony 버전을 사용한다는 의미입니다. 그러나 CiviCRM이 이후 Symfony 버전과 호환되는 경우 (Druup의 이전 버전을 번들로 제공 한 경우에도) 6 및 7 및 기타 CMS)) 괜찮습니다.

내 생각 엔?

업데이트 : 예, 작동합니다-시도했습니다. :-) 원래 CiviCRM 이슈 큐 ( CRM-17652 )에 아래 내용을 게시했지만 완전성을 위해 여기에 다시 게시합니다.

큰 아이디어 :

작곡가는 많은 사람들에게 매우 새롭기 때문에, 고급 작곡가부터 CiviCRM에서 수행 할 수있는 한 가지 방법까지 단계별로 시도하려고합니다.

  • Composer를 사용하면 응용 프로그램에 필요한 라이브러리가 필요합니다 (물론 라이브러리에는 다른 라이브러리가 필요할 수 있음).
  • 라이브러리에는 composer.json 파일이 있으며 필요한 다른 라이브러리와 호환되는 버전을 알려줍니다 (그러나 특정 단일 버전 일 필요는 없습니다. 일반적으로 ^2.4.3최소 2.4.3 이상 (그러나 포함) 3.0.0)
  • 응용 프로그램에는 필요한 라이브러리 및 다양한 버전과의 호환성을 유사하게 설명하는 composer.json이 있지만 범위는 실제로 업데이트에 도움이됩니다. 응용 프로그램에는 개별 버전의 특정 세트 인 composer.lock도 있습니다.
  • 라이브러리에는 자체 테스트 또는 배포를 위해 composer.lock이있을 수 있지만 (예 : 종속성 번들로 릴리스 타르볼 빌드) 응용 프로그램에 지정된 라이브러리가 필요한 경우 무시됩니다 ( https://getcomposer.org/doc/02). -libraries.md # lock-file )
  • 응용 프로그램에서 새 라이브러리가 필요하면 작곡가는 응용 프로그램에 필요한 모든 것 (이미 설치된 모든 라이브러리 및 해당 종속성 포함)과 새 라이브러리 간의 버전 호환성이 교차되어 있음을 확인합니다. 호환되는 버전을 찾을 수 없으면 오류가 발생합니다)
  • 이 경우 CiviCRM은 라이브러리이고 특정 Drupal 8 사이트는 애플리케이션입니다 (Drupal Core 자체는 라이브러리 임)
  • CiviCRM은 ^2.5composer.json에서 Symfony 를 "필요하다"고 말할 수 있습니다. 이는 3.0.0 이하의 3.5.0 버전과 호환된다는 의미입니다.
  • Drupal 8 사이트가 CiviCRM을 사용하려고 할 때, 사이트 관리자는 composer require civicrm/civicrm-coreCiviCRM 라이브러리와 모든 종속성을 요구합니다. CiviCRM이 Drupal 8.3.x에서 사용되는 Symfony 2.8과 호환되는 경우 Drupal의 단일 Symfony 2.8을 사용하면 모든 것이 제대로 설치되고 작동합니다. 모든 종속성은 Drupal의 공급 업체 디렉토리에 있습니다.
  • 그러나 CiviCRM은 Symfony 2.5를 composer.lock에 유지할 수 있습니다. 즉, 테스트에서이를 사용할 수 있으며 Drupal 6 & 7 및 기타 CMS의 tarball은 Symfony 2.5를 번들로 제공합니다.

제안:

  1. CiviCRM의 composer.json을 업데이트하여 Drupal 8과 같은 작곡가 기반 CMS에서 라이브러리로 사용할 수 있습니다 (그러나 아마도 다른 사람들이 미래에 그런 식으로 움직일 수 있습니다-작곡가가 인기를 얻고 있습니다)
  2. CiviCRM 코어가 Symfony 2.8 및 3.0 (각각 Drupal 8.3.x 및 8.4.x에서 사용)과 호환 되는지 확인 하지만 테스트를 위해 composer.lock에 "공식적으로 지원되는"버전 (현재 Symfony 2.5)을 유지하고 배포 할 tarball을 유지하십시오. 여러 Symfony 버전과 호환되는 것은 생각만큼 어렵지 않을 수 있습니다. Symfony 2.8 및 3.0과 호환되는 라이브러리가 많이 있습니다. 더 이상 사용되지 않는 메소드 / 클래스 / 기능을 피하는 것이 문제 일 수 있습니다! 이를 반영하려면 composer.json을 업데이트해야합니다.
  3. Composer를 사용하여 라이브러리 디렉토리로 복사하지 않고 Drupal 8에 CiviCRM 라이브러리를 설치하십시오. 이는 Drupal 8에 타사 PHP 라이브러리를 설치하는 일반적인 방법이되었습니다 (예 : Drupal Commerce에서 광범위하게 사용됨).

작곡가 기반 CMS의 경우 이것이 올바른 방법이라고 생각합니다. 이 문제는 현재 Symfony 및 Drupal에 영향을 미치지 만, PHP 커뮤니티는 작성기를 통해 점점 더 많은 타사 라이브러리를 사용하기 시작하므로 다른 CMS와 다른 버전 충돌에 영향을 줄 수 있습니다.

테스트 할 작업 코드 :

약속대로, 나는 실제로 이것을 제한된 정도로 작동하게했습니다 :-) Drupal / Composer / Symfony 관점에서 완전히오고 있습니다-CiviCRM 경험이 많지 않으므로 아마도 몇 가지가있을 것입니다 아래 내 프로세스를 수행하는 더 좋은 방법. 나는 조언을 환영합니다!

  1. Drupal 8.3.5 (또는 최신 Drupal 8.4.x 개발자)를 다운로드하여 설치하십시오.
  2. 쉘의 루트 디렉토리로 이동하여 composer를 통해 CiviCRM을 설치하려면 다음 명령을 실행 하십시오 . https://gist.github.com/dsnopek/56311dbea347874e75180883efabb620
  3. Apache를 사용하는 경우 vendor / .htacess 파일을 제거하십시오. 이는 CSS / JS와 같은 리소스가로드되지 않도록하는 Drupal의 보안 조치입니다. 이 파일을 모두 제거하는 것은 프로덕션 환경에 좋지 않기 때문에 적절한 솔루션을 찾으려면 Drupal 프로젝트와의 협력이 필요합니다. composer 라이브러리에서 CSS / JS 자산을 차단하는 vendor / .htaccess를 참조하십시오 .
  4. / modules 디렉토리로 이동하여 git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
  5. "확장"페이지 ( /admin/modules)로 이동 하여 CiviCRM 모듈을 설치하십시오.
  6. Drush ( drush cr) 를 통한 드 루핑 캐시 지우기
  7. CRM-19878에 따라 로그 아웃했다가 다시 로그인
  8. CiviCRM이 작동합니다! :-)

이 모든 후 CiviCRM은 Drupal의 Symfony 2.8과 Drupal 공급 업체 디렉토리의 종속성을 사용하며 자체 공급 업체 디렉토리에서 아무것도로드하지 않습니다. 후자!

이러한 변경 전에 실패한 "전화"모듈의 활성화를 테스트 했지만 (제조 단계 참조 ) 제대로 작동합니다. :-)


따라서 composer를 사용하여이 모든 것과 관련된 질문이 있습니다. 하나의 패키지에서 Symfony 2.8을 사용하고 다른 패키지에서 Symfony 3.2를 사용할 수 있습니까? ...
jackrabbithanna

Drupal 8/9가 수행하는 Symfony 버전을 항상 사용해야하는 CiviCRM에 대한 제도적 저항은 상당히 어렵습니다.
jackrabbithanna

1
"composer를 사용하면 .... 하나의 패키지에서 Symfony 2.8을 사용하고 다른 패키지에서 Symfony 3.2를 사용할 수 있습니다"-> 아니오, PHP는 동일한 이름을 가진 두 개의 클래스를 가질 수 없습니다. 이것은 실제로 작곡가가 아닙니다.
David Snopek

"항상 드루팔 8/9가하는 심포니의 버전을 사용하는 데 필요한되고 CiviCRM 꽤 어려운 제도적 저항이있다"-> 상류 CiviCRM 핵심 요구 될 모든 코드가 있다는 것이다 호환 나중에 심포니 드루팔에 사용에. 번들로 묶거나 기본적으로 사용할 필요가 없으며 호환 가능합니다. 더 이상 사용되지 않는 메소드 / 클래스 / 기능을 피하십시오.
David Snopek

나는 두 가지 주요 버전의 Symfony를 나란히 실행하는 데 관심이있는 이유를 얻습니다 .SemVer sorta는 필요성을 의미합니다. 그러나 v2 / v3에서는 큰 규모의 Symfony 구성 요소가 비슷하고 Civi의 v2 통합은 매우 완만하다고 생각합니다. 그래서 나는 둘 다 호환되는 PHP 코드를 가지고 있거나 달성하는 것에 대해 낙관적입니다. IMHO, 실제 작업은 배포 채널 및 디렉토리 구조를 업데이트하고 있습니다.
Tim Otten

5

나는 이것이 가능하지 않다고 생각합니다.

Drupal 8.4는 실제로 동일한 문제가있는 drush와 관련된 비슷한 논의가 있지만 실제로 Symfony 3으로 이미 전환했습니다. 참조 Drush 8.x의 드루팔 8.4.x 설치하지 않고 Drush 마스터는 드루팔 8.3.x 설치하지 않습니다심포니 구성 요소는 3.2.6로 업데이트됩니다

두 가지 다른 심포니 버전을로드 할 수 없습니다. 통합을 중단하거나 Drupal을 중단하십시오. symfony3은 아직 8.4에 있지 않을 수도 있지만, symfony2에 대한 보안 지원은 Drupal8 보안 지원 이전에 종료 될 것이므로 어느 시점에서 전환해야합니다.


음 ..... admin / modules에서 모듈을 설치하는 것을 제외하고는 모든 것이 작동합니다. Drush로 모듈을 설치하면 작동합니다 ... 모든 CiviCRM 페이지가 작동합니다. 그래서 나는 그것이 불가능하다고 확신하지 않습니다. 왜 불가능할까요?
jackrabbithanna

1
동일한 클래스의 서로 다른 두 가지 버전을 동시에로드 할 수는 없습니다. 오류는 내가 일어날 것으로 예상되는 것과 정확히 같습니다. 2.5 버전의 정의 클래스를 먼저로드 한 다음 실제로 존재하지 않는 메소드가 존재하기 때문에 Drupal이 중단됩니다. Drupal이 Symfony 3으로 전환함에 따라 차이점이 더 커질 것입니다. 왜 2.5에 갇혀 있는지 이해하지 못합니다. 따라서 CiviCRM을 업데이트하여 2.8이 필요합니까?
Berdir

1
내 의견에서 언급했듯이, 나는 당신이 대답하고 싶지 않지만 그것을 바꾸지는 않는다고 가정했습니다. 언급 한 프로젝트 중 어느 것도 symfony를 사용하지 않습니다 (joomal은 충돌 할 수는 없지만 결국에는 가능할 소수의 구성 요소를 사용하는 것으로 보입니다). 동일한 클래스의 충돌하는 두 버전을로드하는 것은 기술적으로 불가능합니다. 아무것도 변경할 수 없습니다. 그것이 의존성이 복잡한 사업이고 작곡가가 존재하는 이유입니다. 라이브러리를 사용하는 대신 작곡가를 사용하고 CiviCRM이 여러 심포니 버전과 호환되도록해야합니다.
Berdir

2
또한 symfony.com/roadmap?version=2.5#checker 에 따르면 Symfony 2.5에 대한 보안 지원은 2015 년에 종료되었습니다 . 이는 CiviCRM이 안전하지 않고 오래된 Symfony 버전으로 구축되었음을 의미합니다. 이것만으로도 최소한 버전 2.8의 업데이트가 필요하다는 것을 확신시키기에 충분해야합니다. Drupal8에 관한 것이 아닙니다.
Berdir

1
@DavidSnopek 맞아, 당신이 당신의 대답에 쓴 것은 기본적으로 내 의견에서 언급 한 것이지만 CiviCRM의 composer.json이 심포니 구성 요소에 대해 "~ 2.5.0"인 한 작동하지 않습니다. github.com/civicrm/civicrm-core/blob/master/composer.json을 참조하십시오 . 그래서 내 대답 "당신은 두 개의 다른 버전을 사용할 수 없습니다"는 여전히 올바른 IMHO입니다, 당신은 시민의 버전 제약을 개선 / 업데이트 한 다음 작곡가를 통해 설치하고 동일한 버전을 사용할 수 있습니다.
Berdir

1

이론적으로 여기서 유일한 문제는 파일 위치와 클래스 네임 스페이스입니다. 불행히도 내가 작곡가에 대해 알고있는 유일한 도구는 VERSION 당, 패키지 이름별로 지정할 수 없습니다.

완전히 별도의 오토로더로 설정해 보셨습니까?


무슨 뜻인지 더 자세히 설명해 줄 수 있습니까?
jackrabbithanna

getcomposer.org/doc/faqs/… 는 사용자 정의 위치를 ​​수행하는 방법입니다. 나는 사람들이 이것을 가능하게하기 위해 프로젝트를 포크하는 것을 보았습니다 ... 또한 작곡가의 자동 로더를 별도로 유지하는 옵션에 대해서는 getcomposer.org/doc/06-config.md#prepend-autoloader . 결국 오토로더는 PHP 파일 일 뿐이므로 원하는 요소에 따라 어느 것을 포함할지 결정하는 고유 한 오토로더를 작성할 수 있습니다.
Ohthehugemanatee


ATM은 Civi를 D8과 함께 설치할 수있는 작곡가 기반 설치 방법이 없습니다. 그래도 어쩌면 이것이 이것을 달성하는 한 가지 방법 일 것입니다. CiviCRM 라이브러리를 가리 키도록 Drupal에 PSR-4 네임 스페이스를 추가하는 등의 질문에서 언급 한 ServiceProvider 객체에 관한 것이 었습니다. '. Civicrm \ Symfony \ ..'를 사용하려면? 작곡가 pls에 대한 나의 무지를 용서하십시오.
jackrabbithanna
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.