Cách di chuyển các mô-đun đã cài đặt từ / site / all / module / * sang / site / all / contrib / module / *


34

Tôi đã tìm kiếm câu trả lời cho câu hỏi này mà không có chút may mắn nào. Từ những gì tôi quan sát được trong cấu trúc cơ sở dữ liệu, vị trí đến các mô-đun được chỉ định trong bảng 'hệ thống'. Giải pháp duy nhất tôi có là viết một truy vấn SQL để cập nhật cột 'tên tệp'.

Có một giải pháp tốt hơn / sạch hơn trong việc giải quyết điều này, ví dụ, một mô-đun đóng góp?

Câu trả lời:


27

Bạn chỉ cần di chuyển các mô-đun của bạn đến vị trí mới của bạn và xây dựng lại regisry. Khi đăng ký xây dựng lại đường dẫn đến các mô-đun sẽ được cập nhật. Kiểm tra registry_rebuild().

Giải cứu tất cả mã trong các mô-đun hoặc bao gồm các thư mục, lưu trữ vị trí của từng giao diện hoặc lớp trong cơ sở dữ liệu.

Mặc dù, tôi sẽ khuyên bạn nên sao lưu cơ sở dữ liệu trước khi kiểm tra điều này.

Nếu bạn đang sử dụng drush, bạn cũng có thể xây dựng lại registry bằng lệnh sau:

drush cc registry

Bạn cũng có thể cài đặt registry_rebuildlệnh cho drush:

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

Nếu tôi hiểu chính xác, bạn cũng có thể cắt bớt registry_filebảng của mình , sẽ buộc drupal quét lại tất cả các tệp và xây dựng lại bảng.
Cyclonecode

3
Cắt bớt bảng nghe có vẻ là một ý tưởng tồi và rất có thể sẽ dẫn đến một trang web hoàn toàn bị hỏng.
Berdir

@Berdir - Đồng ý rằng nó nghe có vẻ là một ý tưởng tồi. Nhưng, chỉ cần thử nó và dường như làm việc. Đầu tiên tôi lấy một bản sao lưu và cắt ngắn toàn bộ bảng bằng cách sử dụng DELETE FROM registry_file;và thêm một cuộc gọi rebuild_registry()vào page.tpl.php.
Cyclonecode

Điều này quá phức tạp, chỉ cần làm những gì John Laine nói, nó luôn làm việc cho tôi.
Jim Kirkpatrick

1
@JimKirkpatrick - Bạn không cần phải vô hiệu hóa các mô-đun.
Cyclonecode

10

Tôi đã khôi phục bản sao lưu từ sản xuất cục bộ và cố gắng chỉ di chuyển mọi thứ và nhấn admin / mô-đun hoặc chạy registry_Vbuild () nhưng nó không ngăn được các lỗi nghiêm trọng bị ném. Điều này có ý nghĩa với tôi vì một số mô-đun có thể sử dụng bao gồm hoặc bất cứ điều gì trong hook_init () của chúng hoặc bạn có thể có một đường dẫn bộ định tuyến trình đơn phụ thuộc vào mô-đun hoặc bao gồm Drupal không thể tìm thấy trên bootstrap. Cuối cùng, đây là những gì tôi đã làm (đường dẫn của bạn có thể khác):

Bước 1: Thay thế trang web / tất cả / mô-đun bằng trang web / tất cả / mô-đun / đóng góp

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');

Bước 2: Thay thế trang web / tất cả / mô-đun / đóng góp bằng trang web / tất cả / mô-đun / tùy chỉnh cho các mô-đun được đặt tên tùy chỉnh

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_%';

Bước 3: Di chuyển các mô-đun dev vào các trang web / tất cả / mô-đun / 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%';

Bước 4: Xóa bộ nhớ cache để mọi thứ sẽ khởi động đúng cách

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

Lưu ý: Nếu bạn sử dụng mô-đun tùy chỉnh hoặc đóng góp như LoginToboggan để xử lý 403 (truy cập bị từ chối) và bạn đã đăng xuất trong quá trình này, bạn có thể cần cập nhật include_filecột trong menu_roterbảng để sử dụng đường dẫn mới cho tệp đính kèm . Đây có lẽ là một trường hợp hiếm gặp.

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

Khi các truy vấn này đã chạy - sẽ chỉ mất một phần giây - nhấn admin / config / Development / Performance và xóa bộ đệm để đường dẫn menu được xây dựng lại.


Cảm ơn vì điều đó! Tôi đã thử các bước được đề cập trong các câu trả lời hàng đầu, nhưng điều đó không giúp ích gì trong trường hợp của tôi. Tôi nghi ngờ bất kỳ ai trên trang web được lưu trữ trên Pantheon cần thực hiện các câu lệnh db này trong câu trả lời của bạn và sau đó thực hiện "đăng ký lại drush" và "đăng ký drush cc"
Anne Bonham

Ồ và trên Pantheon, tôi không thể truy cập trang web với mô-đun Redis ở bất cứ đâu ngoài các trang web / tất cả / mô-đun - vì vậy tôi đã từ bỏ và để lại một mô-đun này trong thư mục mô-đun gốc. Ah tốt - ít nhất các mô-đun khác của tôi được tổ chức độc đáo.
Anne Bonham

Đối với những người sử dụng LoginToboggan, đây là 3 lệnh MySQL bạn sẽ cần: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

Hãy thử công cụ tuyệt vời từ Mark Sonnabaum: Drush Rebuild Project Paths . Nó tự động hóa quá trình; làm việc tuyệt vời cho tôi Sử dụng Drush , tất nhiên.

Tôi sẽ thứ hai gợi ý rằng bạn thử điều này trên một bản sao của cơ sở dữ liệu trang web của bạn, mặc dù.


7

Đối với bản ghi, có một lệnh drush tuyệt vời để xây dựng lại sổ đăng ký: http://drupal.org/project/registry_Vbuild

Có rất nhiều thông tin trong trang của dự án.


Đây là phương pháp ưa thích nhất của tôi để di chuyển các mô-đun xung quanh. Tôi đã có một số mô-đun được kích hoạt trong sites/all/modulesđó phải được chuyển sang contribthư mục con. Tất cả những gì tôi phải làm làdrush dl registry_rebuild; mv OLD_PATH/module NEW_PATH/module; drush rr
Sumeet Pareek

Điều này làm việc cho tôi. Trước tiên, tôi đã di chuyển tất cả các mô-đun của mình sau đó đã thực hiện việc đăng ký
gerl

Thật thú vị, drush rr --fire-bazookadẫn đến lỗi, nhưng drush rrlà tốt.
Alex Skrypnyk

5

Đầu tiên, luôn luôn sao lưu cơ sở dữ liệu của bạn, thật đơn giản để bạn tự đá mình nếu có sự cố và bạn không sao lưu.

Tôi không chắc liệu nó có quan trọng nếu bạn vô hiệu hóa các mô-đun hay không; bạn có thể muốn làm điều đó, chỉ trong trường hợp. Sau đó, làm điều này:

  1. Đặt trang web của bạn ở chế độ bảo trì tại (tên trang web) / admin / config / Development / bảo trì
  2. Vật lý di chuyển các mô-đun của bạn trong hệ thống tập tin.
  3. Xóa bộ nhớ cache của bạn tại (tên trang web) / admin / config / Development / Performance hoặc chỉ lưu lại trang mô-đun của bạn.

Tất cả đã được làm xong! Drupal sẽ tìm kiếm lại tất cả các mô-đun đã cài đặt.


+1 cho chế độ bảo trì, luôn luôn tốt để làm điều này trước khi một cái gì đó như thế này
Cyclonecode

1
Điều này gây ra lỗi nghiêm trọng 100% thời gian cho tôi. Có thể nó hoạt động nếu bạn di chuyển các mô-đun không có phụ thuộc hoặc một cái gì đó.
ergophobe

4

Tại sao bạn không thử Đăng ký xây dựng lại mô-đun . Nó làm việc mỗi lần cho tôi.

Đây là một trích dẫn về nó (từ trang dự án của mô-đun):

Có những lúc trong Drupal 7 khi sổ đăng ký bị vô vọng và bạn cần xây dựng lại sổ đăng ký (một danh sách các lớp PHP và các tệp mà chúng đi cùng). Tuy nhiên, đôi khi, bạn không thể thực hiện hoạt động xóa bộ nhớ cache thông thường này vì một số lớp được yêu cầu khi hệ thống đang cố gắng khởi động.


Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Nếu có một quy trình di chuyển các mô-đun bao gồm sử dụng mô-đun bạn đã liên kết, vui lòng mô tả nó.
Mołot

Không có lý thuyết ... nó hoạt động. Thực hiện theo các hướng dẫn trên trang. Tôi đã sử dụng phương pháp drush và nó chỉ hoạt động.
iLLin

3

Bạn có thể sử dụng mô-đun Rebuild của Registry , tích hợp với Drush thông qua Drush RRlệnh.

Về cơ bản những gì bạn làm là các bước sau:

  1. Di chuyển các mô-đun của bạn sang thư mục khác và
  2. Đăng ký Rebuild sau đó sẽ xây dựng lại bảng hệ thống để có được các mô-đun ở đúng nơi.

Lần đầu tiên tôi đã học / phát hiện ra nó thông qua Drupal EAS Podcast # 133 , điều này giải thích thêm về cách sử dụng mô-đun / drush cmd này.

PS: Tất nhiên, trước tiên hãy thực hiện sao lưu trang web của bạn ...


3
Tôi thứ hai này. Sao lưu trang web. Di chuyển tất cả các mô-đun vào các thư mục mới. Chạy đăng ký xây dựng lại trong drush hoặc chỉ cần làm theo các hướng dẫn và điều hướng đến tệp php đi kèm để chạy nó. Đơn giản.
Collins

2

Truy cập / admin / build / mô-đun, nó sẽ xây dựng lại các đường dẫn trong bảng hệ thống. Đôi khi drupal không thể bootstrap nữa nên giải pháp này không hoạt động trong trường hợp này. Nếu nó không hoạt động, bạn có thể sử dụng Drush Rebuild Project Paths như đã nói trong câu trả lời trước. Bạn phải thêm lệnh drush mới trước khi phá bootstrap. Để thêm lệnh mới, hãy xem phần LỰA CHỌN của readme


2

Tôi gặp một số rắc rối với drush dlviệc không hoạt động vì các vấn đề về thư mục mô-đun. Nói chung tôi thích các câu trả lời ngăn xếp mà tôi có thể chỉ cần dán vào để mọi thứ hoạt động. Tại đây bạn tìm thấy một vài dòng sẽ cài đặt Drush Rebuild Registry và chạy nó trên trang web của bạn nếu bạn đã có trong thư mục trang web thích hợp.

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

2

Tôi không chắc chắn 100% về câu trả lời drupal-esk thực sự nhưng theo kinh nghiệm của tôi:

Tôi đã vô tình chuyển một trong các thư mục mô-đun tùy chỉnh của mình sang một thư mục mô-đun tùy chỉnh khác khi FTP đến máy chủ. Cả hai vẫn làm việc. Drupal dường như đã nhận ra nó là một mô-đun riêng biệt ngay cả khi nó nằm trong thư mục của mô-đun khác. Tôi không phải tắt mô-đun.

** Mô-đun này mà tôi đã di chuyển KHÔNG có tệp .install nên tôi không chắc có vấn đề gì không.


Tệp cài đặt chỉ dành cho các thủ tục được gọi trong quá trình cài đặt mô-đun và không phải là một yêu cầu. Nó hoạt động vì bạn có thể có bất kỳ cấu trúc thư mục nào dưới / site / all / module, drupal sẽ tìm kiếm các tệp .info theo cách đệ quy.
gbyte.co

@ gbyte.co cảm ơn bạn đã làm rõ về điều đó! Tôi biết về tệp cài đặt nhưng không biết quy trình tìm kiếm đệ quy của drupal. Tôi cho rằng họ không tham gia vào thư mục con nào nhưng thật tốt khi có câu trả lời chắc chắn!
Xuất hiện

1

Các bản phân phối Drupal không xử lý tốt điều này, vì vậy gần đây sau khi vô tình kết thúc với một bản sao của Entity API trong sites/all/một trang web Panopoly, không có cái nào trong số này hoạt động. Đăng ký xây dựng lại, tải trang mô-đun và mọi thứ khác gây ra lỗi nghiêm trọng.

Việc vô hiệu hóa mô-đun cũng không đơn giản nếu bạn phải di chuyển thứ gì đó như API thực thể được yêu cầu bởi hàng tấn mô-đun khác trong Panopoly.

Để giải quyết vấn đề này, đối với API thực thể, bạn sẽ làm một cái gì đó như thế này:

  1. Cập nhật đường dẫn trong bảng hệ thống:

    UPDATE `system` 
      SET `filename` = REPLACE(
        `filename`, 
        'sites/all/modules/entity', 
        'profiles/panopoly/modules/contrib/entity'
      );
  2. Sau đó xây dựng lại registry:

    drush rr

1

Drupal 7

Trước hết hãy thử drush rr.

Nếu nó không hoạt động, sau khi di chuyển các tệp, hãy thử các lệnh Drush sau trong thư mục gốc Drupal của bạn:

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

Nếu ở trên không hoạt động, hãy tìm bảng vẫn có thông tin cũ về đường dẫn bằng cách:

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

Nếu không tìm thấy, điều đó có nghĩa là bộ đệm ngoài của bạn.

Nếu vậy, đừng quên khởi động lại chúng, ví dụ:

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

Xem thêm: Phương pháp nào được sử dụng để xóa bộ nhớ cache trong Drupal?


Ngoài ra, bạn có thể thử các truy vấn MySQL sau khi di chuyển tệp:

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

Nên di chuyển các mô-đun của bạn vào các thư mục con contrib / dev / patched / custom. Không có hiệu suất tăng tuy nhiên, điều này được thực hiện vì lý do thực tế và thẩm mỹ. Điều này sẽ làm cho cuộc sống của các nhà phát triển trong tương lai dễ dàng hơn.

Bạn có thể di chuyển hầu hết các mô-đun đóng góp sang các thư mục con mà không gặp vấn đề gì trên một trang web trực tiếp. Bạn nên xóa bộ nhớ cache sau đó. Nếu bạn không sử dụng drush và thấy bạn không thể truy cập trang xóa bộ nhớ cache nữa, bạn sẽ phải truy cập /update.php hoặc cắt xén các bảng bộ đệm theo cách thủ công. Tôi chỉ phải thực hiện bit cuối cùng khi di chuyển mô-đun API thực thể.

Di chuyển các mô-đun lõi là có thể về mặt kỹ thuật, nhưng tôi sẽ không đề xuất nó và tôi không thấy bất kỳ lý do hợp lệ nào để làm điều này.

Cập nhật: Di chuyển các mô-đun như API thực thể có thể yêu cầu xây dựng lại sổ đăng ký. Kiểm tra trang registry_Vbuild .


-4

Bạn chỉ có thể thêm một liên kết sym trong diretory trang web / all / mô-đun trỏ đến trang web / all / contrib. Tôi không chắc nếu nó giải quyết vấn đề của bạn. Ngoài ra còn có các giải pháp khác, bao gồm hồ sơ cài đặt, hoặc một tập tin thực hiện drush. Tôi không biết đủ để cung cấp chi tiết về họ nhưng ít nhất đó là hướng bạn có thể nhìn vào.


5
Đó là một vấn đề đau đầu về bảo trì trong thời gian dài hơn
AgA

Đây là một hack và đi xung quanh sửa chữa ... không phải là một giải pháp tốt.
iLLin

vâng tốt hơn nhiều để sử dụng registry numbuild drush ngay bây giờ khi nó có sẵn.
điển
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.