2008-10-24 29 views
54

Nhiều chương trình bao gồm trình cập nhật tự động, nơi chương trình đôi khi trông trực tuyến để cập nhật và sau đó tải xuống và áp dụng mọi bản cập nhật được tìm thấy. Lỗi chương trình được sửa, các tệp hỗ trợ được sửa đổi và mọi thứ (thường) được thực hiện tốt hơn.Tôi nên triển khai trình cập nhật tự động như thế nào?

Thật không may cho dù tôi có gặp khó khăn như thế nào đi nữa, tôi không thể tìm thấy thông tin về quy trình này ở bất kỳ đâu. Có vẻ như các trình cập nhật tự động đã được triển khai có hoặc là độc quyền hoặc không được coi là quan trọng.

Có vẻ khá dễ dàng để triển khai hệ thống tìm kiếm các bản cập nhật trên mạng và tải chúng xuống nếu chúng có sẵn. Phần đó của trình cập nhật tự động sẽ thay đổi đáng kể từ triển khai sang triển khai. Câu hỏi đặt ra là cách tiếp cận khác nhau của áp dụng các bản vá lỗi là gì. Chỉ cần tải xuống các tệp và thay thế tệp cũ bằng các tệp mới, chạy tập lệnh di chuyển đã được tải xuống, phần vá lỗi của hệ thống, v.v ...? Các khái niệm được ưa thích, nhưng các ví dụ trong Java, C, Python, Ruby, Lisp, vv sẽ được đánh giá cao.

+2

Tôi đã xem google [omaha] (http://code.google.com/p/omaha/). Có thể là một cái gì đó để xem xét nếu bạn vẫn còn quan tâm (4 năm sau ..) – funseiki

Trả lời

45

Tôi nghĩ rằng "ngôn ngữ bất khả tri" sẽ là một yếu tố hạn chế ở đây. Các ứng dụng có rất nhiều hình dạng và kích thước mà không có câu trả lời một kích thước phù hợp. Tôi đã thực hiện một số tự động cập nhật trong một số ngôn ngữ, và không có hai là tương tự.

Triết lý chung nhất là ứng dụng sẽ kiểm tra một số vị trí nhà (địa chỉ web, truy vấn web, vị trí mạng công ty, v.v.) để hỏi xem phiên bản hiện tại hay yêu cầu phiên bản mới nhất là gì. Nếu câu trả lời yêu cầu cập nhật, quá trình đó sẽ khác nhau đối với từng trường hợp.

Cách thay thế phổ biến là mời vị trí nhà để chạy tập lệnh khi ứng dụng được khởi chạy. Ví dụ, tập lệnh có thể kiểm tra phiên bản, tải xuống các bản cập nhật nếu cần và yêu cầu phản hồi sử dụng.

Chúng tôi có thể giúp đỡ tốt hơn nếu bạn thu hẹp các tham số.

CẬP NHẬT: Cách tiếp cận để "vá" cũng phụ thuộc vào bản chất của ứng dụng và có sự đa dạng rất rộng ở đây. Ví dụ: nếu bạn có một tệp thực thi duy nhất, thì có thể là thực tế nhất để thay thế tệp thi hành. Nếu ứng dụng của bạn có nhiều tệp, bạn nên tìm cách để giảm thiểu số lượng tệp được thay thế. Nếu ứng dụng của bạn được tùy biến cao hoặc được tham số hóa, bạn nên cố gắng giảm thiểu nỗ lực tái điều chỉnh. Nếu ứng dụng của bạn sử dụng mã được giải thích (ví dụ như ứng dụng Excel VBA hoặc ứng dụng MS Access MDB), thì bạn có thể thay thế các phần của mã. Trong một ứng dụng Java, bạn chỉ có thể cần phải thay thế một tệp JAR, hoặc thậm chí là một tập con của các nội dung JAR. Bạn cũng sẽ cần phải có cách để nhận ra phiên bản máy khách hiện tại và cập nhật nó một cách thích hợp. Tôi có thể tiếp tục, nhưng tôi hy vọng bạn thấy điểm của tôi về sự đa dạng. Đây là một trong số đó nhiều lần khi câu trả lời hay nhất thường bắt đầu bằng "Vâng, nó phụ thuộc ...!" Đó là lý do tại sao rất nhiều câu trả lời bao gồm "Hãy thu hẹp các tham số".

2

Cách tiếp cận đơn giản nhất là yêu cầu truy vấn chương trình của bạn một máy chủ (trang web) để xem có bản cập nhật hay không. Nếu có bản cập nhật, bạn có thể hiển thị thông báo cho người dùng nhắc họ tải xuống phiên bản mới hơn và cung cấp liên kết.

Giải pháp thay thế và phức tạp hơn là tạo một dịch vụ cửa sổ nhỏ (hoặc unix daemon) kiểm tra định kỳ xem có bản cập nhật hay không, dịch vụ này có thể tải xuống bản cập nhật và khởi chạy trình cài đặt.

Kiến trúc chung là bạn có một máy chủ trung tâm mà bạn kiểm soát để biết phiên bản mới nhất và nơi nhận phiên bản mới nhất. Sau đó, các chương trình truy vấn máy chủ. Tôi sẽ không bao gồm mã mẫu vì nó là bị đơn cao trên máy chủ và định dạng bạn chọn.Nó không phải là khủng khiếp khó khăn mặc dù.

+0

Câu hỏi tôi đã đi (Tôi đã chỉnh sửa câu hỏi để phản ánh điều này) là làm thế nào là các bản vá lỗi được áp dụng? – num1

8

Trước tiên, bạn cần tệp trên trang web ứng dụng của mình với phiên bản mới nhất. Cách tốt nhất tôi nghĩ để có bảng SQL đặc biệt cho tác vụ này và tự động điền nó sau khi xuất bản phiên bản mới/hoàn thành xây dựng hàng đêm. Ứng dụng của bạn tạo chuỗi mới yêu cầu liên kết http được tích hợp với phiên bản và so sánh với hiện tại. Sử dụng .NET có thể sử dụng mã như sau:

Version GetLatestVersion() { 
HttpWebRequestrequest = (HttpWebRequest)WebRequest.Create(new Uri(new Uri(http://example.net), "version.txt)); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
if (request.HaveResponse) 
{ 
    StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.Default); 
    return new Version(stream.ReadLine()); 
} 
else 
{ 
    return null; 
} 
} 

Version latest = GetLatestVersion(); 
Version current = new Version(Application.ProductVersion); 
if (current < latest) 
{ 
    // you need an update 
} 
else 
{ 
    // you are up-to-date 
} 

Trong ví dụ này, version.php chỉ trong một chuỗi đơn giản như 1.0.1.0.

Một mẹo khác tôi có thể cung cấp - cách tải xuống bản cập nhật. Tôi thích rất nhiều ý tưởng tiếp theo: trong tài nguyên của ứng dụng của bạn có một chuỗi mã CLR mà bạn biên dịch một cách nhanh chóng (sử dụng CodeDom) vào một thư mục tạm thời, ứng dụng chính gọi nó và đi đến gần. Updater đọc đối số, cài đặt hoặc đăng ký và tải xuống các mô-đun mới. Và gọi ứng dụng chính xóa tất cả các tệp tạm thời. Làm xong!

(Nhưng tất cả mọi thứ ở đây là về NET)

18

Hãy chắc chắn cũng phải xem xét những tác động an ninh của mút xuống thông tin về bản cập nhật, cũng như những chương trình cập nhật tự.

Bạn có tin cậy nguồn tải xuống không? Bạn có thể gọi điện về nhà để nhận bản cập nhật của bạn, nhưng nếu có một người đàn ông ở giữa chuyển hướng đến một máy chủ độc hại. Kết nối an toàn HTTPS hoặc tương tự sẽ giúp, nhưng hãy kiểm tra kỹ các bit mà bạn đã tải xuống bằng cách sử dụng kiểm tra chữ ký kỹ thuật số.

0

Trong cài đặt Java-Webstart, bạn bắt đầu tệp JNLP, sau đó kích hoạt tải xuống tệp Jar cần thiết để chạy ứng dụng. Mỗi lần webstart kiểm tra xem có phiên bản mới hơn của Jars hay không và sẽ tải chúng xuống thay thế cho các bộ nhớ đệm cục bộ. Với một công cụ có tên là jardiff, bạn sẽ chỉ tạo ra những khác biệt đối với các lọ mới hơn và phân phối chúng thông qua máy chủ (ví dụ: chỉ nhận được bản cập nhật).

Ưu điểm:

  • luôn được cập nhật

Nhược điểm:

  • bạn cần một máy chủ ứng dụng (tomcat, JBoss) để phân phối các tập tin
  • bạn cần kết nối internet để nhận đơn đăng ký
+0

Chỉ cần lưu ý rằng bạn chỉ cần một máy chủ web để phân phối các JAR. Tomcat là một trong những máy chủ như vậy và cũng thực hiện các đặc tả servlet. –

2

Đây không phải là một câu trả lời hoàn chỉnh, mà là một ví dụ về cơ chế tự động cập nhật mà tôi đã triển khai gần đây. Tình hình này hơi khác một chút so với kiểu ứng dụng người dùng Firefox truyền thống, vì nó là một công cụ nội bộ được sử dụng trong công việc.

Về cơ bản, đó là một tập lệnh nhỏ quản lý hàng đợi các nhánh Subversion được xây dựng và đóng gói trong trình cài đặt. Nó đọc một tệp nhỏ, trong đó tên của các nhánh được viết, lấy tên đầu tiên, viết lại nó ở cuối tệp và khởi chạy quá trình xây dựng, bao gồm việc gọi một loạt các tập lệnh. Cấu hình cho mỗi nhánh để xây dựng được viết bằng một tệp .INI, được lưu trữ trong một kho lưu trữ Subversion cùng với chính công cụ đó.

Vì công cụ này chạy trên một số máy tính, tôi muốn có cách tự động cập nhật nó trên tất cả các máy ngay khi tôi thực hiện thay đổi cho chính công cụ hoặc đến tập lệnh cấu hình.

Cách tôi thực hiện nó rất đơn giản: khi tôi khởi chạy công cụ, nó sẽ trở thành "vỏ bên ngoài". lớp vỏ bên ngoài này không 2 điều rất đơn giản:

  • svn update về bản thân và về các tập tin cấu hình
  • ra mắt bản thân một lần nữa, lần này là "vỏ bên trong", một trong đó thực sự xử lý một cấu hình (và sau đó thoát lần nữa).

Hệ thống cập nhật đơn giản trong vòng lặp này đã phục vụ chúng tôi rất tốt trong vài tháng nay. Nó rất thanh lịch, bởi vì nó là khép kín: trình cập nhật tự động là chính chương trình. Bởi vì "vỏ bên ngoài" (phần tự động cập nhật) rất đơn giản, không quan trọng là nó không được hưởng lợi từ các bản cập nhật là "vỏ bên trong" (được thực thi từ tệp nguồn cập nhật mỗi lần).

+0

FYI, Metasploit cũng sử dụng "cập nhật svn" cho quá trình cập nhật. –

5

Giải pháp đơn giản nhất (được nhiều chương trình sử dụng) đang chạy trình gỡ cài đặt cho phiên bản trước và chạy trình cài đặt cho phiên bản mới (tùy chọn bỏ qua câu hỏi mà người dùng đã trả lời, như EULA). Điểm duy nhất là phiên bản mới phải có khả năng đọc các tùy chọn cấu hình từ phiên bản cũ. Ngoài ra, trên Windows bạn không thể xóa một tập tin thực thi đang được sử dụng, vì vậy có thể bạn sẽ muốn thả một tập tin thực thi nhỏ trong thư mục Temp, chạy toàn bộ quá trình và sau đó xóa nó ở phần cuối của cá thể. Ví dụ: của phiên bản mới được phát hành (hoặc chỉ register it to be deleted at the next reboot).

+12

trong khi bạn không thể xóa EXE đang sử dụng, bạn có thể đổi tên nó - vì vậy hãy tự đổi tên phiên bản đang chạy, bật trong phiên bản mới và kiểm tra sự tồn tại của phiên bản đã được đổi tên ở lần khởi động tiếp theo và xóa nó. –

+0

Thật tuyệt vời! Cảm ơn vì tiền boa! –

0

Đọc câu trả lời của Carl Seleborgs đã cho tôi một số ý tưởng về cách một kho lưu trữ mã chung có thể hữu ích.

svn đi kèm với công cụ được gọi là svnsync, loại hoạt động như xuất khẩu svn nhưng theo dõi bản sửa đổi thực tế mà bạn xuất.

Ai đó có thể sử dụng hệ thống này để chỉ tìm nạp các tệp đã thay đổi từ bản sửa đổi thực tế của người dùng.

Trong thực tế, bạn sẽ có một kho lưu trữ với các tệp nhị phân được biên dịch và chạy svnsync sẽ chỉ tìm nạp các tệp nhị phân đã được sửa đổi. Nó cũng có thể hợp nhất các thay đổi cục bộ với các tệp cấu hình dựa trên văn bản với các tùy chọn cấu hình mới.

0

Chức năng cài đặt bản vá cho chương trình về cơ bản là một trong những chức năng cơ bản của trình cài đặt. Phần mềm cài đặt được ghi lại ở nhiều nơi nhưng thường trên cơ sở mỗi trình cài đặt: Có Microsoft Installer (với Cài đặt Mở rộng Shield), Ruby gems, Java .jar tệp, các hệ thống quản lý gói Linux khác nhau (RPM, Apt-get) và các thiết bị khác.

Đây là tất cả các hệ thống phức tạp giải quyết vấn đề về chương trình vá nói chung nhưng đối với các hệ thống hơi khác nhau. Để quyết định điều gì là tốt nhất cho bạn, hãy xem xét ứng dụng nào của hệ thống của bạn giống nhất. Lăn của riêng bạn là tốt nhưng nhìn vào các hệ thống này là một nơi để bắt đầu.

1

Do cập nhật tự động là một tình huống phổ biến, hầu hết các ngôn ngữ đều có ít nhất một gói để hỗ trợ việc này.(Dưới đây tôi liệt kê một số gói có sẵn)

Một trong những ý tưởng thực sự hay là phân phối ClickOnce cho .NET. Đây là trình cài đặt ứng dụng của bạn và cài đặt trong ngữ cảnh người dùng, vì vậy không cần quyền quản trị viên. Bạn có thể cấu hình ClickOnce trong xuất bản của bạn để kiểm tra các bản cập nhật mà mỗi ứng dụng bắt đầu.

Java có Java Web Start cung cấp cùng một loại chức năng cho các ứng dụng java.

Delphi có nhiều bài viết về cập nhật tự động, Torry có danh sách WebUpdate components, ví dụ GoUpdater dường như có phạm vi chức năng rất rộng.

Tất cả đều sử dụng chia sẻ trang web/mạng để kiểm tra phiên bản mới và truy xuất bản vá hoặc tệp cài đặt hoàn chỉnh và chạy nó. Vì vậy, bạn nên cố gắng tìm một gói tốt đẹp cho ứng dụng của bạn, để giúp bạn tiết kiệm những rắc rối của việc phát triển và duy trì giải pháp của riêng bạn.

0

Bạn có thể viết mô-đun nội bộ của ứng dụng để thực hiện cập nhật. Bạn có thể viết một ứng dụng mini bên ngoài để cập nhật.

Cũng xem xét công nghệ biên dịch .NET trực tuyến, có thể tạo ứng dụng nhỏ như vậy khi đang chạy theo yêu cầu. Ví dụ: http://fly.sf.net/

2

Một điều chưa thực sự được đề cập là bạn nên nghiêm túc xem xét rằng người dùng đang chạy chương trình của bạn có thể không thực sự có đủ đặc quyền để nâng cấp nó. Điều này sẽ khá phổ biến ít nhất cho người dùng doanh nghiệp, có lẽ ít hơn cho người dùng gia đình.

Tôi luôn làm việc với một (tự áp đặt) tài khoản hạn chế vì lý do an ninh và nó luôn luôn pisses me mà hầu hết các tính năng tự động bộ nâng cấp đơn giản cho rằng tôi đang chạy như admin và sau đó sau khi tải về chỉ thất bại và cung cấp không cách khác để thực hiện cập nhật khác hơn là thực sự đóng chương trình và chạy lại nó trong ngữ cảnh quản trị. Hầu hết thậm chí không cache bản cập nhật đã tải xuống và phải làm lại tất cả.

Sẽ tốt hơn nếu trình cập nhật tự động chỉ cần nhắc thông tin đăng nhập của quản trị viên khi cần và tiếp tục với nó.

+0

Đó chính xác là những gì mà trình cập nhật của chúng tôi thực hiện. wyUpdate (xem: http://wyday.com/wyupdate/) là một trình cập nhật mã nguồn mở được viết bằng C#. –

0

Tôi sẽ giả sử câu trả lời cho Windows.

Cách này có vẻ hoạt động tốt.

Trong trình cài đặt thực hiện:
1. Tạo dịch vụ bắt đầu thủ công chạy dưới dạng LocalSystem khi bắt đầu cập nhật rồi dừng.
2. Thay đổi quyền dịch vụ để tất cả người dùng có thể bắt đầu dịch vụ (nếu tất cả người dùng có thể cập nhật quyền quản trị).
3. Thay đổi chương trình chính để kiểm tra các cập nhật khi bắt đầu sử dụng một cơ chế đơn giản. Nếu nó phát hiện một bản cập nhật, hãy nhắc nếu người dùng muốn áp dụng nó.
4. Nếu người dùng chấp nhận bản cập nhật, hãy khởi động dịch vụ.

Nếu kiến ​​trúc cho phép, hãy tạo một cách để theo dõi cập nhật khi nó đang chạy.

+1

Dịch vụ khởi động thủ công chạy dưới dạng LocalSystem mà tất cả người dùng có thể bắt đầu? Điều này nghe giống như một thảm họa an ninh đang chờ xảy ra. –

+0

Chỉ khi cập nhật phần mềm là một thảm họa bảo mật. Khả năng khởi động một dịch vụ không phải là khả năng tấn công nó trừ khi họ có thể ghi vào nhị phân dịch vụ. – Joshua

-1

Nếu bạn đang tìm kiếm một giải pháp cập nhật phần mềm đa nền tảng, hãy nhìn vào www.updatenode.com

Một số điểm nổi bật:

  • miễn phí cho mã nguồn mở dự án
  • cross-platform & Open Source cập nhật công cụ khách hàng
  • đã bản địa hóa cho các ngôn ngữ quan trọng nhất
  • dễ tích hợp và dễ dàng le
  • đám mây nền tảng quản lý dựa để xác định và quản lý cập nhật
  • cung cấp hỗ trợ thêm cho việc hiển thị thông báo (thông báo về các sự kiện mới, các sản phẩm, vv)
  • giao diện web đang mở (bạn có thể tạo ra khách hàng của riêng bạn bằng cách sử dụng dịch vụ)
  • nhiều thống kê sử dụng, như các hệ thống sử dụng hoạt động, vị trí địa lý, phiên bản sử dụng vv
  • API Android cập nhật ứng dụng di động

Chỉ cần thử nó.

BTW, tôi là thành viên của nhóm dev dành cho khách hàng nguồn mở. :)

+1

Bạn có làm việc cho updatenode.com không? Bởi vì bạn đã trả lời một số câu hỏi cũ đề xuất nó. – crashmstr

+0

Tôi đang đóng góp vào sự phát triển khách hàng nguồn mở: https://bitbucket.org/updatenode/unclient – sarahara

+1

Có lẽ bạn nên đọc: [Làm cách nào để đề cập đến các sản phẩm của riêng tôi trong câu trả lời?] (Http: //meta.stackexchange. com/q/15787) – crashmstr

Các vấn đề liên quan