활성 구성에서 구성 개체를 어떻게 제거합니까?


41

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

'mymod에서 제공 한 구성 객체 (field.storage.bloom_stem.bs_twitter_ac)가 이미 활성 구성에 존재합니다'라는 메시지가있는 'Drupal \ Core \ Config \ PreExistingConfigException'예외

따라서이 구성 객체를 수동으로 제거하는 방법이 필요합니다. 모듈을 제거 할 때 코드를 삭제하는 코드를 더 제공해야합니까?


비슷한 문제인 것 같습니다 : drupal.stackexchange.com/questions/173684/…
othermachines

쉽게 수정에이 모듈을 설치 및 완전하게이 문제를 방지 drupal.org/project/easy_install
Karthikeyan Manivasagam을

답변:


53

현재이 작업을 수행하는 가장 쉬운 방법은 drush php(또는 core-cli)를 사용하여 대화식 세션을 여는 것입니다.

그런 다음 사용하십시오.

Drupal::configFactory()->getEditable('system.menu.devel')->delete();

이 기능은 Drupal 콘솔에도 추가됩니다 .


1
이것은 문제를 완벽하게 해결했습니다. 'system.menu.devel'을`the_setting.you.want.to.delete '로 변경
Eric Steinborn

여러 구성을 제거하는 것은 어떻습니까? 예 :migrate_plus.migration.*
Nic

@Nic 그것은 예쁘지 않지만 다른 질문에 대한 내 솔루션을 확인하여 여러 항목을 삭제하십시오. drupal.stackexchange.com/questions/214132/…
CR47

데이터베이스에 직접 액세스 할 수 있으면 config테이블 에서 문제가되는 항목을 신중하게 삭제하십시오 .
Naidim

30

구성 오브젝트를 삭제하는 Drush 명령 : drush config-delete <config_name>.


다중 사이트의 경우drush -l your.site.domain config-delete <config_name>
muskie9

2
단축 형식은 다음과 같습니다drush cdel <config_name>
Sharique

구성 drush cr을 삭제하면 캐시 된 구성 종속성을 제거하기 위해 나중에 수행해야합니다. 그렇지 않으면 다음과 같은 내용이 표시 될 수 있습니다.Error: Call to a member function getConfigDependencyKey() on null
wilco

13

다음 방법을 사용할 수 있습니다. hook_uninstall에서 다음 코드를 사용하십시오.

Drupal::configFactory()->reset('field.storage.bloom_stem.bs_twitter_ac');

또는

yml 파일에서 다음과 같은 종속성을 넣을 수 있습니다


dependencies:
  module:
    - yourmodule
  enforced:
    module:
      - yourmodule

drupal은 Berdir에 설명 된대로 모듈을 제거 할 때이 구성을 자동으로 제거합니다 https://drupal.stackexchange.com/a/173879/10436


5
최근에 변경되었을 수도 있지만 현재 약간 다릅니다. 종속성 : 시행 : 모듈 :-yourmodule
hw.

1
@hw 귀하의 의견은 매우 중요합니다. 가능한 경우 관련 변경 기록에 대한 링크와 함께 답변에 추가하십시오. 찾을 수 없었습니다.
rudolfbyker

으아 !! 나는 이것을 할 수있는 방법이 있다는 것을 알았지 만 "강제 :"부분을 기억할 수 없었다. 특히 yml 파일로 만들 때 가장 간단하고 깔끔한 방법입니다.
UnsettlingTrend

Drupal은이 접근 방식을 사용하여 모듈을 설치하려고하면 다음 오류를 발생시킵니다. custom_module 모듈은 찾을 수없는 다음 모듈에 의존하므로 사용할 수 없습니다.
John

안녕 존, 당신이 그것을 알아 내지 못한 경우에, 그것은 당신이 잘못된 장소에 모듈 의존성을 두었던 것처럼 들린다. 이 답변에 설명 된 구성은 모듈의 config / install 디렉토리에있는 YML 파일로 이동하기위한 것입니다. OP의 경우 이것은 자신의 config / install / field.storage.bloom_stem.bs_twitter_ac.yml 파일에 있습니다. 대신 모듈의 mymodule.info.yml 파일에 종속성을 넣은 것처럼 들립니다 (모듈을 설치할 수 없음)
Daniel Scott


6

Drupal :: configFactory ()-> reset ()은 구성 객체를 삭제하지 않습니다. 이 달리기Drupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()



2

을 사용하여 Drupal 콘솔을 사용하여 활성 구성을 삭제할 수 있습니다 drupal config:delete active config_to_delete.


1

drush config-list를 사용하여 나열된 모든 구성을 검색 한 다음 삭제할 구성을 식별하십시오. 아래 명령을 사용하여 구성 drush config-delete를 삭제하십시오.


0

여기서 남은 구성을 제거하는 작은 (아직 오버 엔지니어링 된) 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

1
PHP 개발자에게 파이썬 스크립트를 사용하도록 요청하고 있습니까? 조금 어리석은 것 같습니다.
Patrick

0

이 구성 문제를 피 하려면 쉬운 설치 모듈 을 사용하십시오 .이 모듈은 모듈을 제거하는 동안 구성을 삭제할 수 있습니다. 모듈의 구성 이 yml에 적용 되지 않거나 옵션 폴더 에 구성을 추가 하지 않은 경우에도 작동 합니다.

제거 이미지의 구성


0

사용자 정의 모듈에서 활성 구성 제거

사용자 정의 모듈에서 구성 파일을 제거하려고하는 것과 동일한 문제가 발생했습니다. webform에 대한 사용자 정의 구성 파일을 전달하는 데 사용되는 사용자 정의 모듈이 있습니다. 완벽하지 않기 때문에 모듈을 제거하고 코드를 편집하고 다시 설치할 수 있기를 원합니다. config / install yml 파일의 dependencies / enforced 섹션에서 사용자 정의 모듈 (my_module)을 참조하면 모듈을 제거 할 때 구성 파일도 제거됩니다.

   langcode: en
    status: true
    dependencies:
        enforced:
            module:
                - webform
                - my_module // reference your module here

0

이 모든 답변은 기본 구성 객체를 직접 삭제하는 것이 좋지만 올바른 방법은 엔티티 스토리지 시스템을 통해 엔티티를 삭제하는 것입니다.

예를 들어 ID가 "large"인 이미지 스타일이 있고 삭제하려는 경우 다음을 수행해야합니다.

\Drupal::entityTypeManager()->getStorage('image_style')->load('large')->delete();

이렇게하면 코어는 구성을 삭제하기 전에 "사전 삭제"를 호출하고 구성을 삭제 한 후 "삭제"후크를 호출합니다. 다른 모듈은 다양한 정리 작업을 수행하는 데 의존 할 수 있습니다.


0

모듈을 설치 제거 할 때 hook_uninstall 을 사용 하여 구성을 제거하십시오.

그런 다음 구성을 삭제하십시오.

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.