为单个模块更新b


28

是否可以通过Drush执行单个模块的更新功能?我可以看到drush updatedb哪个不使用模块名作为参数,而是运行所有可用的更新。然后这里drush pm-update也检查新文件。该文件说:

(与pm-updatecode + Updatedb相同)

这是否意味着如果我运行drush pm-update所有可用的(更新的update_function出口)更新,就会被执行?有没有办法只(db)更新一个模块?


我知道这个问题已经很老了,但我很好奇:您为什么要那个?通常,所有代码均基于db是最新的假设。如果您不希望运行特定模块的数据库更新,是否不应该将整个模块还原为早期版本?
marcvangend 2013年

1
一年之后。我需要以下这些:我制作了一个自定义模块,但是稍后更改了表布局(仍处于开发阶段),因此使用新模式更新数据库将非常方便。
Maarten Hartman'3

Answers:


10

不,你不能。

如果要单独更新每个模块,则仅更新单个模块的文件,然后运行updatedb。


请参阅以下有关使用的评论drush dl(您可能希望先删除旧模块,以免保留不打算用于新版本的旧文件!)
doublejosh 2012年

有没有办法在匆忙之外做到这一点?
lathomas64 2014年

2
@ahimsauzi给出了正确答案
cybercampbell 2014年

21

在Drush 5.7上,您可以运行命令drush pm-update --no-core module-name。Drush将自动备份当前模块,下载新版本并提示您更新数据库。


6
这将运行所有待处理的更新,而不仅仅是更新模块中的更新。
moshe weitzman

Moshe,可以澄清一下吗?我一直在运行上面的命令,尽管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
我要补充一点,那就是如果有人为Drush做了一个Contrib扩展程序,让您运行选定的更新,那就太好了。一般而言,那不是一件安全的事,但有时您必须危险地生活。不过不适合核心Drush(我是Drush的维护者)
moshe weitzman

2
为什么不适合核心冲刺?难道有人要执行特定顺序的数据库更新(对于已下载的代码),在这种情况下,每个单独的模块都需要分别更新?我本人就是这样。
meustrus

33是从哪里来的?foo是模块的机器名称吗?
lathomas64 2014年

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 2014年

5

既不是drush up someprojectdrush 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
Sk8erPeter

4

我正在使用Drush 5.9,并且可以使用以下命令成功更新单个模块:

drush dl *project*

因此,例如,更新“开发”模块:

drush up devel

1

我相信现在可以使用Drush使用up

drush up module_name

0

我遇到了一种情况,其中有一个由更新函数(MYMODULE_update_7101)创建的表,但是该表正在每个缓存清除和几乎每个drush调用中的某个地方的代码中访问(它基本上是在获取所有菜单等实体类型的名称其他)。运行drush updatedbMYMODULE_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年,但一切都好了吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.