Kurulu modüller / sites / all / module / * 'den / sites / all / contrib / module / *' a nasıl taşınır?


34

Bu sorunun cevaplarını hiç şanssız buluyorum. Veri tabanı yapısında gözlemlediklerimden, modüllerin yeri 'sistem' tablosunda belirtilmiştir. Sahip olduğum tek çözüm, 'dosyaadı' sütununu güncellemek için bir SQL sorgusu yazmak.

Bunu çözmek için daha iyi / daha temiz bir çözüm var mı, örneğin bir katkı modülü?

Yanıtlar:


27

Modüllerinizi yalnızca yeni konumunuza taşımanız ve kayıtları yeniden oluşturmanız yeterlidir. Kayıt defteri yeniden oluşturulduğunda, modüllerin yolu güncellenecektir. Kontrol edin registry_rebuild().

Modüllerdeki tüm kodu tarar veya her bir arabirimin veya sınıfın konumunu veritabanında depolayarak dizinler içerir.

Yine de, bunu sınamadan önce veritabanınızı yedeklemenizi öneririm.

Drush kullanıyorsanız, aşağıdaki komutu kullanarak kayıt defterini de yeniden oluşturabilirsiniz:

drush cc registry

Ayrıca registry_rebuild, drush komutunu da yükleyebilirsiniz :

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

Doğru anladıysam, registry_filetablonuzu da kesebilirsiniz, tüm dosyaları yeniden taramak ve tabloyu yeniden oluşturmak için drupal'ı zorlar.
Cyclonecode

3
Masanın kesilmesi kötü bir fikir gibi görünür ve büyük olasılıkla tamamen bozuk bir siteye neden olur.
Berdir

@Berdir - Kötü bir fikir gibi göründüğünü kabul ediyorum. Ancak, sadece denedim ve iş gibi görünüyor. Önce bir yedeğini alıp kullanan tüm tabloyu kesildi DELETE FROM registry_file;ve bir çağrı eklendi rebuild_registry()skinTenimde page.tpl.php.
Cyclonecode

Bu çok karmaşık, sadece John Laine'nin dediğini yapın, her zaman benim için çalıştı.
Jim Kirkpatrick

1
@JimKirkpatrick - Modülleri devre dışı bırakmanıza gerek yok.
Cyclonecode

10

Yerel olarak üretimdeki bir yedeği geri yükledim ve sadece bir şeyleri taşımaya ve admin / modüllerine basmaya ya da registry_rebuild () komutunu çalıştırmaya çalıştım, ancak ölümcül hataların atılmasını engellemedi. Bazı modüller, hook_init () 'in içerdiği veya içerdiği herhangi bir şeyi kullanabileceğinden veya Drupal’ın önyükleme sırasında bulamadığı bir menü yönlendirici yoluna sahip olabileceğiniz için bu bana mantıklı geliyor. Sonuçta, yaptığım şey buydu (yollarınız farklı olabilir):

Adım 1: Siteleri / tümünü / modüllerini siteleri / tümü / modülleri / katkı ile değiştirin

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

Adım 2: Özel ad alanlı modüller için siteleri / tümü / modülleri değiştirin / siteler / tümü / modülleri / özel alanlarına katkıda bulunun

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

Adım 3: dev modüllerini sitelere / all / module / dev'e taşıyın

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

Adım 4: Önbellekleri temizleyin, böylece işler düzgün şekilde önyüklenir

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

Not: Özel bir modül veya 403'ü (erişim reddedildi) işlemek için LoginToboggan gibi bir katkı kullanıyorsanız ve bu işlem sırasında oturumunuzu kapattıysanız , içerme dosyası için yeni yolu kullanmak için tablodaki include_filesütunu güncellemeniz gerekebilir. menu_roter. Bu muhtemelen nadir bir durumdur.

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

Bu sorgular çalıştırıldıktan sonra - yalnızca bir saniye sürecek - admin / config / development / performance komutunu açın ve önbelleği temizleyin, böylece menü yolları yeniden oluşturulur.


Bunun için teşekkürler! En iyi cevaplarda belirtilen adımları denedim ama bu benim durumumda yardımcı olmadı. Pantheon'da barındırılan bir sitedeki herhangi birinin cevabınızda bu db ifadelerini yerine getirmesi gerektiğinden şüpheliyim ve sonra "sarhoş sicil yapısını yeniden oluştur" ve "sarhoş cc sicilini"
Anne Bonham,

Oh ve Pantheon'da hiçbir yerde Redis modülüyle siteyi kuramadım ama siteler / tüm / modüller - bu yüzden bu modülden kök modüller klasöründe bıraktım. Ah iyi - En azından benim diğer modüller güzelce düzenlenmiş.
Anne Bonham,

LoginToboggan kullananlar için, ihtiyaç duyacağınız 3 MySQL komutları: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'dan havalı aracı deneyin: Drush Rebuild Project Paths . Süreci otomatikleştirir; benim için harika çalıştı. Elbette Drush kullanır .

Yine de bunu site veritabanınızın bir kopyası üzerinde denediğiniz önerisini ikinci olarak vereceğim.


7

Kayıt için, kayıt defterini yeniden oluşturmak için çok sarhoş bir komut var: http://drupal.org/project/registry_rebuild

Projenin sayfasında çok fazla bilgi var.


Bu benim en çok tercih edilen hareketli modüller yöntemidir. Alt dizine sites/all/modulestaşınması gereken bazı modüllere contribsahiptim. Tek yapmam gerekendrush dl registry_rebuild; mv OLD_PATH/module NEW_PATH/module; drush rr
Sumeet Pareek

Bu benim için çalıştı. Önce tüm modüllerimi taşıdım, sonra Registry_rebuild
gerl

İlginçtir, drush rr --fire-bazookahatalara yol açar, ancak drush rriyidir.
Alex Skrypnyk

5

Birincisi, daima veritabanınızı yedekleyin, o kadar basit ki, bir şeyler ters giderse ve yedekleme yapmazsanız kendinizi tekmeleyeceksiniz.

Modülleri devre dışı bırakıp bırakmamanın önemli olup olmadığından emin değilim; Sadece durumda yapmak isteyebilirsiniz. O zaman şunu yap:

  1. Sitenizi (sitename) / admin / config / development / maintenance konumunda bakım moduna geçirin
  2. Modüllerinizi fiziksel olarak dosya sisteminde taşıyın.
  3. Önbelleklerinizi (sitename) / admin / config / development / performance dizininde temizleyin veya modül sayfanızı yeniden kaydedin.

Hepsi tamam! Drupal, kurulu tüm modülleri yeniden arayacaktır.


Bakım modu için +1, böyle bir şeyden önce bunu yapmak her zaman güzeldir
Cyclonecode

1
Bu benim için zamanın% 100'ünde ölümcül hatalara neden oluyor. Belki de bağımlılığı olmayan modülleri taşırsanız çalışır.
ergophobe

4

Neden Registry Rebuild modülünü denemiyorsunuz . Benim için her zaman çalıştı.

İşte bunun hakkında bir alıntı (modülün proje sayfasından):

Drupal 7'de, kayıt defteri umutsuzca hortumlandığında ve kayıt defterini yeniden oluşturmanız gerektiğinde (PHP sınıflarının ve birlikte çalıştıkları dosyaların bir listesi) zamanlar vardır. Yine de, bu normal önbellek temizleme etkinliğini yapamazsınız, çünkü sistem önyüklemeye çalışırken bazı sınıflar gerekir.


Bu soruyu teorik olarak cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantıyı sağlamak tercih edilir. Bağladığınız modülü kullanmayı içeren hareketli modüller için bir prosedür varsa, lütfen açıklayın.
Moot

Teori yok ... işe yarıyor. Sayfadaki talimatları izleyin. Drush yöntemini kullandım ve işe yaradı.
saat

3

Komut aracılığıyla Drush ile entegre olan Registry Rebuild modülünü kullanabilirsiniz Drush RR.

Temelde yaptığınız şey şu adımlar:

  1. Modüllerinizi başka bir dizine taşıyın ve
  2. Registry Rebuild daha sonra modülleri doğru yere getirmek için sistem tablosunu yeniden inşa edecektir.

Bunu ilk olarak DrupalEasy Podcast # 133 ile öğrendim , bu modül / drush cmd'nin nasıl kullanılabileceğini daha fazla açıkladım.

Not: Tabii ki önce sitenizi yedekleyin ...


3
Bundan ikinciyim. Siteyi yedekle. Tüm modülleri yeni klasörlere taşıyın. Sarhoş olarak kayıt defteri yeniden oluşturma çalıştırın veya sadece talimatları izleyin ve çalıştırmak için dahil php dosyasına gidin. Basit.
Collins

2

Visit / admin / build / modülleri, sistem tablosundaki yolları yeniden oluşturacaktır. Bazen drupal artık önyükleme yapamıyor, bu nedenle bu çözüm bu durumda işe yaramıyor. Çalışmazsa , önceki bir cevapta belirtildiği gibi Drush Rebuild Project Path'lerini kullanabilirsiniz . Yine de bootstrap'ı kırmadan önce yeni drush komutunu eklemelisiniz. Yeni komutu eklemek için benioku KOMUTLARI bölümüne göz atın


2

drush dlModül dizini sorunları nedeniyle çalışma konusunda biraz sorun yaşadım . Genelde işleri düzeltmek için yapıştırabileceğim yığın cevapları severim. Burada, zaten uygun site dizinindeyseniz, Drush Rebuild Registry'i yükleyecek ve sitenizde çalıştıracak birkaç satır bulacaksınız.

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

2

Gerçek bir drupal-esk cevabından% 100 emin değilim, ancak deneyimlerime göre:

Sunucuya FTP yaparken yanlışlıkla özel modül klasörlerimden birini başka bir özel modül klasörüne taşıdım. İkisi de hala çalıştı. Drupal, başka bir modülün klasöründeyken bile ayrı bir modül olarak algılıyor gibiydi. Modülü devre dışı bırakmak zorunda değildim.

** Taşıdığım bu modül bir .install dosyasına sahip değildi, bu yüzden önemli olup olmadığından emin değilim.


Kurulum dosyası sadece modül kurulumu sırasında çağrılan prosedürler içindir ve bir gereklilik değildir. Çalıştığı için / sites / all / module altında herhangi bir klasör yapısına sahip olabilirsiniz, drupal özyinelemeli .info dosyalarını arar.
gbyte.co 18:15

@ gbyte.com bu konudaki açıklama için teşekkürler! Kurulum dosyasını biliyordum ama drupal'ın .info dosyalarını arama özyinelemeli sürecini bilmiyordum. Hangi alt klasörde olduklarının önemi olmadığını düşündüm ama sağlam bir cevabı bulmanın iyi olduğunu!
Exziled

1

Drupal dağılımlar yüzden son zamanlarda sonra kazara kopyası ile biten, iyi bu işlemezler Varlık API içinde sites/all/çalışmış bu bir Panopoly sitesinde, hiçbiri. Kayıt defteri yeniden, modüller sayfasını yükleyerek ve diğer her şey önemli bir hataya neden oldu.

Modülü devre dışı bırakmak, Panopoly'deki tonlarca başka modülün gerektirdiği Entity API gibi bir şeyi de taşımak zorunda kalırsanız, basit değildir.

Bunu çözmek için, Varlık API'si için şöyle bir şey yapardınız:

  1. Sistem tablosundaki yolu güncelleyin:

    UPDATE `system` 
      SET `filename` = REPLACE(
        `filename`, 
        'sites/all/modules/entity', 
        'profiles/panopoly/modules/contrib/entity'
      );
  2. Sonra kayıt defterini yeniden oluşturun:

    drush rr

1

Drupal 7

Her şeyden önce deneyin drush rr.

Çalışmazsa, dosyaları taşıdıktan sonra Drupal kök dizininizde aşağıdaki Drush komutlarını deneyin:

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

Yukarıdakiler işe yaramazsa, yolla ilgili eski bilgilere sahip olan tabloyu şuradan bulun:

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

Hiçbiri bulunamazsa, bu sizin harici ön belleğiniz olduğu anlamına gelir.

Öyleyse, yeniden başlatmayı unutmayın, örneğin:

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

Daha fazlasını görün: Drupal'daki önbellekleri temizlemek için hangi yöntem kullanılır?


Alternatif olarak, dosyaları taşıdıktan sonra aşağıdaki MySQL sorgularını deneyebilirsiniz:

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

Modüllerinizi katkıda / dev / yamalı / özel alt klasörlere taşımanız önerilir. Performans kazancı yoktur, ancak pratik ve estetik nedenlerle yapılır. Bu, gelecekteki geliştiricilerin hayatlarını kolaylaştıracak.

Contribute modüllerinin çoğunu canlı bir sitede sorun yaşamadan alt klasörlere taşıyabilirsiniz. Daha sonra önbellekleri temizlemelisin. Drush kullanmazsanız ve artık önbellek temizleme sayfasına erişemeyeceğinizi tespit ederseniz, /update.php adresini ziyaret etmeniz veya önbellek tablolarını manuel olarak kesmeniz gerekir. Varlık API modülünü taşırken sadece sonuncuyu yapmak zorunda kaldım.

Çekirdek modülleri hareket ettirmek teknik olarak mümkün, ancak bunu yapmam için herhangi bir geçerli sebep görmüyorum.

Güncelleme: Varlık API gibi modülleri taşımak, kayıt defterinin yeniden oluşturulmasını gerektirebilir. Registry_rebuild sayfasına bir göz atın .


-4

Sitelere / all / contrib sitelerine işaret eden sitelerde / all / katkıda bulunanlara bir işaret bağlantısı ekleyebilirsiniz. Sorunu çözdü mü emin değilim. Kurulum profili veya sarhoş bir dosya da dahil olmak üzere başka çözümler de var. Onlarla ilgili ayrıntılı bilgi verecek kadar bilgim yok ama en azından bakabileceğiniz bir yön.


5
Uzun vadede bakım başağrısıdır
AgA

Bu bir kesmek ve düzeltme gider ... iyi bir çözüm değil.
saat

şimdi kullanılabilir durumda olan drush registry_rebuild kullanmak çok daha iyi.
sözlü
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.