Symfonyの異なるバージョンを含むモジュールをインストールする方法は?


17

私は、CiviCRMプロジェクトの開発者および管理者です。私たちは、Drupal 8バージョンのCiviCRMを作成しようとしてきましたが、長い道のりを歩んできました。私たちは、プロジェクトの主要なブロッカーを見つけようとして、集団キーボードに対して頭を打ちます。

CiviCRMはしばらくの間Symfonyを使用しており、含まれているバージョンはDrupalに同梱されているものとは異なります。

Drupal 8でCiviCRMをインストールすることはできますが、インストール後は他のDrupalモジュールをインストールできません。

どういうわけか、SymfonyのCiviCRMバージョンがDrupalバージョンの前にロードされ、これが問題を引き起こす状況になると信じています。

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のインストール後、admin / modulesページから他のモジュールをインストールできないことです。私が知る限り、それが壊れている唯一のものです。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は、実際には既にSymfony3に切り替えていますが、同じ問題を抱えるdrushに関連する同様の議論がまだあります。2つの異なるsymfonyバージョンをロードすることはできません。統合を壊すか、Drupalを壊します。symfony3はまだ8.4ではないかもしれませんが、symfony2のセキュリティサポートはDrupal8セキュリティサポートの前に終了するため、ある時点で切り替える必要があります
-Berdir

1
良い答えになるかもしれない@Berdir?
クライブ

回答:


8

したがって、CiviCRMが作曲家(つまりcomposer require civicrm/civicrm-core、Drupalルート)を介してDrupal 8にインストールされ、CiviCRMのSymfonyの使用がSymfony 2.8または3.xと互換性がある(つまり、非推奨の機能を使用しない)場合、これは機能すると思います。

これにより、2つではなくDrupalのベンダーディレクトリにすべてがインストールされ、CiviCRMがDrupal 8のSymfonyバージョンを使用することになります(ただし、CiviCRMがそれ以降のSymfonyバージョンと互換性がある場合(Drupalの古いバージョンがバンドルされている場合でも) 6および7およびその他のCMS)で問題ありません。

おもう?

更新:はい、動作します-試しました。:-)私はもともとCiviCRMの問題キュー(CRM-17652)に以下を投稿しましたが、完全を期すためにここに再投稿しています。

大きなアイデア:

作曲家は多くの人にとってかなり新しいので、高レベルの作曲家のものから、CiviCRMで実行できる1つの方法まで、段階を追って説明していきます。

  • Composerを使用すると、アプリケーションは必要なライブラリを要求できます(もちろん、ライブラリは他のライブラリを要求することもできます)。
  • ライブラリには、必要な他のライブラリと互換性のあるバージョンを示すcomposer.jsonファイルがあります(ただし、特定の単一バージョンである必要はありません-通常^2.4.3、最小2.4.3以上(ただし、含む)3.0.0)
  • アプリケーションにはcomposer.jsonがあり、同様に必要なライブラリとさまざまなバージョンとの互換性について説明していますが、その範囲は実際に更新を支援するためのものです。アプリケーションには、個々のバージョンの特定のセットであるcomposer.lockもあります
  • ライブラリには、独自のテストまたは配布用のcomposer.lockを含めることもできます(依存関係をバンドルしてリリースtarballをビルドするなど)が、アプリケーションが特定のライブラリを必要とする場合は無視されます(https://getcomposer.org/doc/02を参照) -libraries.md#lock-file
  • アプリケーションが新しいライブラリを必要とする場合、コンポーザーは、アプリケーションに必要なすべてのもの(既にインストールされているすべてのライブラリとその依存関係を含む)と新しいライブラリのバージョン互換性の共通部分を見つけます。または互換性のあるバージョンの組み合わせが見つからない場合はエラーになります)
  • この場合、CiviCRMはライブラリーであり、特定のDrupal 8サイトはアプリケーションです(Drupalコア自体はライブラリーです)
  • CiviCRMは^2.5、composer.jsonでSymfony を「必要とする」と言うことができます。これは、バージョン2.5.0(ただし含まない)3.0.0と互換性があることを意味します。
  • Drupal 8サイトがCiviCRMを使用する場合、サイト管理者はcomposer require civicrm/civicrm-coreCiviCRMライブラリとそのすべての依存関係を要求するために使用します。CiviCRMがSymfony 2.8と互換性がある場合(Drupal 8.3.xで使用されているように)、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および配布用のtarballで「公式にサポートされている」バージョン(現在Symfony 2.5)を保持します。複数のSymfonyバージョンとの互換性は見た目ほど難しくないかもしれません-Symfony 2.8と3.0の両方と互換性のあるライブラリがたくさんあります。非推奨のメソッド/クラス/機能を回避するだけの問題かもしれません!composer.jsonは、これを反映するように更新する必要があります
  3. ライブラリディレクトリにコピーするのではなく、コンポーザーを使用してCiviCRMライブラリをDrupal 8にインストールします。これは、Drupal 8でサードパーティのPHPライブラリをインストールする通常の方法になりつつあります(これは、たとえばDrupal Commerceで広く使用されています)

作曲家ベースのCMSの場合、これはまさに正しい方法だと思います。現在、この問題は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を使用する場合、vendor / .htacessファイルを削除します。これは、Drupalのセキュリティ対策であり、CSS / JSなどのリソースが読み込まれないようにします。このファイルを完全に削除することは本番環境では悪い考えであるため、適切なソリューションを見つけるにはDrupalプロジェクトとのコラボレーションが必要になります。参照:vendor / .htaccessは、CSS / JSアセットをcomposerライブラリからブロックします
  4. / modulesディレクトリに移動して、 git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
  5. 「拡張」ページ(/admin/modules)に移動し、CiviCRMモジュールをインストールします
  6. Drush経由でdrupalキャッシュをクリア(drush cr
  7. ログアウトし、CRM-19878に従って再度ログインします
  8. CiviCRMは動作します!:-)

このすべての後、CiviCRMはDrupalのSymfony 2.8とDrupalのベンダーディレクトリの依存関係を使用しており、独自のベンダーディレクトリからは何もロードしていません。ハザ!

これらの変更の前に失敗した「Telephone」モジュールの有効化をテストしました(再現する手順を参照しください)が、うまく機能します。:-)


コンポーザーを使用して、このすべてに関連する質問があります... 1つのパッケージでSymfony 2.8を使用し、別のパッケージでSymfony 3.2を使用することは可能ですか
...- jackrabbithanna

Drupal 8/9が実行するSymfonyのバージョンを常に使用する必要があるCiviCRMには、非常に難しい制度上の抵抗があります。
ジャックラビタンナ

1
「コンポーザーを使用して... 1つのパッケージでSymfony 2.8を使用し、別のパッケージでSymfony 3.2を使用することは可能ですか?」->いいえ、PHPは同じ名前の2つのクラスを持つことはできません。これは実際には作曲家のことではありません。
デビッドスノペック

「Drupal 8/9が使用するSymfonyのバージョンを常に使用する必要があるCiviCRMには、非常に難しい制度上の抵抗があります」->上流のCiviCRMコアに必要なのは、コードがDrupalで使用される後のSymfony と互換性があることだけです。それをバンドルしたりデフォルトで使用したりする必要はなく、互換性があるだけです。非推奨のメソッド/クラス/機能を避けてください。
デビッドスノペック

Symfonyの2つのメジャーバージョンを並べて実行することに興味がある理由がわかります。SemVersortaはその必要性を示唆しています。しかし、v2 / v3でSymfonyコンポーネントの大きな帯が似ていること、およびCiviのv2の統合がかなり控えめであることが重要だと思います。だから、私は両方と互換性のあるPHPコードを持っているか達成することについて楽観的です。私見、実際の作業は、配布チャネルとディレクトリ構造の更新です。
ティムオッテン

5

これが可能だとは思わない。

Drupal 8.4は実際には既にSymfony 3に切り替えましたが、同じ問題を抱えるDrushに関連する同様の議論がまだあります。Drush 8.xがDrupal 8.4.xをインストールせず、Drush masterがDrupal 8.3.xインストールせずSymfonyコンポーネントが3.2.6に更新されるを参照してください。

2つの異なるsymfonyバージョンをロードすることはできません。統合を壊すか、Drupalを壊します。symfony3はまだ8.4ではないかもしれませんが、symfony2のセキュリティサポートはDrupal8セキュリティサポートの前に終了するので、ある時点で切り替える必要があります。


まあ..... admin / modulesからモジュールをインストールする以外はすべて機能します。...Drushでモジュールをインストールすると機能します...すべてのCiviCRMページが機能します。だから私はその不可能を確信していません。なぜそれは不可能でしょうか?
ジャックラビタンナ

1
同じクラスの2つの異なるバージョンを同時にロードすることはできません。これは不可能です。このエラーは、私が予想しているとおりに聞こえます。定義クラスの2.5バージョンを最初にロードした後、Drupalがブレークするのは、実際には存在しないメソッドが存在することを想定しているためです。DrupalがSymfony 3に切り替わると、違いが大きくなります。なぜ2.5で動けなくなるのかよくわかりません。2.8はマイナーアップデートであり、下位互換性があるはずです(ただし、逆のことはわかっていません)。それでは、CiviCRMを更新して2.8を要求できるようにすべきでしょうか?
ベルディール

1
私のコメントで述べたように、あなたは私の答えが嫌いだと思いましたが、それは変わりません。あなたが言及したプロジェクトはどれもsymfonyを使用していません(joomalは競合しないかもしれませんが、おそらく最終的にはそうなるかもしれない少数のコンポーネントを使用するようです)ので、それを比較することはできません。同じクラスの2つの競合するバージョンをロードすることは技術的に不可能です。それを変更することはできません。それが、依存関係が複雑なビジネスであり、作曲家が存在する理由です。ライブラリを使用する代わりに、おそらくcomposerを使用して複数のsymfonyバージョンとCiviCRMの互換性を確認する必要があります
-Berdir

2
また、symfony.com / roadmap?version = 2.5 #checkerによると、Symfony 2.5のセキュリティサポートは2015年に終了しました。これは、CiviCRMが安全でない古いバージョンのsymfonyバージョンに基づいていることを意味します。それだけで、少なくともバージョン2.8までの更新が必要であると納得させるのに十分なはずです。Drupal8だけではありません。
ベルディール

1
@DavidSnopek正しい、あなたが答えに書いたものは基本的に私のコメントでも言及したものですが、CiviCRMのcomposer.jsonがそのsymfonyコンポーネントに「〜2.5.0」を指定している限り、それは機能しません。github.com/civicrm/civicrm-core/blob/master/composer.jsonを参照してください。したがって、「2つの異なるバージョンを使用することはできません」という私の答えはまだ正しいです。civicrmのバージョン制約を改善/更新し、コンポーザを介してインストールして同じバージョンを使用することしかできません。
ベルディール

1

理論的には、ここでの唯一の問題はファイルの場所とクラスの名前空間です。残念ながら、それを行うための作曲家で知っている唯一のツールでは、バージョンごと、パッケージ名ごとに指定することはできません。

完全に独立したオートローダーとして設定しようとしましたか?


意味をもっと詳しく説明できますか?
ジャックラビタンナ

getcomposer.org/doc/faqs/…は、カスタムの場所を作成する方法です。これを可能にするためだけにプロジェクトをフォークしている人を見たことがあります...また、composer.autoloaderを個別に保つオプションについては、comcomposer.org / doc / 06-config.md#prepend- autoloaderを参照してください。最終的にオートローダーは単なるphpファイルであるため、好きな要因に応じてどのオートローダーを含めるかを決定する独自のオートローダーを作成できます。
オーテヒュージュマナティー


ATMには、CiviとD8をインストールするコンポーザーベースのインストール方法はありません。多分それはこれを達成するための一つの方法でした。それは、CiviCRMライブラリを指すためにPSR-4名前空間をDrupalに追加するなど、質問で言及されたServiceProviderオブジェクトに関するものでした...私がこれを行った場合、Civiはすべてのファイルを 'use Symfony \ .... 'Civicrm \ Symfony \ ..を使用するには?作曲家plsの私の無知をご容赦ください。
-jackrabbithanna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.