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

28

Можно ли выполнить функцию обновления одного модуля с помощью Drush? Я вижу, drush updatedbчто не принимает modulename в качестве аргумента и запускает все доступные обновления. Затем есть drush pm-updateтакже проверка новых файлов. в документации сказано:

(так же, как pm-updatecode + updatedb)

Означает ли это, что при запуске drush pm-updateкаждого доступного (более нового выхода update_function) будет выполнено обновление? Есть ли способ только (дБ) обновить только один модуль?

nonsenz
источник
Я знаю, что этот вопрос довольно старый, но мне любопытно: зачем тебе это? Обычно весь код основан на предположении, что база данных обновлена. Если вы не хотите запускать обновление базы данных определенного модуля, не следует ли вернуть весь модуль к более ранней версии?
marcvangend
1
год спустя. Мне это понадобилось для следующего: я создал собственный модуль, но позже изменил раскладку таблицы (все еще на стадии разработки), так что было бы удобно просто обновить базу данных новой схемой.
Мартен Хартман

Ответы:

10

Нет, ты не можешь.

Если вы хотите обновить каждый модуль самостоятельно, обновите только файлы одного модуля и затем запустите updatedb.

Berdir
источник
См. Комментарий ниже об использовании drush dl(вы, вероятно, хотите сначала удалить старый модуль, чтобы не хранить старые файлы, не предназначенные для новой версии!)
doublejosh
Есть ли способ сделать это за пределами Drush?
lathomas64
2
@ahimsauzi дал правильный ответ
Cybercampbell
21

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

ahimsauzi
источник
6
Это запустит ВСЕ ожидающие обновления, а не только те из модуля, который вы обновили.
Моше Вейцман
Моше, можете уточнить? Я выполнил указанную выше команду, и хотя Drush проверит ВСЕ ожидающие обновления, будет обновлен только указанный модуль (имя модуля выше). Я что-то пропустил?
Ахимсаузи
6
Он проверяет все ожидающие обновления кода и обновляет код только для указанного модуля, но обрабатывает все обновления базы данных .
meustrus
8

Если вы хотите запустить только одно обновление, вы можете запустить drush eval foo_update_33(), например. На практике это немного сложнее, так как вам нужно загрузить файл .install, но не намного.

Вы также можете попробовать решение @macaleaa:

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

Моше Вейцман
источник
3
Я добавлю, что было бы замечательно, если бы кто-то сделал расширение Contrib для Drush, позволяющее запускать выбранные обновления. В общем, это небезопасно, но иногда нужно жить опасно. Хотя не подходит для основного Drush (я сопровождающий
Drush
2
Почему не подходит для основной струи? Разве не возможно, что кто-то захочет применить определенный порядок обновлений базы данных (для уже загруженного кода), и в этом случае каждый отдельный модуль необходимо будет обновлять отдельно? Я сам в такой ситуации.
meustrus
откуда 33 идут отсюда? это имя машины модуля?
lathomas64
33 является частью имени функции обновления и определяет порядок. И да, foo - это имя машины модуля. Вы можете найти функции в foo.install. Например, модуль devel (в devel.install) имеет несколько функций обновления: function devel_update_7000это та, которая имеет наименьшее число и будет выполняться сначала, затем function devel_update_7001и т. Д.
Ursula
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. Береги себя !

myselfhimself
источник
Я только что попробовал, и 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
zgreen
источник
0

У меня была ситуация, в которой таблица создавалась функцией update ( MYMODULE_update_7101), но эта таблица использовалась в коде где-то в каждом очищенном кеше и почти при каждом вызове drush (это было в основном получение имен типов сущностей для всех меню и любых других еще). Бег 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которые необходимо выполнить после запуска каждого обновления, чтобы сохранить номер последней версии модуля в БД и т. Д.

Я update.phpпосмотрел, как на самом деле выполняется каждая функция обновления и что она делает после этого, искал функцию для вызова, которая бы вызывала функцию обновления, а также делал все остальное. Я закончил тем, что добирался до этого:

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

Который я на самом деле побежал с drush:

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

Он запустил обновление, без проблем, но тогда MYMODULE версии 7101 все еще показывался в списке обновлений, когда я запустился updatedb, хотя он работал без ошибок, и все выглядело хорошо при проверке сайта.

Немного взволнован и опоздал на 6 лет, но все хорошо, что хорошо кончается?

nerdlinger
источник