回答:
土地へようこそF特長C onfiguration M anagement、別名FCM!これは、機能だけでなく、構成管理(Drupalバージョン8で導入された)についてでもありません。その代わりに、特殊なケースであるS oftware C onfiguration M anagement別名、SCM。主に、機能はコードジェネレーターと見なすことができますが、生成されたコードは複数の環境を介して移行する必要があります。詳細をお読みください。
機能の使用は、機能のコンテンツをどのようにパッケージ化(構成)するかはご自身の想像次第です。ここで使用できるテクニックをいくつか紹介します。
これは非常に単純なパッケージング手法です。すべてが単一の機能にパッケージ化されます(「神」機能と呼ばれるものもあります)。簡単、かなり前向き、などのように見えますが、この手法は「コンフリクト」(以下で説明)を多かれ少なかれすぐに導きます...
これの良いユースケースは、「Drupalディストリビューション」を作成するときです。その場合、そのすべてのユーザーは同じモジュール、設定などのセットを使用すると想定されます。 「機能」...)、以下で説明するように、このような機能を複数の機能に分割する方が適切と思われます。
このパッケージ化手法により、次のようなWebサイトの機能ごとに個別の機能が作成されます。
このパッケージ化手法は、サイトの作成に使用されるDrupal Webサイトの(主要な)管理セクションごとに、次のような個別の機能を作成します。
上記のリストは事実上無制限です。最終的には、Drupalの管理メニューオプションごとに1つの機能と考えることもできます。
IMOは、パッケージ機能への最も推奨されるアプローチでもあります。
複数のコンテンツタイプ間でフィールドを再利用すると、かなりの数の競合が発生するようです。たとえば、コンテンツタイプAには、マシン名のフィールドがありますfield_somefield
。これは、まったく同じマシン名のコンテンツタイプBのフィールドとしても使用されますfield_somefield
が、別のフィールドタイプや別のフィールド設定として使用されます。
コンテンツタイプ間でフィールドを再利用しないことにより、この問題を回避できます。「Drupalの相対性モデル」に関する記事の一部であるWrapping Information Architecture and Documentationの表に示されている、コンテンツタイプとフィールドのマシン名の興味深い命名規則を見てください。詳細については、「データベース中心の観点からコンテンツ(タイプ)をモデル化するにはどうすればよいですか?」に対する回答を参照してください。
複数の人が1つのサイトで作業している場合、誰が何に取り組んでいるかに基づいて機能を整理(=個別に作成)することで、競合の量を減らすことができます。この例は、次の例のようになります。
上記のすべてが、何らかの形で機能の使用を容易にするのに役立つはずです。ただし、物事が期待どおりに機能する(設計された)ことを保証するには、基本的にこれらの理由から、適切な環境セット(論理的に関連するDrupal Webサイト)も必要です。
理想的な世界では、これらの論理的に関連するDrupal Webサイトは、次のように構成して使用する必要があります。
明らかに、上記の種類のDrupalサイトのインベントリは理想的な世界のようなものです。開発チームの規模、および/またはそれらを作成および維持するために利用可能な予算に応じて、それらのすべてが使用される(または手頃な)わけではありません。このインベントリは、SCMの分野でのベストプラクティスに基づいてモデル化されており、ほとんどすべての大企業/グローバル企業(銀行、航空会社など)で使用されています。
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で行われます。
Featuresを使用できない、または(まだ)使用したくない場合は、以下のアプローチ/モジュールを拡張して、ある種の代替手段を提供できるものを確認することができます。
これらは、管理UIを介して、Rules、Viewsなどのモジュール(不完全なリスト!)で利用できる(機能という言葉を避けるために)よく知られている機能です。
一部の人々は、可能性のある代替手段としてバンドルコピーモジュールを検討しています。以下のエクスポート/インポートをサポートしています。
複数の開発者が構成を機能に統合している場合、マージの競合が発生する可能性があります。機能コードをレビューするためのガイドラインをいくつか書きましたが、最も重要なのはこれだと思います:
これは何を意味するのでしょうか?つまり、各開発者はコミットする前にコードを確認する必要があります。開発者が用心することなく、意図しないコード変更を防ぐ「魔法」はありません。
git diff
。git diff > blah.patch
、目的の構成変更のみが含まれるようにパッチを手動で変更します。
10dd
、Vimをすばやく使用してパッチの変更を取り除くことができます(たとえば)。featurename.features.field_base.inc
。git commit -a
。これはひどい慣習であり、使用をやめる必要があります。常に明示的に追加してコミットしてください!git rebase
して、機能が最新であることを確認します。git merge -s recursive -X patience
(git 1.7+ iircが必要です)。最後に、パッチレビューまたはプルリクエストのいずれかでトランク/安定版にマージする前に開発者がコードをレビューする必要があるように、開発者に社会的制限を追加することを検討してください。人々は社会的制限に怒っていますが、彼らは自分のコードをレビューしないことに対して自分自身に怒っているべきです。
git add -p
特定のチャンクのみをコミットするために使用する方が適切です。