13

Linux の Mac と Windows で動作する PyQt に基づくクロス プラットフォーム アプリケーションを維持しています。

Windows および Mac バージョンは、py2exe および py2app を使用して配布され、非常に大きなバンドル (~40 MB) を生成します。

ダウンロードサイズを制限するパッチに基づいて、「自動更新」機能を追加したいと思います。

  • http サーバーで新しいバージョンを確認する
  • 最新バージョンへの更新に必要なパッチをダウンロードする
  • パッチリストを適用し、アプリケーションを再起動します

いくつか質問があります:

  • 開いているファイルはロックされており、上書きできないため、Windows アプリケーションを更新するための推奨される方法は何ですか?
  • パッチを準備して適用するにはどうすればよいですか? おそらくbsdiff/pspatchを使用していますか?

[アップデート]

bsdiffでパッチを作成するための簡単なクラスを作成しました。これは、サイトで宣伝されているように非常に効率的です。私のアプリの 2 つの py2exe バージョン (圧縮されていない ~75 MB) の diff は、44 kB のパッチを生成します。私には十分小さいので、この形式に固執します。

このコードは、Python コードの小さなライブラリであるpyfluの「更新」パッケージで入手できます。

4

5 に答える 5

4

py2exe がパッチ適用された更新をサポートしているとは思えません。ただし、パッケージ全体を 1 つの EXE にバンドルしない場合 ( py2exe Web サイトの例- ページの下部)、EXE ファイルなどの特定のファイルを置き換えるだけで、小規模な更新を行うことができます。これにより、更新のサイズを大幅に削減できます。

アプリケーション内からダウンロード/実行できる個別のアップデーター appを作成できます。更新が必要なファイルが変わる可能性があるため、このアプリは更新ごとに異なる場合があります。

アプリケーションがアップデーターを起動したら、ファイルを上書きできるようにアプリケーション自体を閉じる必要があります。アップデーターが完了すると、アプリケーション自体を閉じる前にアプリケーションを再度開くことができます。

于 2009-04-17T13:48:34.447 に答える
3

パッチについてはわかりませんが、OS X では、ココア アプリでの「標準」はSparkleです。基本的に「アプリキャスティング」を行います。毎回完全なアプリをダウンロードします。インスピレーションを得るために見る価値があるかもしれません。

OS Xでは、特定のコード(パッケージ化されたライブラリなどではなく)を含むアプリバンドルの実際の部分をダウンロードするだけで、かなり小さく、バンドルで簡単に置き換えることができると思います。

Windows では、アプリを 1 つの exe にバンドルしないことで、おそらく同様のトリックを行うことができます。したがって、実際に変更された 1 つのファイルを変更できます。

実際の Python コードは 40Mb よりもはるかに小さいと思いますので、おそらくそれが適切な方法です。

実行中のアプリを置き換えるには、まずその場所を見つける必要があるためsys.executable、開始点を取得するために使用できます。次に、子プロセスをフォークして、親プロセスを強制終了し、子に実際の置き換えをさせることができますか?

私は現在、小さな wxPython アプリで遊んでいて、まさにこの問題について疑問に思っています。あなたが思いついたものについて聞いてみたいです。

また、圧縮したときのアプリのサイズはどれくらいですか? うまく圧縮されていれば、すべてを送信する余裕があるかもしれません。

于 2009-04-17T13:47:47.710 に答える
1

py2exe はアプリのコンパイルされたすべてのモジュールを ZIP ファイルに入れるため、特定のファイル セットから更新するスクリプトを作成して、このファイルを更新することができます。次に、変更された残りのファイルを置き換えます (存在する場合は少数のはずです)。

于 2009-04-17T15:06:33.260 に答える