開発リリースしかなかったモジュールに新しいモジュールの依存関係を追加するためのプロトコルは何ですか?


7

私は少し前にモジュールを作成しましたが、先月かそこらのDrupal.orgでの7.x-1.x-devリリースしかありませんでした。このモジュールについてはすでにいくつかのダウンロードとインストールが報告されているので、このモジュールをすでに使用している少数のユーザーが、私が作成する必要がある次の開発リリースでも考慮されるようにしたいと思います。新しいリリースには、別のプロジェクトからの新しいモジュール依存関係があります(つまり、私のモジュールのサブモジュールとして含まれていません)。モジュールが安定したリリースである場合、私は通常2.xバージョンを作成しますが、それは開発段階にあります。1.x-devに新しい依存関係を追加するか、2.x-devを作成するだけですか?


アップグレード用のドキュメントを作成
monymirza '25 / 01/13

これについては、変更ログとアップグレードドキュメントを使用する予定です。これは問題ではありません。ユーザーが更新前にこの情報を読んでくれることを望んでいるように、多くの人はそうではありません。モジュールはdevにあるので、人々はそれが彼らのサイトを壊すことを期待するべきです、しかし私は先に進む前にこれのためのプロトコルがあることを確認したいです。
Nigel Waters

回答:


3

そのような場合のための認可されたプロトコルはありません。私が考えるすべては影響を最小にすることです。

新しいブランチを作成しても、ユーザーは更新して新しい依存関係があることに気付かず、依存関係が満たされていないためにモジュールが黙って無効になってしまう可能性があることを考慮してください。これは、ctoolsへの依存関係が追加された6.x-2.xから6.x-3.xへのビューの更新で発生しました。その場合、ctoolsが通常存在するため、影響は軽微でした。

ドキュメントでは、プロジェクトページの変更ログまたはアップグレードドキュメントに加えて、リリースノートに追加することをお勧めします。Drushで更新すると簡単に読めるので。

最後に、導入する依存関係が一般的なモジュールである場合、hook_update_Nで新しい依存関係を有効にするか、利用できない場合はエラーを発生させることで、影響を軽減できます。これが未テストのコードです。

<?php
function MODULENAME_update_7001() {
  $enabled = module_enable(array('foo', 'bar'));
  if (!$enabled) {
    throw new DrupalUpdateException('foo required.');
  }
}

0

@ジョンハッタンが述べたこととは別に、それを行うためのもう1つの方法を提案します。これらの依存関係をmymodule.infoファイルに追加します。リンク、電子メール、アドレスフィールドに新しい依存関係を追加したいとします。

dependencies[] = link
dependencies[] = email
dependencies[] = addressfield

現在、hook_requirmentsでは、存在する場合、モジュールを自動的に有効にしようとします。infoファイルに依存関係を追加したので、初めてインストールしたときに依存関係が有効になることに注意してください。しかし、そうでなければ、それらは「ロックされた」ように見えます。この場合、それらを自動的に有効にする必要があります。@jonhattanが応答したので、hook_update_Nでそれを試み、失敗したときに例外をスローできます。

しかし、上記の方法の問題はユーザーエクスペリエンスです。例外メッセージに「リンク」を出力することはできません。もう1つは、更新が試行される直前にユーザーに通知することで簡単に回避できることです。そのような場合のために、hook_requirementsがあります。

私が言及した例の場合にhook_requirementsを使用する方法の例を提供します。

/**
 * Implements hook_requirements.
 */
function mymodule_requirements($phase) {
  $requirements = array();
  if ($phase == 'update') {
    $enabled = module_enable(array('link', 'email', 'addressfield'));
    if( !$enabled ) {
      $t = get_t();
      $requirements['mymodule_migrate'] = array(
        'title' => $t('Mymodule Migrate Issues'),
        'value' => $t('One or more of the required modules cannot be enabled.
          If you download the modules from Drupal.org those would be enabled automatically when update script is run.
          So Please make sure following modules are present: !link, !email & !addressfield',
          array(
            '!link' => l('link', 'https://drupal.org/project/link'),
            '!email' => l('email', 'https://drupal.org/project/email'),
            '!addressfield' => l('addressfield', 'https://drupal.org/project/addressfield'),
          )
        ),
        'severity' => REQUIREMENT_ERROR,
      );
    }
  }
  return $requirements;
}

これで、各モジュールを個別に有効にしてメッセージを適切に作成し、存在しないモジュールのみがメッセージに表示されるようにすることもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.