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


28

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

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

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


Я знаю, что этот вопрос довольно старый, но мне любопытно: зачем тебе это? Обычно весь код основан на предположении, что база данных обновлена. Если вы не хотите запускать обновление базы данных определенного модуля, не следует ли вернуть весь модуль к более ранней версии?
— marcvangend

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

Ответы:


10

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

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


См. Комментарий ниже об использовании drush dl(вы, вероятно, хотите сначала удалить старый модуль, чтобы не хранить старые файлы, не предназначенные для новой версии!)
— doublejosh

Есть ли способ сделать это за пределами Drush?
— lathomas64

2
@ahimsauzi дал правильный ответ
— Cybercampbell

21

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


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. Береги себя !


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

У меня была ситуация, в которой таблица создавалась функцией 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 лет, но все хорошо, что хорошо кончается?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.