3開発環境で機能モジュールを使用する方法は?


19

Featuresを多用してプロジェクトに取り組んでいるとき、このアプリケーションには3人の開発者がいることがあります。

いくつかのアプローチを試しましたが、gitブランチをマージすると、お互いの機能の変更を「上書き」することが多いようです。競合がたくさんあり、機能モジュールが壊れて使用するのが苦痛になっているようです。

機能は、プロジェクトでの設定のための本当に素晴らしい時間節約であり、私はこれに取り組む方法があると確信しています。

競合や上書きのリスクを減らすワークフローまたは手順はありますか?

機能に関する手がかりは大歓迎です。

回答:


20

土地へようこそF特長C onfiguration M anagement、別名FCM!これは、機能だけでなく、構成管理(Drupalバージョン8で導入された)についてでもありません。その代わりに、特殊なケースであるS oftware C onfiguration M anagement別名、SCM。主に、機能はコードジェネレーターと見なすことができますが、生成されたコードは複数の環境を介して移行する必要があります。詳細をお読みください。

1-機能の使用の長所と短所

機能を使用する利点

  • Drupal開発サイトに適用された変更の1つ以上のターゲットDrupal(事前)実稼働サイトへのデプロイメントを自動化する(手動デプロイメントの代わりに)。
  • Drupal開発者/サイトビルダー間の継続的なDrupal開発の共有(出荷)を促進します(たとえば、別の開発サイトで作業しているDrupal Themerがビューの専門家によって作成されたビューをテーマに使用できるようにします)。
  • (開発サイトの)フィーチャーによって生成されたコードのコピーを選択されたターゲット(事前)本番サイトに出荷するためのGITとDrushの両方との優れた統合。

機能を使用することの欠点

  • 機能の競合の回避および/または機能の依存関係の管理は困難な場合があります!
  • 既存の(運用)サイトで機能の使用を開始するのは簡単ではありません。
  • 機能モジュールのインストール/有効化は簡単ですが(モジュールのみ)、機能の正しい使い方を学ぶことは大きな課題です。

2-機能のパッケージ化の手法

機能の使用は、機能のコンテンツをどのようにパッケージ化(構成)するかはご自身の想像次第です。ここで使用できるテクニックをいくつか紹介します。

単一のスーパー機能

これは非常に単純なパッケージング手法です。すべてが単一の機能にパッケージ化されます(「神」機能と呼ばれるものもあります)。簡単、かなり前向き、などのように見えますが、この手法は「コンフリクト」(以下で説明)を多かれ少なかれすぐに導きます...

これの良いユースケースは、「Drupalディストリビューション」を作成するときです。その場合、そのすべてのユーザーは同じモジュール、設定などのセットを使用すると想定されます。 「機能」...)、以下で説明するように、このような機能を複数の機能に分割する方が適切と思われます。

ウェブサイトの機能に基づいて

このパッケージ化手法により、次のようなWebサイトの機能ごとに個別の機能が作成されます。

  • 機能A =「* Gallery」を実装します。
  • 機能B = " * Blog "を実装します。
  • 機能C =「*イベントカレンダー」を実装します。

Drupal管理セクションに基づく

このパッケージ化手法は、サイトの作成に使用されるDrupal Webサイトの(主要な)管理セクションごとに、次のような個別の機能を作成します。

  • 必要なモジュールはすべて機能Aに含まれています。
  • すべての基本フィールド定義は機能Bに含まれています。
  • すべてのコンテンツタイプは機能Cに含まれています。
  • すべての権限は機能Dに含まれています。
  • すべての役割は機能Eに含まれています。
  • すべての変数は機能Fに含まれています。
  • すべての(カスタム)ビューは機能Gに含まれています。
  • すべての(カスタム)ルールは機能Hに含まれています。
  • 等。

上記のリストは事実上無制限です。最終的には、Drupalの管理メニューオプションごとに1つの機能と考えることもできます。

IMOは、パッケージ機能への最も推奨されるアプローチでもあります。

3-機能やGITの競合の可能性を減らす

フィールドを再利用しないでください

複数のコンテンツタイプ間でフィールドを再利用すると、かなりの数の競合が発生するようです。たとえば、コンテンツタイプAには、マシン名のフィールドがありますfield_somefield。これは、まったく同じマシン名のコンテンツタイプBのフィールドとしても使用されますfield_somefieldが、別のフィールドタイプや別のフィールド設定として使用されます。

コンテンツタイプ間でフィールドを再利用しないことにより、この問題を回避できます。「Drupalの相対性モデル」に関する記事の一部であるWrapping Information Architecture and Documentationの表に示されている、コンテンツタイプとフィールドのマシン名の興味深い命名規則を見てください。詳細については、「データベース中心の観点からコンテンツ(タイプ)をモデル化するにはどうすればよいですか?」に対する回答を参照してください。

誰が何に取り組んでいるかに応じて機能を分割する

複数の人が1つのサイトで作業している場合、誰が何に取り組んでいるかに基づいて機能を整理(=個別に作成)することで、競合の量を減らすことができます。この例は、次の例のようになります。

  • ビューは機能Aに入り、
  • ルールは機能Bに入り、
  • チャートは機能Cに入ります。
  • テーマに関することはすべて機能Dに記載されていますが、

4-推奨Drupal環境

上記のすべてが、何らかの形で機能の使用を容易にするのに役立つはずです。ただし、物事が期待どおりに機能する(設計された)ことを保証するには、基本的にこれらの理由から、適切な環境セット(論理的に関連するDrupal Webサイト)も必要です。

  • 複数の機能によって提供される機能をマージします。
  • 競合を予測して解決します。
  • 競合がないことが認定されているすべてのマージされた機能のエンドユーザーテスト。

理想的な世界では、これらの論理的に関連するDrupal Webサイトは、次のように構成して使用する必要があります。

  1. 個人開発サイト -各Webサイト開発者は、個別の開発サイトを持っています。開発の一部を他の人と共有する準備ができたら、適切な機能が作成され、ステージング環境に出荷されます。
  2. サンドボックスサイト -これは、単一の機能の完全性を単体テストするために使用されるDrupalコアのみを含むDrupal環境です。機能が誤って予期しない依存関係を持っている場合(たとえば、機能が依存しているモジュールで、サンドボックスで有効になっていない場合)、依存関係が明らかになります。
  3. ステージングサイト-1つ以上の機能(開発サイトで作成)が配信される場所です。実稼働上の問題に対する単なる修正プログラムの場合もあれば、Webサイトの新しいリリースのすべての開発が統合される場合もあります。複数の機能間に競合が存在する場合、これが最初に現れる環境であり、何らかの方法で解決する必要があります。
  4. QAサイト -ステージング環境が安定していると見なされたら、関連機能を使用して、QAテスト、受け入れテスト、ボリュームテストなどに使用できる上位レベルでも利用できるようにします。このレベルでは、追加の変更(ある場合)を許可する場合は、非常に注意する必要があります。そのような変更は、この環境ですでに完了した以前のすべてのテスト作業を無効にする可能性があるためです。
  5. シャドウプロダクションサイト -実際のプロダクションでアクティベーションを準備するには、まず実際のプロダクション環境のコピー(シャドウ)と見なされる環境に関連機能をさらに促進する必要があります。移行プロセスのこの時点でまだ何かが壊れている場合、それは以前の手順の一部を元に戻すための赤い旗です。すべての関係者が変更を承認するまで、修正してから再試行してください。
  6. 本番サイト -前のステップをすべて完了した場合、このステップは自明であり、非常に簡単です。ニーズに応じて、これは単一のサイト、または関連するすべてのサイトがすべての機能のまったく同じバージョンを実行しているDrupalのマルチサイトに相当するものになります。
  7. ベースラインサイト -私の経験では、このタイプのサイトが(また)使用されているDrupal実装は(もしあれば)多くありません。本番サイトの単なるコピーですが、本番サイトの外観を確認したり、ユーザートレーニングを実行したりするために使用できるDrupal開発者、テスターなどが利用できます。サイクルが開始されると、影響を受ける(変更する必要がある)サイトのコンポーネントは、このベースラインサイトを入力として使用し、ターゲットとしてPersonal Development Siteを使用して「コピー」する必要があります

明らかに、上記の種類のDrupalサイトのインベントリは理想的な世界のようなものです。開発チームの規模、および/またはそれらを作成および維持するために利用可能な予算に応じて、それらのすべてが使用される(または手頃な)わけではありません。このインベントリは、SCMの分野でのベストプラクティスに基づいてモデル化されており、ほとんどすべての大企業/グローバル企業(銀行、航空会社など)で使用されています。

5-関連モジュール

強い腕

StrongARMのモジュールは、機能モジュールと(変数でその設定を保存モジュール)変数をエクスポートすることを可能にします。

ノードのエクスポート

ノードのエクスポートモジュールは、エクスポートノードにユーザを可能にし、別のDrupalのインストールにインポートします。

ロールのエクスポート

ロールエクスポートモジュールは、ロールはmachine_namesを持つことができ、およびマシン名のオフに基づいて一意のロールID(RID)を生成します。役割は機能とともにエクスポートでき、他のサイトにインポートされた場合、まったく同じ削除を取得できます。

機能を追放

追放機能モジュールが完全にUIを特徴と輸出を備えてから個々の機能成分を除くことを可能にします。プロジェクトページからの引用です。

 このモジュールは、決してエクスポートされないようにする機能コンポーネントがある場合に役立ちます。サイトの構築や展開に機能を使用している場合、おそらく誰かが誤ってcron_lastやupdate_last_checkのようなタイムスタンプ変数をエクスポートしてしまうという問題に遭遇したでしょう。また、開発者がエクスポートしたいサイト許可の残りに追いつかないように、開発者モジュールの許可を破棄することもできます。追放されたアイテムは、機能モジュールやその他の機能モジュールに表示されないため、注意して使用してください。決してエクスポートしてはならない機能の中央リストについては、https://www.drupal.org/node/2400531を参照してください。

豆のモジュールは、あなたのブロックをエクスポート可能になります。プロジェクトページからの引用です。

Beanを新しいタイプ(コンテンツタイプであるノードと比較して)を提供するメソッドと考えてください。このメソッドは、必要な数のブロックを作成するコンテンツ追加インターフェースを提供します(下のスクリーンショットを参照)。Beanコンテンツは、他のブロックと同様にサイトの周囲に配置できます。

このモジュールは、UUIDおよびUUID機能統合モジュールと組み合わせても優れた機能発揮します。このモジュールはD7の時点でのみ起動しましたが、すでにDrupal 8コアに含まれています。ビデオチュートリアルDrupal Beanモジュールチュートリアル-Bean Admin UIの使用は、このモジュールのパワーと、それを使ってできること(サイトコーディングテクニックのみを使用し、カスタムコーディングを使用しないこと)を本当に理解するための優れた入門書です。

生息地

生息地の中にモジュールが最も理にかなっていますベースのワークフローを。プロジェクトページからの引用です。

複数環境のセットアップ(prod、test、dev、localなど)では、特定の環境で常に有効または無効にするモジュールがいくつかあります。データベースを同期するたびに、同じモジュールを再度有効/無効にする必要があります。さらに悪いことに、あなたは怠け者になり、本番環境で開発モジュールを有効にしておきます。

Habitatは、各環境(habitat)で特定のモジュールを有効または無効にする設定を提供します。例えば、$ conf ['habitat'] = 'local';で変数を設定するだけです。settings.phpファイルで使用します(そこで使用する実際の変数は、現在のワークフローに対して構成可能です)。モジュールの無効化/有効化は、hook_initで行われます。

6-推奨リソース:

7-機能の使用に代わるもの

Featuresを使用できない、または(まだ)使用したくない場合は、以下のアプローチ/モジュールを拡張して、ある種の代替手段を提供できるものを確認することができます。

手動エクスポート/インポート

これらは、管理UIを介して、RulesViewsなどのモジュール(不完全なリスト!)で利用できる(機能という言葉を避けるために)よく知られている機能です。

バンドルコピー

一部の人々は、可能性のある代替手段としてバンドルコピーモジュールを検討しています。以下のエクスポート/インポートをサポートしています。

  • ノードタイプ。
  • 分類。
  • ユーザー。
  • フィールドAPIフィールド。
  • フィールドグループ。

1
私が今まで見た中で最高の答え。
いいえSssweat

@NoSssweat Merciの称賛...しかし、私はそれがまだかなり不完全であると考えることを知っています。例えば、処理機能の「ライフサイクル」についてはほとんど何も含まれておらず、影響分析、監査、リリース管理、承認などのことについてはまだ多くを語っていません。
-Pierre.Vriens

1
@ Pierre.Vriens-ありがとう!私はあなたの優れた答えと同じように難しい結論に達したと思います。コンポーネント(views_views、依存関係など)で分割する方法を試しましたが、機能を生成しようとしたときに競合が発生していました。->後->依存関係をチェックせず、競合を無視するように機能を構成する必要があることを認識しました。
-stefgosselin

7

複数の開発者が構成を機能に統合している場合、マージの競合が発生する可能性があります。機能コードをレビューするためのガイドラインをいくつか書きましたが、最も重要なのはこれだと思います:

意図したコード変更のみをコミットします。

これは何を意味するのでしょうか?つまり、各開発者コミットする前にコードを確認する必要があります。開発者が用心することなく、意図しないコード変更を防ぐ「魔法」はありません。

  • でコードの変更を確認しますgit diff
  • を使用してクイックdiffパッチを作成しgit diff > blah.patch、目的の構成変更のみが含まれるようにパッチを手動で変更します。
    • 「mtime」などの情報、情報ファイル内のビューのエクスポート内のコメントは、コミットに含める必要はありません。
    • 私は、構成コードの差分のブロックを時間の経過とともにレビューすることに非常に精通しています。ビューやパネルの余分な変更を簡単に見つけることができるようになり10dd、Vimをすばやく使用してパッチの変更を取り除くことができます(たとえば)。
    • 「ああ、ちょっと、フィールドとは何も変えなかったので、コミットしません」と思いますfeaturename.features.field_base.inc
  • 決して使用しないでくださいgit commit -a。これはひどい慣習であり、使用をやめる必要があります。常に明示的に追加してコミットしてください!
  • ローカル gitブランチで使用git rebaseして、機能が最新であることを確認します。
  • Gitマージ戦略は、実際にマージを行うときにも役立つ場合があります。
    • git merge -s recursive -X patience (git 1.7+ iircが必要です)。

最後に、パッチレビューまたはプルリクエストのいずれかでトランク/安定版にマージする前に開発者がコードをレビューする必要があるように、開発者に社会的制限を追加することを検討してください。人々は社会的制限に怒っていますが、彼らは自分のコードをレビューしないことに対して自分自身に怒っているべきです。


パッチファイルを生成するよりも、git add -p特定のチャンクのみをコミットするために使用する方が適切です。
ドンキホーテ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.