설치된 모듈을 / sites / all / modules / *에서 / sites / all / contrib / modules / *로 이동하는 방법


34

나는이 질문에 대한 답을 전혀 운없이 찾지 못했습니다. 데이터베이스 구조에서 관찰 한 것부터 모듈 위치는 '시스템'테이블에 지정되어 있습니다. 내가 가진 유일한 해결책은 'filename'열을 업데이트하기 위해 SQL 쿼리를 작성하는 것입니다.

예를 들어 contrib 모듈과 같이이 문제를 해결하는 데 더 나은 / 더 깨끗한 솔루션이 있습니까?

답변:


27

모듈을 새 위치로 옮기고 레지스트리를 다시 빌드하기 만하면됩니다. 레지스트리가 다시 빌드되면 모듈 경로가 업데이트됩니다. 확인하십시오 registry_rebuild().

모듈에서 모든 코드를 다시 스캔하거나 디렉토리를 포함하여 데이터베이스에서 각 인터페이스 또는 클래스의 위치를 ​​저장합니다.

그러나 이것을 테스트하기 전에 데이터베이스를 백업하는 것이 좋습니다.

drush를 사용하는 경우 다음 명령을 사용하여 레지스트리를 다시 작성할 수도 있습니다.

drush cc registry

registry_rebuilddrush 명령을 설치할 수도 있습니다 .

// install registry_rebuild
drush dl registry_rebuild
// rebuild the registry
drush rr

내가 올바르게 이해하면 registry_file테이블을 자를 수도 있습니다. 드루팔은 모든 파일을 다시 스캔하고 테이블을 다시 작성해야합니다.
— Cyclonecode

3
테이블을 자르면 나쁜 생각처럼 들리며 사이트가 완전히 손상 될 가능성이 큽니다.
— Berdir

@ Berdir-그것이 나쁜 생각처럼 들린다는 데 동의하십시오. 그러나 방금 시도했지만 작동하는 것 같습니다. 우선 백업을 가져다 사용하여 전체 테이블을 절단 DELETE FROM registry_file;과에 전화를 추가 rebuild_registry()내에서 page.tpl.php.
— Cyclonecode

이것은 너무 복잡 합니다. John Laine이 말한 것을 수행 하십시오. 항상 나를 위해 일했습니다.
— Jim Kirkpatrick

1
@JimKirkpatrick-당신은 바로 모듈을 비활성화 할 필요가 없습니다.
— Cyclonecode

10

로컬에서 프로덕션에서 백업을 복원하고 사물을 이동하고 관리 / 모듈을 누르거나 registry_rebuild ()를 실행하려고 시도했지만 치명적인 오류가 발생하는 것을 막지는 못했습니다. 일부 모듈은 자신의 hook_init ()에 include 또는 무엇이든 사용할 수 있거나 모듈에 의존하거나 Drupal이 부트 스트랩에서 찾을 수없는 메뉴 라우터 경로 세트를 가질 수 있기 때문에 나에게 의미가 있습니다. 궁극적으로 이것은 내가 한 일입니다 (경로가 다를 수 있음).

1 단계 : 사이트 / 모든 / 모듈을 사이트 / 모든 / 모듈 / contrib으로 교체

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');

2 단계 : 사용자 지정 네임 스페이스 모듈에 대해 사이트 / 모든 / 모듈 / 검색을 사이트 / 모든 / 모듈 / 사용자 정의로 교체

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE filename LIKE '%my_custom_namespace_%';

3 단계 : dev 모듈을 sites / all / modules / dev로 이동

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE filename LIKE '%devel%';

4 단계 : 캐시가 지워 지므로 제대로 부트 스트랩됩니다.

TRUNCATE TABLE cache
TRUNCATE TABLE cache_bootstrap
TRUNCATE TABLE cache_menu
TRUNCATE TABLE cache_page
TRUNCATE TABLE cache_path

참고 : 403 (액세스 거부)을 처리하기 위해 사용자 정의 모듈 또는 LoginToboggan과 같은 구성 요소를 사용하고이 프로세스 중에 로그 아웃 한 경우 포함 파일의 새 경로를 사용하도록 테이블 의 include_file열 을 업데이트해야 menu_roter합니다. . 아마도 드물게 발생합니다.

UPDATE menu_router SET include_file = 'sites/all/modules/custom/my_custom_namespace/includes/foo.inc' WHERE path = 'access-denied'

이러한 쿼리가 실행되면 (분당 초만 소요됨) admin / config / development / performance를 실행하고 메뉴 경로가 다시 작성되도록 캐시를 지우십시오.


감사합니다! 나는 최고의 답변에 언급 된 단계를 시도했지만 내 경우에는 도움이되지 않았습니다. Pantheon에서 호스팅하는 사이트의 모든 사용자가 귀하의 답변에 이러한 db 문을 수행 한 다음 "drush registry-rebuild"및 "drush cc registry"
— Anne Bonham

Pantheon에서는 Redis 모듈로 사이트를 만들 수 없었지만 sites / all / modules를 제외하고 루트 모듈 폴더 에이 모듈을 포기했습니다. 아 잘-적어도 내 다른 모듈은 잘 정리되어 있습니다.
— Anne Bonham

LoginToboggan을 사용하는 사용자에게는 다음과 같은 3 가지 MySQL 명령이 필요합니다.update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.admin.inc' WHERE path = 'admin/config/system/logintoboggan'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'toboggan/revalidate/%'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'user/validate/%/%/%';
— tyler.frankenstein

9

Mark Sonnabaum : Drush Rebuild Project Paths 의 멋진 도구를 사용해보십시오 . 프로세스를 자동화합니다. 나를 위해 일했다. 물론 Drush를 사용합니다 .

그래도 사이트 데이터베이스 복사본에서 시도해 볼 것을 제안합니다.


7

기록을 위해 레지스트리를 다시 작성하는 훌륭한 drush 명령이 있습니다 : http://drupal.org/project/registry_rebuild

프로젝트 페이지에는 많은 정보가 있습니다.


이것은 모듈을 이동시키는 가장 선호되는 방법입니다. 하위 디렉토리 sites/all/modules로 이동 contrib해야하는 일부 모듈이 활성화되었습니다 . 모든 내가해야했다drush dl registry_rebuild; mv OLD_PATH/module NEW_PATH/module; drush rr
— Sumeet Pareek

이것은 나를 위해 일했습니다. 모든 모듈을 먼저 옮기고 registry_rebuild를 수행했습니다.
— gerl

흥미롭게도 drush rr --fire-bazooka오류가 발생하지만 문제 drush rr는 없습니다.
— Alex Skrypnyk

5

첫째, 항상 데이터베이스를 백업하십시오. 따라서 간단한 작업으로 인해 문제가 발생하여 백업하지 않은 경우 스스로 쫓아 낼 수 있습니다.

모듈을 비활성화할지 여부는 중요하지 않습니다. 만일을 대비해서하고 싶을 수도 있습니다. 그런 다음이 작업을 수행하십시오.

  1. (sitename) / admin / config / development / maintenance에서 사이트를 유지 보수 모드로 설정하십시오.
  2. 파일 시스템에서 모듈을 실제로 이동하십시오.
  3. (sitename) / admin / config / development / performance에서 캐시를 지우거나 모듈 페이지를 다시 저장하십시오.

다 했어요! Drupal은 설치된 모든 모듈을 다시 검색합니다.


유지 관리 모드의 경우 +1, 다음과 같은 작업을 수행하기 전에 항상이 작업을 수행하는 것이
— 좋습니다

1
이로 인해 치명적인 오류가 발생합니다. 의존성 또는 무언가가없는 모듈을 이동하면 작동 할 수 있습니다.
— ergophobe

4

Registry Rebuild 모듈 을 사용해보십시오 . 그것은 나를 위해 매번 작동했습니다.

다음은 모듈의 프로젝트 페이지에서 인용 한 것입니다.

Drupal 7에는 레지스트리가 절망적으로 빠져서 레지스트리 (PHP 클래스 및 파일과 함께 제공되는 파일 목록)를 다시 작성해야 할 때가 있습니다. 그러나 시스템이 부트 스트랩을 시도 할 때 일부 클래스가 필요하기 때문에이 정기적 인 캐시 지우기 활동을 수행 할 수없는 경우가 있습니다.


이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다. 링크 한 모듈 사용을 포함하여 모듈을 이동하는 절차가있는 경우 설명하십시오.
— Mołot

이론이 없습니다 ... 효과가 있습니다. 페이지의 지시 사항을 따르십시오. 나는 drush 방법을 사용했으며 방금 작동했습니다.
— iLLin

3

명령을 통해 Drush와 통합되는 Registry Rebuild 모듈을 사용할 수 있습니다 Drush RR.

기본적으로 다음 단계를 수행하십시오.

  1. 모듈을 다른 디렉토리로 옮기고
  2. 그런 다음 레지스트리 재 구축은 시스템 테이블을 재 구축하여 올바른 위치에 모듈을 가져옵니다.

먼저 DrupalEasy Podcast # 133을 통해이 모듈 / 드 러쉬 cmd를 사용하는 방법을 자세히 설명했습니다.

추신 : 물론, 먼저 사이트 백업을 수행하십시오 ...


3
나는 이것을 두 번째로한다. 사이트를 백업하십시오. 모든 모듈을 새 폴더로 이동하십시오. drush에서 레지스트리 재 구축을 실행하거나 지침을 따르고 포함 된 PHP 파일로 이동하여 실행하십시오. 단순한.
— Collins

2

/ admin / build / modules를 방문하면 시스템 테이블의 경로가 다시 작성됩니다. 때로는 drupal이 더 이상 부트 스트랩을 만들 수 없으므로이 경우이 솔루션이 작동하지 않습니다. 작동하지 않으면 이전 답변에서 설명한 것처럼 Drush Rebuild Project Paths 를 사용할 수 있습니다 . 부트 스트랩을 끊기 전에 새로운 drush 명령을 추가해야합니다. 새 명령을 추가하려면 readme 의 COMMANDS 섹션을 확인하십시오.


2

drush dl모듈 디렉토리 문제로 인해 작동하지 않는 데 문제가있었습니다 . 일반적으로 작업을 수행하기 위해 간단히 붙여 넣을 수있는 스택 답변을 좋아합니다. 여기에 적절한 사이트 디렉토리에있는 경우 Drush Rebuild Registry를 설치하고 사이트에서 실행하는 몇 줄이 있습니다.

pushd ~  # good if drush on your site is broken because of moved modules
drush dl -y registry_rebuild
popd 
drush rr

2

나는 진정한 drupal-esk 답변을 100 % 확신하지 못하지만 내 경험에 따르면 :

서버에 FTP로 연결할 때 실수로 내 사용자 정의 모듈 폴더 중 하나를 다른 사용자 정의 모듈 폴더로 옮겼습니다. 그들은 여전히 ​​일했다. Drupal은 다른 모듈의 폴더에있는 동안에도 별도의 모듈로 인식 한 것 같습니다. 모듈을 비활성화하지 않아도됩니다.

**이 모듈에는 .install 파일이 없으므로 중요한지 확실하지 않습니다.


설치 파일은 모듈 설치 중 호출 된 절차에만 사용되며 요구 사항은 아닙니다. / sites / all / modules 아래에 폴더 구조를 가질 수 있기 때문에 drupal은 .info 파일을 재귀 적으로 찾습니다.
— gbyte.co

명확하게 해주셔서 감사합니다! 설치 파일에 대해서는 알고 있었지만 .info 파일을 검색하는 drupal의 재귀 프로세스는 몰랐습니다. 나는 그들이 어떤 하위 폴더에 있는지 중요하지 않다고 생각했지만 확실한 대답을하는 것이 좋습니다!
— Exziled

1

Drupal 배포판은 이것을 잘 처리하지 못하기 때문에 최근 Panopoly 사이트 에서 Entity API 사본을 실수로 sites/all/끝내면 아무것도 작동하지 않습니다. 레지스트리 재 구축, 모듈 페이지 및 기타로드로 인해 치명적인 오류가 발생했습니다.

Panopoly의 많은 다른 모듈에 필요한 Entity API와 같은 것을 이동 해야하는 경우 모듈을 비활성화하는 것은 간단하지 않습니다.

이 문제를 해결하려면 Entity API의 경우 다음과 같이하십시오.

  1. 시스템 테이블에서 경로를 업데이트하십시오.

    UPDATE `system` 
      SET `filename` = REPLACE(
        `filename`, 
        'sites/all/modules/entity', 
        'profiles/panopoly/modules/contrib/entity'
      );
  2. 그런 다음 레지스트리를 다시 빌드하십시오.

    drush rr

1

드루팔 7

우선 시도하십시오 drush rr.

작동하지 않으면 파일을 이동 한 후 Drupal 루트 디렉토리에서 다음 Drush 명령을 시도하십시오.

drush sqlq "TRUNCATE cache; TRUNCATE cache_bootstrap;"
php -r "define('DRUPAL_ROOT', getcwd()); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); registry_rebuild(); registry_update(); cache_clear_all();"
drush -y cc all

위의 방법으로 문제가 해결되지 않으면 경로에 대한 기존 정보가있는 테이블을 찾으십시오.

drush --ordered-dump sql-dump | grep "sites/all/modules" # Change the path to the old one.

아무것도 발견되지 않으면 외부 캐시임을 의미합니다.

그렇다면 다시 시작하는 것을 잊지 마십시오 (예 :

killall -HUP memcached
drush eval "function_exists('xcache_clear_cache') && xcache_clear_cache();"

더보기 : Drupal에서 캐시를 지우는 데 어떤 방법이 사용됩니까?


또는 파일을 이동 한 후 다음 MySQL 쿼리를 시도 할 수 있습니다.

UPDATE system SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
       filename LIKE "sites/all/modules/%" AND type = "module"
       AND name IN ("my", "module", "whose", "path", "changed");

UPDATE registry SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
       filename LIKE "sites/all/modules/%"
       AND module IN  ("my", "module", "whose", "path", "changed");

1

contrib / dev / patched / custom 하위 폴더로 모듈을 옮기는 것이 좋습니다. 그러나 성능 향상은 없지만 실용적이고 미적인 이유로 수행됩니다. 이것은 미래 개발자의 삶을 더 쉽게 만들어 줄 것입니다.

라이브 사이트에서 문제없이 대부분의 contrib 모듈을 하위 폴더로 이동할 수 있습니다. 나중에 캐시를 비워야합니다. drush를 사용하지 않고 더 이상 캐시 지우기 페이지에 액세스 할 수없는 경우 /update.php를 방문하거나 캐시 테이블을 수동으로 잘라야합니다. 엔터티 API 모듈을 이동할 때 마지막 비트 만하면됩니다.

핵심 모듈을 이동하는 것은 기술적으로 가능하지만 권장하지 않으며이를 수행 할만한 이유가 없습니다.

업데이트 : 엔티티 API와 같은 모듈을 이동하려면 레지스트리를 다시 작성해야 할 수 있습니다. registry_rebuild 페이지를 확인 하십시오.


-4

sites / all / contrib를 가리키는 sites / all / modules 디렉토리에 sym 링크를 추가 할 수 있습니다. 문제가 해결되는지 확실하지 않습니다. 설치 프로파일 또는 drush make 파일을 포함한 다른 솔루션도 있습니다. 나는 그들에 대한 세부 사항을 제공 할만 큼 충분하지 않지만 적어도 그것은 당신이 볼 수있는 방향입니다.


5
장기적으로 유지 보수가
— 어려워

이것은 해킹이며 문제를 해결합니다 ... 좋은 해결책은 아닙니다.
— iLLin

drush registry_rebuild를 사용하는 것이 훨씬 좋습니다.
— lexicant
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.