是否可以通过Drush执行单个模块的更新功能?我可以看到drush updatedb
哪个不使用模块名作为参数,而是运行所有可用的更新。然后这里drush pm-update
也检查新文件。该文件说:
(与pm-updatecode + Updatedb相同)
这是否意味着如果我运行drush pm-update
所有可用的(更新的update_function出口)更新,就会被执行?有没有办法只(db)更新一个模块?
是否可以通过Drush执行单个模块的更新功能?我可以看到drush updatedb
哪个不使用模块名作为参数,而是运行所有可用的更新。然后这里drush pm-update
也检查新文件。该文件说:
(与pm-updatecode + Updatedb相同)
这是否意味着如果我运行drush pm-update
所有可用的(更新的update_function出口)更新,就会被执行?有没有办法只(db)更新一个模块?
Answers:
不,你不能。
如果要单独更新每个模块,则仅更新单个模块的文件,然后运行updatedb。
drush dl
(您可能希望先删除旧模块,以免保留不打算用于新版本的旧文件!)
在Drush 5.7上,您可以运行命令drush pm-update --no-core module-name
。Drush将自动备份当前模块,下载新版本并提示您更新数据库。
例如,如果只想运行一个更新,则可以运行drush eval foo_update_33()
。实际上,它要比加载.install文件复杂,但要复杂得多。
您也可以尝试@macaleaa解决方案:
drush php-eval 'module_load_install('my_module');my_module_update_7XXX();'
function devel_update_7000
是具有最低数量,并且将得到首先执行,然后function devel_update_7001
,等等
drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
既不是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
确实可以工作,但是不幸的是,它也会默认检查启用的模块的所有可用更新(不需要),将其中一些写为“ Update available”,但仅更新特定项目。这是屏幕截图:i.imgur.com/TDDmB.png。如您所见,可以使用多个更新,但是只有xmlsitemap可以使用进行更新drush up xmlsitemap
。
我遇到了一种情况,其中有一个由更新函数(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
在运行每个更新以将模块的最新版本号存储在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);'
它运行了更新,没问题,但是当我运行时updatedb
,MYMODULE版本7101仍然显示在更新列表中,尽管它运行时没有出错,并且在检查站点时一切看起来都不错。
有点古怪,晚了6年,但一切都好了吗?