tek bir modül için drush updatedb


28

Tek bir modülün güncelleme fonksiyonunu drush ile gerçekleştirmek mümkün müdür? Görebildiğim drush updatedbargüman olarak bir modulename almaz hangi ve tüm mevcut güncellemeleri çalıştırır. Sonra drush pm-updateyeni dosyalar için de kontroller var . dokümantasyon diyor ki:

(pm-updatecode + updatedb ile aynı)

Bu, drush pm-updatemevcut her şeyi çalıştırmamın (daha yeni update_function çıkışlarından) çalıştırılmasının güncelleneceği anlamına mı geliyor ? Tam olarak tek bir modülü (db) güncellemenin bir yolu var mı?


Bu sorunun oldukça eski olduğunu biliyorum ama merak ediyorum: Neden bunu istiyorsun? Normal olarak, tüm kodlar db'nin güncel olduğu varsayımına dayanır. Belirli bir modülün db güncellemesinin çalışmasını istemiyorsanız, tüm modülü daha eski bir sürüme döndürmemelisiniz?
marcvangend

1
bir yıl sonra. Aşağıdakiler için buna ihtiyacım vardı: Özel bir modül yaptım, ancak daha sonra (hala geliştirme aşamasında) tablo düzenini değiştirdim, bu yüzden db'yi yeni şema ile güncellemekte fayda var.
Maarten Hartman

Yanıtlar:


10

Hayır yapamazsın.

Her bir modülü kendi başına güncellemek istiyorsanız, yalnızca tek bir modülün dosyalarını güncelleyin ve sonra updatedb komutunu çalıştırın.


Kullanma ile ilgili aşağıdaki yoruma bakın drush dl(muhtemelen eski modülü silmek istemeniz gerekir, böylece yeni sürüm için tasarlanmamış eski dosyaları
tutmazsınız

Bunu sarhoş dışında yapmanın bir yolu var mı?
lathomas64

2
@ahimsauzi doğru cevabı verdi
cybercampbell

21

Drush 5.7'de komutu çalıştırabilirsiniz drush pm-update --no-core module-name. Drush mevcut modülü otomatik olarak yedekler, yeni sürümü indirir ve sizden veri tabanını güncellemenizi ister.


6
Bu, yalnızca güncellediğiniz modülden gelenleri değil, TÜM bekleyen güncellemeleri çalıştıracaktır.
moshe weitzman

Moshe, netleştirebilir misin? Yukarıdaki komutu kullanıyorum ve Drush TÜM bekleyen güncellemeleri kontrol etse de, sadece belirtilen modül (yukarıdaki modül adı) güncellenecek. Bir şey mi eksik?
ahimsauzi

6
Bekleyen tüm kod güncellemelerini kontrol eder ve yalnızca belirtilen modülün kodunu günceller, ancak tüm veritabanı güncellemelerini işler .
meustrus

8

Yalnızca bir güncelleme çalıştırmak istiyorsanız, drush eval foo_update_33()örneğin çalıştırabilirsiniz . Uygulamada, .install dosyasını yüklemek zorunda olduğunuzdan biraz daha karmaşıktır, ancak çok fazla değildir.

Ayrıca @macaleaa çözümünü deneyebilirsiniz:

drush php-eval 'module_load_install('my_module');my_module_update_7XXX();'


3
Seçili güncellemeleri yayınlamanıza izin veren bir kişi Drush için bir Contribute eklentisi yaptığında harika olacağını ekleyeceğim. Bu genel olarak yapılacak güvenli bir şey değil, ancak bazen tehlikeli bir şekilde yaşamalısınız. Çekirdek Drush için uygun değil (Ben Drush koruyucusuyum)
moshe weitzman

2
Neden çekirdek sarhoşluğu için uygun değil? Birinin belirli bir veritabanı güncellemesi emri vermek istemesi mümkün değil (zaten indirilmiş kod için), bu durumda her bir modülün ayrı ayrı güncellenmesi gerekirdi? Ben böyle bir durumdayım.
meustrus

33 buradan nereye geliyor? modülün makine adı nedir?
lathomas64

33, güncelleme fonksiyonunun isminin bir parçasıdır ve sırayı belirler. Ve evet, foo, modülün makine adıdır. İşlevleri foo.install içinde bulabilirsiniz. : Örneğin, (devel.install olarak) devel modülü çeşitli güncelleme işlevi vardır function devel_update_7000, sonra en düşük sayı ile biridir ve ilk idam alacak function devel_update_7001vb
Ursula

3
İşte ilk yükleme dosyasını yükleyen bir örnek:drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
mcaleaa

5

ne drush up someproject, ne de drush upc someprojectsadece someprojectmodülü güncellemek gibi görünüyor . İstediğin şeyden farklı bir yol:

drush dl someproject #use --select option to be prompted for a module version
                     #this will overwrite your exising module's files
                     #backup your modules files with --backup, yourself, use a VCS to revert
drush updb           #run available database update scripts

İşte tartışma Drupal.org'da benzer bir konu. Kendine iyi bak !


Yeni denedim ve drush up someprojectDOES işe yarıyor, ancak ne yazık ki, etkin modüller için TÜM kullanılabilir güncellemeleri de varsayılan olarak kontrol ediyor (gerekmeyecek), bazılarına "Güncelleme mevcut" yazıyor , ancak SADECE belirli projeyi güncelliyor. İşte bir ekran görüntüsü: i.imgur.com/TDDmB.png . Gördüğünüz gibi, birden fazla güncelleme mevcut, ancak yalnızca xmlsitemap kullanılarak güncelleniyor drush up xmlsitemap.
Sk8erPeter,

4

Drush 5.9 kullanıyorum ve bu komutu kullanarak tek bir modülü başarıyla güncelleyebilirim:

drush dl *project*

Örneğin, 'devel' modülünü güncellemek için:

drush up devel

1

Bunun Drush ile mümkün olduğunu düşünüyorum up:

drush up module_name

0

Bir güncelleme işlevi ( MYMODULE_update_7101) tarafından oluşturulan bir tablonun ( ) oluşturduğu bir durum vardı , ancak bu tablo her önbellek kodunda bir yerde açık ve neredeyse her sarhoş çağrıda yer alıyordu (temelde tüm menüler için varlık türlerinin isimlerini alıyordu. Başka). Koşmak ilk yerine üçüncü drush updatedbkoşuyordu MYMODULE_update_7101.

@Macaleaa ve @moshe weitzman tarafından önerilen çözümü denedim:

drush php-eval 'module_load_install('MYMODULE');MYMODULE_update_7101();'

çalıştırmadan önce drush updatedb, ancak bu işe yaramadı - sarhoş koşusu başarısız oldu çünkü updatedbtekrar çalıştı MYMODULE_update_7101()ve hata verdi, tablonun zaten var olduğunu söyledi. Temel olarak, yukarıdaki kod güncellemeyi çalıştırmıştı, ancak güncellemenin çalıştığı sistemdeki izini bırakmadı. Muhtemelen update.phpdb, vb modülün son sürüm numarasını saklamak için her güncelleme çalıştırdıktan sonra yapmanız gereken bir sürü başka şey vardır.

update.phpHer bir güncelleme fonksiyonunun gerçekte nasıl çalıştığını ve sonrasında ne yaptığını, güncelleme fonksiyonunu çağıracak ve diğer tüm işlemleri yapan bir fonksiyon aradığımı görmeye gittim . Buna ulaşmaktan vazgeçtim:

include_once DRUPAL_ROOT . "/includes/update.inc";
$c["results"]["#abort"] = array();
update_do_one("MYMODULE", 7101, array(), $c);

Hangi gerçekten sarhoş ile koştum:

drush eval 'include_once DRUPAL_ROOT . "/includes/update.inc"; $c["results"]["#abort"] = array(); update_do_one("MYMODULE", 7101, array(), $c);'

Güncelleme yapıldı, sorun olmadı, fakat daha sonra MYMODULE sürüm 7101 koştuğumda hala güncellemeler listesinde updatedbgöründü, her ne kadar yanlış olsa da koştu ve her şey sitenin incelemesi için iyi görünüyordu.

Biraz hack ve 6 yıl gecikti, ama her şey yolunda mı bitti?

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.