Drupal 8.のカスタムモジュールを作成しています。これは、modules/mymod/config/install/field.storage.bloom_stem.bs_Twitter_ac.ymlというファイルでフィールドストレージ構成オブジェクトを定義します。
問題は、モジュールをアンインストールしても削除されないことです。モジュールを再インストールするとクラッシュするので、明らかに取り残されています。
drush -y pm-uninstall mymod
drush cr
drush -y en mymod
例外「Drupal\Core\Config\PreExistingConfigException」とメッセージ「mymodによって提供された構成オブジェクト(field.storage.bloom_stem.bs_Twitter_ac)はすでにアクティブな構成に存在します」
したがって、この構成オブジェクトを手動で削除する必要があるようです。モジュールがアンインストールされるときにそれを削除するいくつかの追加のコードを提供する必要がありますか?
現時点でこれを行う最も簡単な方法は、drush php
(またはcore-cli
)インタラクティブセッションを開きます。
次に使用します:
Drupal::configFactory()->getEditable('system.menu.devel')->delete();
この機能はDrupalコンソール にも追加されます。
設定オブジェクトを削除するためのDrushコマンド:drush config-delete <config_name>
。
次の方法を使用できます。 hook_uninstallで次のコードを使用します
Drupal::configFactory()->reset('field.storage.bloom_stem.bs_Twitter_ac');
OR
ymlファイルに次のような依存関係を置くことができます
dependencies:
module:
- yourmodule
enforced:
module:
- yourmodule
次にdrupalは、Berdirの説明に従ってモジュールをアンインストールすると、この構成を自動的に削除します https://drupal.stackexchange.com/a/173879/10436
drupal console を使用:
$ drupal config:delete 'the_config_to_delete'
Drupal :: configFactory()-> reset()は設定オブジェクトを削除しません。この実行のためにDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()
構成アイテムを削除するために使用できる簡単なモジュールを作成しました。
カスタムモジュールから構成ファイルをアンインストールしようとすると、同じ問題が発生しました。 Webformのカスタム構成ファイルを渡すために使用されるカスタムモジュールがあります。私は完璧ではないので、モジュールをアンインストールし、コードを編集して再インストールできるようにしたいと思っています。 config/install ymlファイルのdependency/enforcedセクションでカスタムモジュール(my_module)を参照した場合、モジュールをアンインストールすると、構成ファイルもアンインストールされます。
langcode: en
status: true
dependencies:
enforced:
module:
- webform
- my_module // reference your module here
Drupalコンソールを使用して、drupal config:delete active config_to_delete
。
drush config-listを使用してリストされたすべての構成を検索し、削除する構成を特定します。以下のコマンドを使用して構成を削除しますdrush config-delete
モジュールがアンインストールされたときに、設定を削除するには hook_uninstall を使用します。
次に、構成を削除します。
function hook_uninstall() {
\Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
私はここに小さな(まだ少しオーバーエンジニアリングされた)Pythonスクリプトを残して、残りの構成を削除します。これはdrush config-delete
に依存しています。
# 'batch_config_delete.py'
# 'drush' has to be available in the current directory
import os
import argparse
import subprocess
MODULES_ROOT = "/var/www/html/MYSITE/web/modules/custom"
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Batch config delete.")
parser.add_argument("-m", "--module", required=True, help="Module name")
args = parser.parse_args()
install_path = os.path.join(MODULES_ROOT, args.module, 'config/install')
for f in os.listdir(install_path):
if f.endswith('.yml'):
config_name = os.path.splitext(f)[0]
print "Delete config:", config_name
subprocess.call(['drush', 'config-delete', config_name])
このように実行する必要があります:
python ../scripts/batch_config_delete.py -m foobar
これらすべての回答では、基になる構成オブジェクトを直接削除することを推奨していますが、正しい方法は、エンティティストレージシステムを介してエンティティを削除することです。
たとえば、ID「大」の画像スタイルがあり、それを削除する場合は、次のようにします。
\Drupal::entityTypeManager()->getStorage('image_style')->load('large')->delete();
このようにすると、コアは、構成が削除される前に「削除前」を、構成が削除された後に「削除」フックを呼び出します。他のモジュールは、さまざまなクリーンアップ操作の実行に依存する場合があります。
Easy Install module を使用して、この構成の問題を回避します。このモジュールは、モジュールのアンインストール中に構成を削除することを許可します。モジュールの構成にenforcedyml内、またはoptionalフォルダー内の構成が追加されていません。
以下のようにdrush config:deleteコマンドを使用してアクティブな構成を削除できますdrush cdel "name of the config"
たとえば、私の場合はdrush cdel dtn_Apple_news.setting
これを実行した後、構成が削除されてからdrush en-y "module name"
インストールするモジュールを取得しました。