2009-04-17 45 views
12

Tôi duy trì một ứng dụng nền tảng chéo, dựa trên PyQt chạy trên máy Mac và cửa sổ Linux.Tự cập nhật ứng dụng py2exe/py2app

Các phiên bản windows và mac được phân phối bằng py2exe và py2app, tạo ra các gói khá lớn (~ 40 MB).

Tôi muốn thêm một "cập nhật tự động" chức năng, dựa trên các bản vá lỗi để hạn chế tải kích thước:

  • kiểm tra cho các phiên bản mới trên một máy chủ http
  • tải về các bản vá lỗi cần thiết để cập nhật cuối cùng phiên bản
  • áp dụng danh sách các bản vá lỗi và khởi động lại ứng dụng

tôi có một số câu hỏi sau:

  • cách ưa thích để cập nhật ứng dụng cửa sổ là gì vì các tệp đang mở bị khóa và không thể ghi đè?
  • làm cách nào để chuẩn bị và áp dụng các bản vá lỗi? có lẽ sử dụng bsdiff/pspatch?

[cập nhật]

tôi đã thực hiện một lớp đơn giản để làm cho các bản vá lỗi với bsdiff, mà là rất hiệu quả như quảng cáo trên trang web của họ: một diff trên hai phiên bản py2exe của ứng dụng của tôi (~ 75 MB không nén) tạo ra một bản vá 44 kB! Đủ nhỏ cho tôi, tôi sẽ dính vào định dạng này.

Mã có sẵn trong gói 'cập nhật' là pyflu, một thư viện mã Python nhỏ.

+0

Bạn quan tâm đến cách bạn định xử lý các bản cập nhật kéo dài nhiều phiên bản/cập nhật. ví dụ. một người dùng có 1.0, sau đó vào thời điểm họ tiếp theo thử chạy nó đã có (nói) 10 cập nhật? Bạn có tạo ra các bản vá theo yêu cầu không? Với bộ nhớ đệm tôi đoán nó sẽ không quá tệ, nhưng giả sử bạn có một số mã phía máy chủ có sẵn ... –

+1

Nếu người dùng bỏ lỡ 10 bản cập nhật trình cập nhật sẽ tải xuống 10 bản vá cần thiết để chuyển sang phiên bản mới nhất và áp dụng chúng bởi một. Không có mã phía máy chủ, chỉ cần một máy chủ apache đơn giản hiển thị nội dung thư mục. –

Trả lời

4

Tôi không tin rằng py2exe hỗ trợ cập nhật vá.Tuy nhiên, nếu bạn không gói toàn bộ gói vào một EXE đơn lẻ (py2exe website example - dưới cùng của trang), bạn có thể lấy các bản cập nhật nhỏ hơn bằng cách thay thế một số tệp nhất định, chẳng hạn như tệp EXE. Điều này có thể làm giảm đáng kể kích thước cập nhật của bạn.

Bạn có thể viết riêng ứng dụng cập nhật, có thể được tải xuống/chạy từ bên trong ứng dụng của bạn. Ứng dụng này có thể khác nhau đối với mọi bản cập nhật vì các tệp cần được cập nhật có thể thay đổi.

Khi ứng dụng khởi chạy trình cập nhật, nó sẽ cần phải đóng chính nó để các tệp có thể bị ghi đè. Khi trình cập nhật hoàn tất, bạn có thể mở lại ứng dụng trước khi đóng ứng dụng.

+0

Ngoài sự tò mò tinh khiết, tại sao một con trăn thực thi được, hoặc bất kỳ tệp thực thi nào khác cho vấn đề đó, không hỗ trợ vá lỗi nhị phân? Không phải là một bản vá nhị phân chỉ NewVersion.exe trừ OldVersion.exe, với các bản vá thay đổi byte cần thiết để làm cho nó NewVersion.exe? – ryeguy

3

Tôi không biết về các bản vá, nhưng trên OS X "tiêu chuẩn" cho điều này với ứng dụng ca cao là Sparkle. Về cơ bản nó "appcasting". Nó tải xuống ứng dụng đầy đủ mỗi lần. Nó có thể là giá trị nhìn vào nó cho cảm hứng.

Tôi tưởng tượng trên OS X bạn có thể tải xuống phần thực sự của gói ứng dụng chứa mã cụ thể của bạn (không phải là libs, v.v. được đóng gói) và sẽ khá nhỏ và dễ thay thế trong gói .

Trên Windows, bạn có thể thực hiện một mẹo tương tự bằng cách không gộp ứng dụng của bạn vào một exe - do đó cho phép bạn thay đổi một tệp đã thực sự thay đổi.

Tôi tưởng tượng mã Python thực tế của bạn sẽ nhỏ hơn 40Mb, vì vậy đó có thể là cách để thực hiện.

Để thay thế ứng dụng đang chạy, trước tiên bạn cần tìm vị trí của ứng dụng, vì vậy bạn có thể sử dụng sys.executable để giúp bạn bắt đầu, sau đó bạn có thể bỏ qua quy trình con để giết quá trình cha mẹ và có con thực hiện thay thế thực tế?

Tôi hiện đang phát xung quanh với một ứng dụng wxPython nhỏ và tự hỏi chính xác vấn đề này. Tôi rất muốn nghe về những gì bạn nghĩ ra.

Bạn cũng lớn đến mức nào khi được nén? Nếu nó nén tốt thì có lẽ bạn vẫn có thể đủ khả năng để gửi toàn bộ điều.

+1

Ứng dụng này là 40 MB * nén * :) Đó là tất cả các DLL và thời gian chạy python chiếm phần lớn của nó, mã của tôi chỉ là 500 KB. –

1

Vì py2exe đặt tất cả các mô-đun đã biên dịch của ứng dụng vào tệp ZIP, bạn có thể cố gắng cập nhật tệp này bằng cách tạo tập lệnh cập nhật tệp từ một tập hợp tệp nhất định. Sau đó thay thế các tệp còn lại đã thay đổi (ít nhất là nếu có).

+0

Đôi khi bạn cũng muốn cập nhật các tệp DLL (ví dụ: khi thay đổi phiên bản Qt, thêm phụ thuộc mô-đun mở rộng mới, v.v.), tôi không muốn kiểm tra thủ công nếu mọi thứ hoạt động mỗi khi tôi thực hiện bản phát hành. –

0

Bài đăng cũ, nhưng tôi nghĩ tôi muốn đề cập đến pyupdater bằng pyinstaller.

Nó hỗ trợ Amazon và scp.

Trong tương lai, theo các bài đăng github gần đây, họ có kế hoạch hỗ trợ các lựa chọn thay thế miễn phí.

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