drush updateb cho một mô-đun duy nhất


28

Có thể thực hiện chức năng cập nhật của một mô-đun thông qua drush không? Tôi có thể thấy drush updatedbcái nào không lấy tên modul làm đối số và chạy tất cả các bản cập nhật có sẵn. Sau đó, drush pm-updatecũng có kiểm tra các tập tin mới. các tài liệu nói:

(giống như pm-updatecode + updateb)

Điều này có nghĩa là nếu tôi chạy drush pm-updatemọi bản cập nhật có sẵn (bản cập nhật update_feft mới hơn) sẽ được thực hiện? Có cách nào để chỉ cập nhật (db) chính xác một mô-đun không?


Tôi biết câu hỏi này khá cũ, nhưng tôi tò mò: Tại sao bạn lại muốn điều đó? Thông thường, tất cả các mã dựa trên giả định rằng db được cập nhật. Nếu bạn không muốn cập nhật db của một mô-đun cụ thể để chạy, bạn có nên hoàn nguyên toàn bộ mô-đun về phiên bản cũ hơn không?
marcvangend

1
một năm sau Tôi cần điều này cho các mục sau: Tôi đã tạo một mô-đun tùy chỉnh, nhưng đã thay đổi bố cục bảng sau này (vẫn đang trong giai đoạn phát triển), vì vậy điều này sẽ hữu ích khi chỉ cập nhật db với lược đồ mới.
Maarten Hartman

Câu trả lời:


10

Không, bạn không thể.

Nếu bạn muốn tự cập nhật từng mô-đun, chỉ cập nhật các tệp của một mô-đun và sau đó chạy updateb.


Xem bình luận bên dưới về cách sử dụng drush dl(có thể bạn muốn xóa mô-đun cũ trước để bạn không phải loanh quanh các tệp cũ không dành cho phiên bản mới!)
doublejosh

Có cách nào để làm điều này ngoài drush?
lathomas64

2
@ahimsauzi đã đưa ra câu trả lời chính xác
cybercampbell

21

Trên Drush 5.7 bạn có thể chạy lệnh drush pm-update --no-core module-name. Drush sẽ tự động sao lưu mô-đun hiện tại, tải xuống phiên bản mới và nhắc bạn cập nhật cơ sở dữ liệu.


6
Điều đó sẽ chạy TẤT CẢ các bản cập nhật đang chờ xử lý, không chỉ các bản cập nhật từ mô-đun bạn đã cập nhật.
moshe weitzman

Moshe, có thể làm rõ? Tôi đã chạy lệnh trên và mặc dù Drush sẽ kiểm tra TẤT CẢ các bản cập nhật đang chờ xử lý, chỉ có mô-đun được chỉ định (tên mô-đun ở trên) sẽ được cập nhật. Tui bỏ lỡ điều gì vậy?
ahimsauzi

6
Nó kiểm tra tất cả các cập nhật mã đang chờ xử lý và chỉ cập nhật mã cho mô-đun được chỉ định, nhưng nó sẽ xử lý tất cả các cập nhật cơ sở dữ liệu .
meustrus

8

Nếu bạn muốn chạy chỉ một bản cập nhật, bạn có thể chạy drush eval foo_update_33()chẳng hạn. Trong thực tế, nó phức tạp hơn một chút khi bạn phải tải tệp .install nhưng không nhiều.

Bạn cũng có thể thử giải pháp @macaleaa:

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


3
Tôi sẽ nói thêm rằng sẽ thật tuyệt nếu ai đó thực hiện một phần mở rộng Contrib cho Drush cho phép bạn chạy các bản cập nhật được chọn. Đó không phải là một điều an toàn để làm nói chung, nhưng đôi khi bạn phải sống nguy hiểm. Không phù hợp với Drush cốt lõi (Tôi là người duy trì Drush)
moshe weitzman

2
Tại sao không thích hợp cho drush lõi? Không phải ai đó muốn thực thi một thứ tự cập nhật cơ sở dữ liệu cụ thể (đối với mã đã được tải xuống), trong trường hợp nào mỗi mô-đun riêng lẻ sẽ cần phải được cập nhật riêng? Tôi đang ở trong một tình huống như vậy bản thân mình.
meustrus

33 đến từ đâu? là foo tên máy của mô-đun?
lathomas64

33 là một phần của tên chức năng cập nhật và xác định thứ tự. Và vâng, foo là tên máy của mô-đun. Bạn có thể tìm thấy các chức năng trong foo.install. Ví dụ: mô-đun phát (trong devel.install) có một số chức năng cập nhật: function devel_update_7000là chức năng có số thấp nhất và sẽ được thực hiện trước, sau đó function devel_update_7001, v.v.
Ursula

3
Đây là một ví dụ tải tập tin cài đặt trước:drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
mcaleaa

5

không drush up someproject, drush upc someprojectdường như cũng không chỉ cập nhật someprojectmô-đun. Một cách khác để những gì bạn muốn là thông qua:

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

Đây là thảo luận về một chủ đề tương tự trên Drupal.org. Bảo trọng !


Tôi vừa thử, và drush up someprojectKHÔNG hoạt động, NHƯNG không may, nó cũng kiểm tra TẤT CẢ các bản cập nhật có sẵn cho các mô-đun được bật theo mặc định (không cần thiết), viết "Cập nhật khả dụng" cho một số trong số chúng, nhưng CHỈ cập nhật dự án cụ thể. Đây là một ảnh chụp màn hình: i.imgur.com/TDDmB.png . Như bạn có thể thấy, nhiều bản cập nhật có sẵn, nhưng chỉ xmlsitemap được cập nhật bằng cách sử dụng drush up xmlsitemap.
Sk8erPeter

4

Tôi đang sử dụng Drush 5.9 và có thể cập nhật một mô-đun duy nhất thành công với lệnh này:

drush dl *project*

Vì vậy, ví dụ, để cập nhật mô-đun 'phát':

drush up devel

1

Tôi tin rằng điều này hiện có thể với Drush, sử dụng up:

drush up module_name

0

Tôi đã có một tình huống trong đó một bảng được tạo bởi một hàm cập nhật ( MYMODULE_update_7101), nhưng bảng đó đã được truy cập bằng mã ở đâu đó trong mỗi bộ nhớ cache và hầu như mọi cuộc gọi drush (về cơ bản là lấy tên của các loại thực thể cho tất cả các menu và bất cứ thứ gì khác). Chạy drush updatedblà chạy MYMODULE_update_7101thứ ba thay vì đầu tiên.

Tôi đã thử giải pháp được đề xuất bởi @macaleaa và @moshe weitzman về việc chạy:

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

trước khi chạy drush updatedb, nhưng điều này không giúp được gì - việc chạy drush thất bại vì updatedbđã thử chạy lại MYMODULE_update_7101()và bị lỗi, nói rằng bảng đã tồn tại. Về cơ bản, đoạn mã trên đã chạy bản cập nhật, nhưng không để lại dấu ấn trên hệ thống mà bản cập nhật đã được chạy. Có lẽ có cả đống công việc khác update.phpphải làm sau khi chạy mỗi bản cập nhật để lưu số phiên bản mới nhất cho mô-đun trong db, v.v.

Tôi đã đi qua update.phpđể xem làm thế nào nó thực sự chạy từng chức năng cập nhật và những gì nó làm sau đó, tìm kiếm một chức năng để gọi đó sẽ gọi chức năng cập nhật và cũng thực hiện tất cả các công cụ khác. Tôi đã kết thúc việc này:

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

Mà tôi thực sự chạy với drush:

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

Nó chạy bản cập nhật, không có vấn đề gì, nhưng sau đó MYMODULE phiên bản 7101 vẫn hiển thị trong danh sách cập nhật khi tôi chạy updatedb, ALTHOUGH nó chạy mà không bị lỗi và mọi thứ đều tốt khi kiểm tra trang web.

Một chút hack và trễ 6 năm, nhưng tất cả đều kết thúc tốt đẹp?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.