web-dev-qa-db-ja.com

Symfonyの異なるバージョンを含むモジュールをインストールするにはどうすればよいですか?

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

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

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

結局のところ、SymfonyのCiviCRMバージョンがDrupalバージョンの前にロードされるため、問題が発生します。

Drupalに同梱されているものとは異なるバージョンのSymfonyを含むDrupal 8モジュールを知っている人はいますか?

最近、ルートヴィヒプロジェクトに遭遇しました。このモジュールを使用すると、 ServiceProviderBase を拡張するクラスに名前空間を登録できます。

Drupal 8バージョンのCiviCRMモジュールに、CivicrmServiceProviderクラスとregister()を定義するCivicrmServiceProvider.phpファイルを含めることは可能ですか?これを機能させるためにコンテナー名前空間を追加するメソッド?

多くのCiviCRMファイルには、Symfonyで始まるDrupalのようなuseステートメントがあります here のように。

実際にCiviCRMコアをDrupal doc_root/librariesフォルダーに配置し、ライブラリモジュールを使用します。

これはCiviCRMのリポジトリですDrupal module 8.x version 、これまでに入手したものを誰かが見たい場合。誰かがこのための魔法のエリキシルを持っている場合、私たちのコミュニティにはたくさんの幸せな人々がいると言えるでしょう。ですから、私たちを助ける方法を知っているなら、ぜひやってください。

CiviCRMはインストールされ、CiviCRMページは機能します。機能しないのは、CiviCRMをインストールした後、admin/modulesページから他のモジュールをインストールできないことです。私が知る限り、それは壊れている唯一のものです。また、Crushをインストールした後、Drushでモジュールをインストールしても機能します。

CiviCRMのインストール後に別のモジュールをインストールしようとすると、次のエラーが発生します。

PHPの致命的なエラー:/var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.phpの206行目の未定義のメソッドSymfony\Component\DependencyInjection\Definition :: setFactory()の呼び出し

Drupal 8.3.5にあります。Drupal 8のCiviCRMをクリーンにインストールしようとすると、Drupal 8.4-devインスタンスが原因で次のエラー:

Drupal\Component\Serialization\Exception\InvalidDataTypeException:予約済みインジケーター "@"は単純なスカラーを開始できません。 8行目でスカラーを引用する必要があります( "arguments:[@string_translation、@ civicrm.page_state]"の近く)。 Drupal\Component\Serialization\YamlSymfony :: decode()内(/var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.phpの40行目)。

17
jackrabbithanna

したがって、CiviCRMがDrupal 8 via composer(ie。composer require civicrm/civicrm-core in Drupal = root)とCiviCRMによるSymfonyの使用はSymfony 2.8または3.xと互換性があり(非推奨の機能を使用していない)、これは機能する可能性があります。

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

おもう?

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

大きなアイデア:

composerは多くの人にとって非常に新しいので、私はいくつかの高レベルのcomposer stuff all 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
  • アプリケーションが新しいライブラリを必要とする場合、composerは、アプリケーションに必要なすべてのもの(既にインストールされているすべてのライブラリとそれらの依存関係を含む)と新しいライブラリの間のバージョン互換性の共通部分を見つけます。すべてを整列させるためにいくつかの更新を行う(または、互換性のあるバージョンの組み合わせが見つからない場合はエラーになる)
  • この場合、CiviCRMはライブラリであり、特定のDrupal 8サイトがアプリケーションです(Drupalコア自体がライブラリです)。
  • CiviCRMはcomposer.jsonでSymfony ^2.5を「必要としている」と言うことができます。これは、バージョン2.5.0から3.0.0まで(ただし、含まない)と互換性があることを意味します
  • Drupal 8サイトがCiviCRMを使用したい場合、サイト管理者はcomposer require civicrm/civicrm-coreを使用してCiviCRMライブラリとそのすべての依存関係を要求します。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のようなcomposerベースのCMSでライブラリとして使用できるようにします(ただし、他の人は将来的にこのように移動する可能性があります-composerは非常に人気が高まっています)
  2. CiviCRMコアがSymfony 2.8および3.0(Drupal 8.3.xおよび8.4.xでそれぞれ使用される)と互換であることを確認しますが、「公式にテスト用のcomposer.lockと配布用のtarballでサポートされているバージョン(現在はSymfony 2.5)。複数のSymfonyバージョンとの互換性は、思ったほど難しくない場合があります。Symfony2.8と3.0の両方と互換性のあるライブラリが多数あります。 。非推奨のメソッド/クラス/機能を回避するだけの問題かもしれません!composer.jsonはこれを反映するように更新する必要があります
  3. composerを使用して、CiviCRMライブラリをDrupal 8にライブラリディレクトリにコピーするのではなくインストールします。これは、サードパーティをインストールする通常の方法になりますPHPライブラリーDrupal 8(これはDrupal Commerceなどで広く使用されています)

作曲家ベースのCMSの場合、これはまさに正しい方法だと思います。この問題は現在SymfonyとDrupalに影響を及ぼしていますが、PHPコミュニティがcomposerを介してますます多くのサードパーティライブラリを使用するようになるため、他のバージョンの競合を伴う他のCMSに非常によく影響する可能性があります。

テストするいくつかの作業コード:

だから、約束どおり、私は実際にこれを限られた程度で機能させました:-)私は完全にDrupal/Composer/Symfonyの観点からこれに来ています-CiviCRMの経験はあまりないので、おそらくいくつかあります以下の私のプロセスを実行するより良い方法。アドバイスは大歓迎です!

  1. ダウンロードしてインストールDrupal 8.3.5(またはDrupal 8.4.x!
  2. シェルのルートディレクトリに移動し、次のコマンドを実行して、composerを介してCiviCRMをインストールします。 https://Gist.github.com/dsnopek/56311dbea347874e75180883efabb62
  3. Apacheを使用している場合は、vendor/.htacessファイルを削除します。これはDrupalのセキュリティ対策であり、CSS/JSなどのリソースが読み込まれないようにします。 Drupalプロジェクトとのコラボレーションが必要です。適切な解決策を見つけるには、このファイルを完全に削除することは本番環境では悪い考えです。参照してください。- vendor/.htaccessブロッキングCSS/JS composer libraries からのアセット。
  4. / modulesディレクトリに移動し、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はDrupalからのSymfony 2.8およびDrupalのベンダーディレクトリの依存関係を使用しており、独自のベンダーディレクトリから何もロードしていません。Huzzah!

これらの変更の前に失敗した「電話」モジュールの有効化をテストしましたが( 再現するための私の手順 を参照)、それらで正常に動作します。 :-)

8
David Snopek

これは可能ではないと思います。

Drupal 8.4は実際にはすでにSymfony 3に切り替えられていますが、Drushに関連する同様の議論があり、同じ問題があります。 Drush 8.xがインストールされないDrupal 8.4.xおよびDrushマスターがインストールされないDrupal 8.3.x および symfonyコンポーネントは3.2.6に更新されます

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

5
Berdir

理論的には、ここでの唯一の問題は、ファイルの場所とクラスの名前空間です。残念ながら、私がcomposerで知っている唯一のツールでは、パッケージ名ごとにVERSIONごとに指定することはできません。

完全に別のオートローダーとして設定してみましたか?

1