drush updatedb dla pojedynczego modułu

28

Czy można wykonać funkcję aktualizacji pojedynczego modułu poprzez drush? Widzę, drush updatedbktóry nie przyjmuje nazwy modułu jako argumentu i uruchamia wszystkie dostępne aktualizacje. Następnie jest drush pm-updatesprawdzane, czy są nowe pliki. dokumentacja mówi:

(to samo co pm-updatecode + updatedb)

Czy to oznacza, że ​​jeśli uruchomię drush pm-updatekażdą dostępną (nowsze wersje funkcji_wyjścia) aktualizację zostanie wykonana? Czy istnieje sposób na aktualizację tylko (db) dokładnie jednego modułu?

nonsenz
źródło
Wiem, że to pytanie jest dość stare, ale jestem ciekawy: dlaczego tego chcesz? Zwykle cały kod opiera się na założeniu, że baza danych jest aktualna. Jeśli nie chcesz, aby aktualizacja db określonego modułu działała, czy nie powinieneś przywrócić całego modułu do wcześniejszej wersji?
marcvangend
1
rok później. Potrzebowałem tego do następujących celów: Stworzyłem moduł niestandardowy, ale później zmieniłem układ tabeli (wciąż na etapie programowania), więc przydałoby się po prostu zaktualizować db o nowy schemat.
Maarten Hartman

Odpowiedzi:

10

Nie możesz

Jeśli chcesz zaktualizować każdy moduł osobno, zaktualizuj tylko pliki jednego modułu, a następnie uruchom zaktualizowaneb.

Berdir
źródło
Zobacz komentarz poniżej na temat używania drush dl(prawdopodobnie najpierw chcesz usunąć stary moduł, aby nie trzymać starszych plików nieprzeznaczonych dla nowej wersji!)
doublejosh
Czy istnieje sposób na zrobienie tego poza drush?
lathomas64
2
@ahimsauzi podał prawidłową odpowiedź
cybercampbell
21

W Drush 5.7 możesz uruchomić polecenie drush pm-update --no-core module-name. Drush automatycznie wykona kopię zapasową bieżącego modułu, pobierze nową wersję i poprosi o aktualizację bazy danych.

ahimsauzi
źródło
6
To uruchomi WSZYSTKIE oczekujące aktualizacje, nie tylko te z modułu, który zaktualizowałeś.
moshe weitzman
Mosze, możesz to wyjaśnić? Uruchomiłem powyższe polecenie i chociaż Drush sprawdzi WSZYSTKIE oczekujące aktualizacje, tylko określony moduł (nazwa modułu powyżej) zostanie zaktualizowany. Czy coś brakuje?
ahimsauzi,
6
Sprawdza wszystkie oczekujące aktualizacje kodu i aktualizuje tylko kod dla określonego modułu, ale przetworzy wszystkie aktualizacje bazy danych .
Meustrus,
8

Jeśli chcesz uruchomić tylko jedną aktualizację, możesz drush eval foo_update_33()na przykład uruchomić . W praktyce jest to trochę bardziej skomplikowane, ponieważ musisz załadować plik .install, ale nie za dużo.

Możesz także wypróbować rozwiązanie @macaleaa:

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

moshe weitzman
źródło
3
Dodam, że byłoby wspaniale, gdyby ktoś stworzył rozszerzenie Contrib dla Drusha, które pozwala uruchamiać wybrane aktualizacje. Nie jest to ogólnie rzecz biorąc bezpieczne, ale czasami musisz żyć niebezpiecznie. Nie nadaje się jednak do rdzenia Drusha (jestem opiekunem Drusha)
moshe weitzman
2
Dlaczego nie nadaje się do drush rdzenia? Czy nie jest możliwe, że ktoś chciałby wymusić określoną kolejność aktualizacji bazy danych (dla kodu już pobranego), w którym to przypadku każdy moduł musiałby być aktualizowany osobno? Sam jestem w takiej sytuacji.
meustrus
skąd pochodzą 33? czy foo to nazwa komputera modułu?
lathomas64
33 jest częścią nazwy funkcji aktualizacji i określa kolejność. I tak, foo to nazwa maszyny modułu. Możesz znaleźć funkcje w foo.install. Na przykład moduł devel (w devel.install) ma kilka funkcji aktualizacyjnych: function devel_update_7000jest to ten o najniższym numerze i zostanie najpierw wykonany function devel_update_7001, itd.
Ursula
3
Oto przykład, który najpierw ładuje plik instalacyjny:drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
mcaleaa
5

ani drush up someprojectnie drush upc someprojectwydają się aktualizować tylko someprojectmodułu. Innym sposobem na osiągnięcie tego jest:

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

Oto dyskusja na podobny temat na Drupal.org. Dbać !

siebie
źródło
Właśnie próbowałem i drush up someprojectDZIAŁA, ALE niestety domyślnie sprawdza WSZYSTKIE dostępne aktualizacje dla włączonych modułów (które nie byłyby potrzebne), pisze „Aktualizacja dostępna” dla niektórych z nich, ale TYLKO aktualizuje konkretny projekt. Oto zrzut ekranu: i.imgur.com/TDDmB.png . Jak widać, dostępnych jest wiele aktualizacji, ale tylko xmlsitemap jest aktualizowany za pomocą drush up xmlsitemap.
Sk8erPeter,
4

Korzystam z Drush 5.9 i mogę pomyślnie zaktualizować pojedynczy moduł za pomocą tego polecenia:

drush dl *project*

Na przykład, aby zaktualizować moduł „devel”:

drush up devel
Pręt
źródło
1

Wierzę, że jest to teraz możliwe dzięki Drush, używając up:

drush up module_name
zgreen
źródło
0

Miałem sytuację, w której tabela utworzona przez funkcję aktualizacji ( MYMODULE_update_7101), ale do tej tabeli dostęp był gdzieś w kodzie w każdej pamięci podręcznej wyczyszczonej i prawie przy każdym wywołaniu drush (w zasadzie otrzymywał nazwy typów jednostek dla wszystkich menu i cokolwiek innego) jeszcze). Bieganie drush updatedbdziałało MYMODULE_update_7101trzecie zamiast pierwszego.

Wypróbowałem rozwiązanie sugerowane przez @macaleaa i @moshe weitzman dotyczące uruchamiania:

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

przed uruchomieniem drush updatedb, ale to nie pomogło - uruchomienie drush nie powiodło się, ponieważ updatedbpróbowałem ponownie uruchomić MYMODULE_update_7101()i zignorowałem, mówiąc, że tabela już istnieje. Zasadniczo powyższy kod uruchomił aktualizację, ale nie pozostawił znaku w systemie, że aktualizacja została uruchomiona. Przypuszczalnie istnieje wiele innych rzeczy, update.phpktóre trzeba zrobić po uruchomieniu każdej aktualizacji, aby zapisać najnowszy numer wersji modułu w db itp.

Przeszedłem, update.phpaby zobaczyć, jak faktycznie działa każda funkcja aktualizacji i co robi później, szukając funkcji do wywołania, która wywołałaby funkcję aktualizacji, a także wykonała wszystkie inne czynności. Skończyło się na tym, że:

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

Które faktycznie prowadziłem z drush:

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

Uruchomiłem aktualizację, nie ma problemu, ale wtedy wersja 7101 MYMODULE wciąż pojawiała się na liście aktualizacji, kiedy uruchomiłem updatedb, mimo że działała bez błędów i wszystko wyglądało dobrze podczas inspekcji witryny.

Trochę zuchwały i spóźniony o 6 lat, ale czy wszystko dobrze się kończy?

nerdlinger
źródło