updatedb drush untuk satu modul

28

Apakah mungkin untuk melakukan fungsi pembaruan modul tunggal melalui drush? Saya bisa melihat drush updatedbmana yang tidak menggunakan nama modul sebagai argumen dan menjalankan semua pembaruan yang tersedia. Lalu ada drush pm-updatejuga yang memeriksa file baru. yang dokumentasi mengatakan:

(sama seperti pm-updatecode + updatedb)

Apakah ini berarti jika saya menjalankan drush pm-updatesetiap pembaruan yang tersedia (keluar dari update_function yang lebih baru) akan dilakukan? Apakah ada cara untuk hanya (db) memperbarui persis satu modul?

nonsenz
sumber
Saya tahu pertanyaan ini sudah cukup lama, tetapi saya ingin tahu: Mengapa Anda menginginkan itu? Biasanya, semua kode didasarkan pada asumsi bahwa db mutakhir. Jika Anda tidak ingin pembaruan db dari modul tertentu dijalankan, tidakkah Anda harus mengembalikan seluruh modul ke versi yang lebih lama?
marcvangend
1
satu tahun kemudian. Saya membutuhkan ini untuk yang berikut: Saya telah membuat modul kustom, tetapi mengubah tata letak tabel nanti (masih dalam tahap pengembangan), jadi ini akan berguna untuk hanya memperbarui db dengan skema baru.
Maarten Hartman

Jawaban:

10

Tidak, kamu tidak bisa.

Jika Anda ingin memperbarui masing-masing modul sendiri, perbarui hanya file satu modul dan kemudian jalankan updatedb.

Berdir
sumber
Lihat komentar di bawah tentang penggunaan drush dl(Anda mungkin ingin menghapus modul yang lama terlebih dahulu sehingga Anda tidak menyimpan file yang lebih lama yang tidak ditujukan untuk versi yang baru!)
doublejosh
Apakah ada cara untuk melakukan ini di luar keadaan mabuk?
lathomas64
2
@ahimsauzi memberikan jawaban yang benar
cybercampbell
21

Pada Drush 5.7 Anda dapat menjalankan perintah drush pm-update --no-core module-name. Drush akan secara otomatis membuat cadangan modul saat ini, mengunduh versi baru dan meminta Anda untuk memperbarui database.

ahimsauzi
sumber
6
Itu akan menjalankan SEMUA pembaruan yang tertunda, bukan hanya yang dari modul yang Anda perbarui.
moshe weitzman
Moshe, bisakah klarifikasi? Saya telah menjalankan perintah di atas dan meskipun Drush akan memeriksa SEMUA pembaruan yang tertunda, hanya modul yang ditentukan (nama-modul di atas) yang akan diperbarui. Apakah saya melewatkan sesuatu?
ahimsauzi
6
Ini memeriksa semua pembaruan kode yang tertunda dan hanya memperbarui kode untuk modul yang ditentukan, tetapi akan memproses semua pembaruan basis data .
meustrus
8

Jika Anda ingin menjalankan hanya satu pembaruan, Anda dapat menjalankan drush eval foo_update_33(), misalnya. Dalam praktiknya, ini sedikit lebih rumit dari itu karena Anda harus memuat file .install tetapi tidak banyak.

Anda juga dapat mencoba solusi @ macaleaa:

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

Moshe Weitzman
sumber
3
Saya akan menambahkan bahwa alangkah baiknya jika seseorang membuat ekstensi Contrib untuk Drush yang memungkinkan Anda menjalankan pembaruan yang dipilih. Itu bukan hal yang aman untuk dilakukan secara umum, tetapi terkadang Anda harus hidup dalam bahaya. Tidak tepat untuk Drush inti (saya adalah pengelola Drush)
moshe weitzman
2
Mengapa tidak cocok untuk core drush? Apakah tidak mungkin seseorang ingin menerapkan urutan pembaruan basis data tertentu (untuk kode yang sudah diunduh), dalam hal ini setiap modul individu perlu diperbarui secara terpisah? Saya sendiri dalam situasi seperti itu.
meustrus
dari mana datangnya 33 ini? foo nama mesin dari modul?
lathomas64
33 adalah bagian dari nama fungsi pembaruan dan menentukan urutannya. Dan ya, foo adalah nama mesin dari modul. Anda dapat menemukan fungsinya di foo.install. Misalnya, modul devel (dalam devel.install) memiliki beberapa fungsi pembaruan: function devel_update_7000adalah yang memiliki angka terendah, dan akan dieksekusi terlebih dahulu, lalu function devel_update_7001, dll.
Ursula
3
Berikut adalah contoh yang memuat file instal terlebih dahulu:drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
mcaleaa
5

baik drush up someproject, maupun drush upc someprojecttampaknya tidak hanya memperbarui someprojectmodul. Cara berbeda untuk itu yang Anda inginkan adalah melalui:

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

Berikut ini diskusi topik serupa di Drupal.org. Hati hati !

diriku sendiri
sumber
Saya baru saja mencoba, dan drush up someprojectAPAKAH berhasil, TETAPI sayangnya memeriksa SEMUA pembaruan yang tersedia untuk modul yang diaktifkan secara default juga (yang tidak akan diperlukan), menulis "Pembaruan tersedia" untuk beberapa dari mereka, tetapi HANYA memperbarui proyek tertentu. Ini screenshotnya: i.imgur.com/TDDmB.png . Seperti yang Anda lihat, banyak pembaruan tersedia, tetapi hanya xmlsitemap yang diperbarui menggunakan drush up xmlsitemap.
Sk8erPeter
4

Saya menggunakan Drush 5.9, & dapat memperbarui satu modul dengan sukses dengan perintah ini:

drush dl *project*

Jadi, misalnya, untuk memperbarui modul 'devel':

drush up devel
tongkat
sumber
1

Saya percaya ini sekarang mungkin dengan Drush, menggunakan up:

drush up module_name
zgreen
sumber
0

Saya memiliki situasi di mana tabel dibuat oleh fungsi pembaruan ( MYMODULE_update_7101), tetapi tabel itu sedang diakses dalam kode di suatu tempat di setiap cache jelas dan hampir setiap panggilan drush (itu pada dasarnya mendapatkan nama tipe entitas untuk semua menu dan apa pun lain). Berlari lebih cepat dari drush updatedbyang MYMODULE_update_7101ketiga.

Saya mencoba solusi yang disarankan oleh @macaleaa dan @moshe weitzman untuk menjalankan:

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

sebelum berjalan drush updatedb, tetapi ini tidak membantu - menjalankan drush gagal karenaupdatedb mencoba lagi untuk menjalankan MYMODULE_update_7101()dan kesalahan, mengatakan meja sudah ada. Pada dasarnya, kode di atas telah menjalankan pembaruan, tetapi tidak meninggalkan bekas pada sistem bahwa pembaruan telah dijalankan. Agaknya ada banyak hal lain yang update.phpharus dilakukan setelah menjalankan setiap pembaruan untuk menyimpan nomor versi terbaru untuk modul di db, dll.

Saya pergi update.phpuntuk melihat bagaimana sebenarnya menjalankan setiap fungsi pembaruan dan apa yang dilakukan setelahnya, mencari fungsi untuk memanggil yang akan memanggil fungsi pembaruan dan juga melakukan semua hal lainnya. Saya akhirnya sampai pada ini:

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

Yang sebenarnya saya jalankan dengan drush:

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

Itu menjalankan pembaruan, tidak ada masalah, tetapi kemudian versi MYMODULE 7101 masih muncul di daftar pembaruan ketika saya berlari updatedb , MESKIPUN itu berjalan tanpa kesalahan dan semuanya tampak bagus saat memeriksa situs.

Agak macet dan terlambat 6 tahun, tapi semua baik-baik saja itu berakhir dengan baik?

nerdlinger
sumber