単一モジュールのupdatedbを削除


28

drushを使用して単一モジュールの更新機能を実行することはできますか?私が見ることができますdrush updatedb引数としてモジュール名を取り、利用可能なすべてのアップデートを実行しません。次にdrush pm-update、新しいファイルもチェックします。ドキュメントは言います:

(pm-updatecode + updatedbと同じ)

これは、drush pm-update利用可能な(より新しいupdate_functionが終了する)更新をすべて実行すると、更新が実行されることを意味しますか?1つのモジュールだけを(db)更新する方法はありますか?


私はこの質問がかなり古いことを知っていますが、私は興味があります:なぜあなたはそれが欲しいのですか?通常、すべてのコードは、データベースが最新であるという前提に基づいています。特定のモジュールのdb更新を実行したくない場合、モジュール全体を以前のバージョンに戻すべきではありませんか?
marcvangend

1
一年後。これは次の場合に必要でした。カスタムモジュールを作成しましたが、後でテーブルレイアウトを変更しました(開発段階)ので、新しいスキーマでデータベースを更新するだけで便利です。
マールテンハートマン14年

回答:


10

いいえ、できません。

各モジュールを個別に更新する場合は、1つのモジュールのファイルのみを更新してから、updatedbを実行してください。


使用に関する以下のコメントを参照してくださいdrush dl(おそらく古いモジュールを最初に削除して、新しいバージョン用ではない古いファイルを保持しないようにしてください!)
doublejosh

ブラシ以外でこれを行う方法はありますか?
lathomas64

2
@ahimsauziは正しい答えを与えた
cybercampbell 14年

21

Drush 5.7では、コマンドを実行できますdrush pm-update --no-core module-name。Drushは自動的に現在のモジュールをバックアップし、新しいバージョンをダウンロードして、データベースの更新を促します。


6
これにより、更新したモジュールの更新だけでなく、すべての保留中の更新が実行されます。
モシェワイツマン

モシェ、明確にできますか?上記のコマンドを実行しており、Drushはすべての保留中の更新をチェックしますが、指定されたモジュール(上記のモジュール名)のみが更新されます。何か不足していますか?
アヒムザウジ

6
すべての保留中のコード更新をチェックし、指定されたモジュールのコードのみを更新しますが、すべてのデータベース更新を処理します
meustrus

8

更新を1つだけ実行する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 14年

33は、更新機能の名前の一部であり、順序を決定します。はい、fooはモジュールのマシン名です。関数はfoo.installにあります。例えば、(devel.installで)develのモジュールは、いくつかの更新機能を有する。function devel_update_7000次に、最も低い番号を有するものである、と最初に実行れますfunction devel_update_7001など、
ウルスラ

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

更新関数(MYMODULE_update_7101)によってテーブルが作成された状況がありましたが、そのテーブルはすべてのキャッシュクリアおよびほぼすべてのdrush呼び出しのどこかでコードでアクセスされていました(基本的にはすべてのメニューなどのエンティティタイプの名前を取得していましたその他)。実行中drush updatedbMYMODULE_update_7101、最初ではなく3番目に実行されていました。

私は@macaleaaと@moshe weitzmanが提案する解決策を試してみました:

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

実行する前drush updatedbに、これは助けになりませんでした- updatedb実行MYMODULE_update_7101()を再試行し、テーブルが既に存在すると言ってエラーを出したため、drush runは失敗しました。基本的に、上記のコードは更新を実行していましたが、更新が実行されたことをシステムに残していませんでした。おそらく、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);'

更新は問題なく実行されましたが、実行するとMYMODULEバージョン7101が更新リストに表示されましたがupdatedb、エラーなしで実行され、サイトの検査ですべてが正常に見えました。

少しハッキーで6年遅れですが、すべてが順調に終わりましたか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.