drush updatedb para um único módulo

28

É possível executar a função de atualização de um único módulo via drush? Eu posso ver o drush updatedbque não leva um nome de módulo como argumento e executa todas as atualizações disponíveis. Depois, há drush pm-updatetambém que verifica se há novos arquivos. a documentação diz:

(igual a pm-updatecode + updatedb)

Isso significa que se eu executar drush pm-updatetodas as atualizações disponíveis (mais recentes saídas de função de atualização) serão executadas ? Existe uma maneira de (db) atualizar apenas exatamente um módulo?

nonsenz
fonte
Sei que essa pergunta é bastante antiga, mas estou curioso: por que você quer isso? Normalmente, todo o código é baseado na suposição de que o banco de dados está atualizado. Se você não deseja que a atualização de banco de dados de um módulo específico seja executada, você não deve reverter o módulo inteiro para uma versão anterior?
21413 Marc Marinho
1
um ano depois. Eu precisava disso para o seguinte: Criei um módulo personalizado, mas alterei o layout da tabela posteriormente (ainda no estágio de desenvolvimento), portanto seria útil apenas atualizar o banco de dados com o novo esquema.
Maarten Hartman

Respostas:

10

Não, você não pode.

Se você deseja atualizar cada módulo por conta própria, atualize apenas os arquivos de um único módulo e execute o updateb.

Berdir
fonte
Veja comentário abaixo sobre o uso drush dl(você provavelmente vai querer apagar o antigo primeiro módulo para que você não manter em torno arquivos mais antigos não destinados para a nova versão!)
doublejosh
Existe uma maneira de fazer isso fora do drush?
lathomas64
2
@ahimsauzi deu a resposta correta
cybercampbell
21

No Drush 5.7, você pode executar o comando drush pm-update --no-core module-name. O Drush fará backup automaticamente do módulo atual, fará o download da nova versão e solicitará que você atualize o banco de dados.

ahimsauzi
fonte
6
Isso executará TODAS as atualizações pendentes, não apenas as do módulo que você atualizou.
Moshe weitzman #
Moshe, pode esclarecer? Estou executando o comando acima e, embora o Drush verifique TODAS as atualizações pendentes, apenas o módulo especificado (nome do módulo acima) será atualizado. Estou esquecendo de algo?
ahimsauzi
6
Ele verifica todas as atualizações de código pendentes e atualiza apenas o código do módulo especificado, mas processará todas as atualizações do banco de dados .
precisa saber é
8

Se você deseja executar apenas uma atualização, pode executar drush eval foo_update_33(), por exemplo. Na prática, é um pouco mais complexo que isso, pois você precisa carregar o arquivo .install, mas não muito.

Você também pode tentar a solução @macaleaa:

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

moshe weitzman
fonte
3
Acrescentarei que seria ótimo se alguém fizesse uma extensão Contrib para Drush que permita executar atualizações selecionadas. Isso não é algo seguro de se fazer em geral, mas às vezes você precisa viver perigosamente. Não é apropriado para o núcleo Drush embora (Eu sou o mantenedor Drush)
Moshe Weitzman
2
Por que não apropriado para drush de núcleo? Não é possível que alguém queira impor uma ordem específica de atualizações do banco de dados (para o código já baixado); nesse caso, cada módulo individual precisaria ser atualizado separadamente? Eu estou nessa situação eu mesmo.
precisa saber é
de onde vêm os 33 daqui? é o nome da máquina do módulo?
lathomas64
O 33 faz parte do nome da função de atualização e determina a ordem. E sim, foo é o nome da máquina do módulo. Você pode encontrar as funções em foo.install. Por exemplo, o módulo devel (em devel.install) possui várias funções de atualização: function devel_update_7000é aquela com o número mais baixo e será executada primeiro, então function devel_update_7001, etc.
Ursula
3
Aqui está um exemplo que carrega o arquivo de instalação primeiro:drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
mcaleaa 27/01
5

nem drush up someproject, nem drush upc someprojectparecem parecem atualizar apenas o someprojectmódulo. Uma maneira diferente da que você deseja é:

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

Aqui está a discussão de um tópico semelhante no Drupal.org. Cuidar !

eu mesmo
fonte
Eu apenas tentei, e drush up someprojectFUNCIONA, MAS, infelizmente, verifica TODAS as atualizações disponíveis para os módulos ativados por padrão também (o que não seria necessário), escreve "Atualização disponível" para alguns deles, mas apenas atualiza o projeto específico. Aqui está uma captura de tela: i.imgur.com/TDDmB.png . Como você pode ver, várias atualizações estão disponíveis, mas apenas o xmlsitemap é atualizado usando drush up xmlsitemap.
Sk8erPeter
4

Estou usando o Drush 5.9, e posso atualizar um único módulo com sucesso com este comando:

drush dl *project*

Então, por exemplo, para atualizar o módulo 'devel':

drush up devel
Cajado
fonte
1

Eu acredito que isso agora é possível com o Drush, usando up:

drush up module_name
zgreen
fonte
0

Eu tive uma situação em que uma tabela criada por uma função de atualização ( MYMODULE_update_7101), mas essa tabela estava sendo acessada em código em algum lugar em cada cache limpo e quase todas as chamadas drush (estava basicamente recebendo os nomes dos tipos de entidade para todos os menus e qualquer outra coisa) outro). Correr drush updatedbestava em MYMODULE_update_7101terceiro lugar em vez de primeiro.

Tentei a solução sugerida por @macaleaa e @moshe weitzman de execução:

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

antes da execução drush updatedb, mas isso não ajudou - a execução do drush falhou porque updatedbtentou executar novamente MYMODULE_update_7101()e errou, dizendo que a tabela já existia. Basicamente, o código acima executou a atualização, mas não deixou sua marca no sistema em que a atualização foi executada. Presumivelmente, há várias outras coisas update.phpa serem feitas após a execução de cada atualização para armazenar o número da versão mais recente do módulo no banco de dados, etc.

Analisei update.phpcomo ele realmente executa cada função de atualização e o que faz depois, procurando uma função para chamar que chamaria a função de atualização e também fazer todas as outras coisas. Acabei chegando a isso:

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

Que eu realmente corri com drush:

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

Ele executou a atualização, não há problema, mas a versão 7101 do MYMODULE ainda aparecia na lista de atualizações quando eu corria updatedb, apesar de executada sem erros e tudo parecia bom na inspeção do site.

Um pouco hacky e 6 anos atrasado, mas tudo está bem quando acaba bem?

nerdlinger
fonte