drush updatedb для одного модуля


28

Чи можливо виконати функцію оновлення одного модуля за допомогою друку? Я бачу, drush updatedbякий не приймає ім'я модуля як аргумент і запускає всі доступні оновлення. Потім відбувається drush pm-updateперевірка нових файлів. документація говорить:

(те саме, що pm-updatecode + updatedb)

Чи означає це, що якщо я запускатиму drush pm-updateвсе доступне (новіше оновлення_функції), оновлення буде виконано? Чи є спосіб лише (db) оновити рівно один модуль?


Я знаю, що це питання досить давнє, але мені цікаво: навіщо ви цього хотіли? Зазвичай весь код базується на припущенні, що db оновлюється. Якщо ви не хочете, щоб оновлення конкретного модуля запускалося, чи не слід повернути весь модуль до попередньої версії?
marcvangend

1
рік потому. Мені це знадобилося для наступного: я створив спеціальний модуль, але згодом змінив макет таблиці (ще на стадії розробки), тому це було б зручно просто оновити db за допомогою нової схеми.
Маартен Хартман

Відповіді:


10

Ні, ти не можеш.

Якщо ви хочете оновити кожен модуль самостійно, оновіть лише файли одного модуля, а потім запустіть оновленийb.


Дивіться коментар нижче щодо використання drush dl(ви, мабуть, хочете спершу видалити старий модуль, щоб ви не
трималися

Чи є спосіб зробити це поза барабаном?
lathomas64

2
@ahimsauzi дав правильну відповідь
cybercampbell

21

На Drush 5.7 ви можете запустити команду drush pm-update --no-core module-name. Drush автоматично створить резервну копію поточного модуля, завантажить нову версію та запропонує оновити базу даних.


6
Це дозволить запустити ВСІ очікувані оновлення, а не лише ті з оновленого модуля.
moshe weitzman

Моше, можеш уточнити? Я виконував вищевказану команду, і хоча Drush перевірятиме ВСІ очікувані оновлення, лише вказаний модуль (назва модуля вище) буде оновлений. Я щось пропускаю?
ahimsauzi

6
Він перевіряє всі очікувані оновлення коду та лише оновлює код для вказаного модуля, але обробляє всі оновлення бази даних .
meustrus

8

Якщо ви хочете запустити лише одне оновлення, можете запустити drush eval foo_update_33(), наприклад. На практиці це трохи складніше, ніж ви повинні завантажити файл .install, але не набагато.

Ви також можете спробувати рішення @macaleaa:

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


3
Додам, що було б чудово, якби хтось зробив розширення aa Contrib для Drush, яке дозволило вам запускати вибрані оновлення. Це взагалі не безпечна справа, але іноді треба жити небезпечно. Не підходить для основного Друша, хоча (я підтримувач Друша)
moshe weitzman

2
Чому не підходить для стрижня основних? Чи не можливо, хтось захотів би застосувати певний порядок оновлення бази даних (для вже завантаженого коду), і в цьому випадку кожен окремий модуль потребує оновлення окремо? Я сам в такій ситуації.
meustrus

де звідси 33-х? чи є ім'я машини модуля?
lathomas64

33 є частиною назви функція оновлення та визначає порядок. І так, foo - це назва машини для модуля. Ви можете знайти функції у foo.install. Наприклад, модуль devel (в devel.install) має кілька функцій оновлення: function devel_update_7000той, який має найменше число, і виконуватиметься спочатку, потім function devel_update_7001тощо.
Урсула,

3
Ось приклад, який спочатку завантажує інсталяційний файл:drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
mcaleaa

5

ні drush up someproject, ні, drush upc someprojectздається, не оновлюють лише someprojectмодуль. Інший шлях до того, що ви хочете, це:

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

Ось обговорення подібної теми на Drupal.org. Піклуватися !


Я щойно спробував, і drush up someprojectНЕ працює, але, на жаль, він перевіряє ВСІ наявні оновлення для включених модулів за замовчуванням теж (що не потрібно), пише "Оновлення доступне" для деяких з них, але ТОЛЬКО оновлює конкретний проект. Ось знімок екрана: i.imgur.com/TDDmB.png . Як бачите, доступні декілька оновлень, але лише xmlsitemap оновлюється за допомогою drush up xmlsitemap.
Sk8erPeter

4

Я використовую Drush 5.9 і можу успішно оновити один модуль за допомогою цієї команди:

drush dl *project*

Так, наприклад, оновити модуль 'devel':

drush up devel

1

Я вважаю, що це зараз можливо за допомогою Drush, використовуючи up:

drush up module_name

0

У мене виникла ситуація, коли таблиця, створена функцією оновлення ( MYMODULE_update_7101), але до цієї таблиці входила в код десь у кожному кеш-пам’яті і майже при кожному виклику друку (це в основному отримання назв типів сутності для всіх меню і будь-якого іншого інше). Біг drush updatedbбігав MYMODULE_update_7101третім замість першого.

Я спробував рішення, запропоновані @macaleaa та @moshe weitzman, що працює:

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

перед запуском drush updatedb, але це не допомогло - пробіг барабану не вдався, оскільки updatedbспробував знову запуститись MYMODULE_update_7101()і помилився, сказавши, що стіл вже існує. В основному, вищевказаний код запустив оновлення, але не залишив свій слід у системі, що оновлення було запущено. Імовірно, що update.phpпісля запуску кожного оновлення існує ціла купа інших речей, щоб зберегти номер останньої версії модуля в db тощо.

Я update.phpпереглянув, як вона насправді виконує кожну функцію оновлення і що вона робить після, шукаючи функцію для виклику, яка викликала б функцію оновлення, а також виконувати всі інші речі. Я в кінцевому підсумку дійшов до цього:

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

Який я насправді біг із барабаном:

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

Він запустив оновлення, ніяких проблем, але потім MYMODULE версії 7101 все ще з'явився у списку оновлень, коли я запустив updatedb, ТАКОЖ він запускався, не помиляючись, і все виглядало добре при огляді сайту.

Трохи хакіт і 6 років пізно, але все добре, що закінчується добре?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.