「頻繁にリリースし、早期にリリースする」という考え方をさらに進めていくため、Delphi アプリケーションをシームレスに更新できるように独自のコードを展開することを考えていました。さまざまな Delphi ソリューション (フリーウェアと有料の両方) があります。それらのいずれかを使用しているのか、それともこの分野で独自のソリューションを使用しているのかをお尋ねしたいと思います。自動更新のトピックに関するコメントは大歓迎です。
10 に答える
どのスキームを使用する場合でも、実行中の .exe ファイルの名前を実際に変更できることを知っておくと便利です。したがって、ファイルの名前を変更し、新しいファイルにコピーするとうまくいきます。次に誰かがプログラムを起動すると、新しいバージョンが起動されます。これはもちろん、citrix/ターミナル サーバー/ネットワーク共有の場合のように、多くのユーザーが同じ .exe ファイルを実行する環境では非常に便利です。
何年も前に、実際のプログラムの代わりに起動し、更新をチェックし、それらをロードしてインストールし (利用可能な場合)、最終的に実際のアプリケーションを起動する簡単なツールを作成しました。
ただし、ユーザーが通常プログラム ディレクトリへの書き込みアクセス権を持っていない適切に管理された環境でプログラムが動作する場合、このアプローチには問題があります。このような環境では、自分のプログラムを単純に更新することはできなくなりました。そのため、最近の多くのプログラムには、昇格されたアクセス許可で実行するようにインストールできる独自のアップデータ ツールが付属しているため、標準ユーザーのみがシステムにログオンした場合でもプログラムの更新を適用できます。
ターゲット ユーザーがパワー ユーザー アカウントまたは管理者アカウントで実行されると想定できるかどうか、または上記の問題に対処する必要があるかどうかを決定する必要があります。Vista では、すでにかなり難しくなっています。
これらすべての問題 (プロキシ経由のネット アクセス、インストール ディレクトリへの書き込みアクセス許可の欠落、アップデーター自体が使用しているファイルを更新する必要性 - ほんの数例を挙げると) があるため、これを自分でコーディングしようとはしません。利用可能なソリューションのいずれかが必要なすべてを実行するかどうかを確認することをお勧めします.
Synapseルーチン GetHTTPを使用して特定のリソースを返し、見つかった場合はローカル システムをチェックして、更新が必要かどうかを確認します。その場合、リソースはどのページを起動すればよいかを教えてくれます。その URL を shell execute に投げて、ユーザーの好みのブラウザーが表示されるようにします。
ほとんどの場合、ダウンロードは、ユーザーのシステムとデータベースを最新バージョンに更新する InnoSetup によって作成されたセットアップ プログラムです。新しい「有料」アップグレードが必要な場合は、ユーザーに「購入アップグレード」フォームを送信します。私の Web リソースは ASP ページであるため、顧客のバージョン番号に基づいて別のリソースにリダイレクトできます。
メイン アプリケーション (アプリケーションにはサーバー ピースとクライアント ピースがあります) には、サーバー上のクライアント ファイルのバージョンがクライアント上のバージョンと異なるかどうかを確認するためにサーバーをチェックするローダーがあります。そのため、ユーザーが更新/元に戻したい場合は、ユーザーにプロンプトが表示されます。偶発的なバグがシステムに侵入する可能性があり、ユーザーはトラブルシューティングを支援するために特定のマシンのみをダウングレード/アップグレードする必要があるため、ユーザーにプロンプトを表示することにしました。データベース パッチを介して更新される必要最小限のバージョンでデータベース レコードを保持しているため、バージョンを廃止する必要がある場合は、それに応じてレコードが更新されます。
TmxWebUpdateを使用しています。無料でシンプルで、プロセスを適切に制御できます。私は実際にTWebUpdateを備えたTMSコンポーネントパックを所有していますが、切り替える正当な理由を実際に見つけることはできませんでした。
編集:リンクが更新されました
ダウンロード用の Indy とファイル パッチ用のhttp://sourceforge.net/projects/makeupdate/に基づいて、独自のソリューションも作成しました。その前に、いくつかの商用ツールを使用して試してみましたが、誰も私が必要としていたものを正確に実行していませんでした.
私たちも自分たちで転がしました。それほど難しいことではありません。
私たちのプロセスは次のようになります。
メイン アプリが起動されると、利用可能な更新があるかどうかを確認します (もちろん、確認するように構成されていると仮定します)。
その場合、ユーザーに通知し、更新するかどうかを尋ねます。
その場合、アップデーター .exe を起動し、メイン アプリを閉じます。
アップデータ exe は、取得したテキスト ファイルの内容に基づいて新しいファイルをダウンロードし、ファイルをメモリに保持します。
アップデーターがすべてを正しくダウンロードすると、ダウンロードしたファイルをディスクに保存し、置き換えたファイルをバックアップします。このようにして、ダウンロードが中断された場合でも、半分のファイルがインストールされることはありません。
最後に、メイン アプリを再度起動し、閉じます。
Vista での秘訣は、アップデータ プログラムのマニフェストに、管理者権限で強制的に実行するためのエントリが必要なことです。
通常、サードパーティのツールを使用します。しかし、状況によっては使用できなかったため、かなり標準的な独自のソリューションを作成しました。
- 更新情報を含むxml(またはその他の形式)を取得します。
- 新しいファイルが公開されている場合は、それらをダウンロードしてインストールします。
私はTWebUpdateを使用します。それは問題なく動作し、興味深いオプションがたくさんありますが、ドキュメントはそれほど良くなく、いくつかの問題に遭遇しました.
ところで、私はこの質問に注目します...
次の手順に従う独自のソリューションを使用します。
- アプリケーションは http リソースに接続し、情報ファイル (ini テキスト ファイル) をメモリにダウンロードし、最新リリースのバージョン番号を確認します。
- 新しいバージョンが利用可能な場合、アプリは圧縮されたバイナリ パッケージを exe の場所にダウンロードします。
- ダウンロードが完了すると、ユーザーはアプリケーションを再起動するよう求められます。
- 起動時に、アプリケーションは更新パッケージの存在を確認します
- アプリはパッケージの内容を抽出します (通常は新しいアプリ exe ですが、更新された言語ファイルなどの追加のリソースも可能です)。各ファイルについて、最初に現在/古いファイルの名前を一時名に変更してから、新しいファイルを抽出します。プロセスがいずれかの時点で失敗した場合、一時ファイルは復元されます。
- 終了すると、アプリは新しい exe を実行し、それ自体を閉じます。
追加のアップデータは必要ありません。アプリの exe だけですべて処理できます。
圧縮パッケージには、独自の更新ビルダーを使用します。パッケージには、ファイル ハッシュ、宛先フォルダー (メインの exe への相対パス)、および圧縮ファイルを含むファイルのインデックスが含まれています。更新中に、保存されたハッシュと抽出されたファイルを比較して、破損したファイルを検出します。
Vista では、標準ユーザー アカウントが実際にアプリケーション ファイルを更新できるようにするための 2 つのソリューションを見つけました。
プログラムのインストール ディレクトリのアクセス許可を変更するようにセットアップを構成します。このようにして、「C:\Program Files (x86)\Your Company\You App」にあるファイルを、権限が制限されたアカウントで変更できます。
InnoSetup のコード例は次のとおりです。
[Dirs] Name: "{app}"; Permissions: users-modify
更新する予定のファイルを、ユーザー定義のディレクトリではなく ProgramData フォルダーにインストールし、このディレクトリをオーバーライド フォルダーとして使用します。ProgramData にファイルが存在する場合はそれらを使用し、存在しない場合はインストール ディレクトリにチェックインします。
InnoSetup コード:
[Files] Source: "C:\Your Project\YourApp.exe"; DestDir: "{commonappdata}\Company Name\App Name\";
「stg」や「GuyWithDogs」と同じように、TMS の TWebUpdate を使用しています。ドキュメンテーションはそれほど素晴らしいものではありませんが、習得するのはそれほど難しくありません。
TWebUpdate では、使用するプロトコルにいくつかのオプションがあり、HTTP、FTP、またはネットワーク アクセスを介して行うことができます。
通信層として、TWebUpdate は WinInet を使用します。一部のマシンでは、windows / IE の URL キャッシュがイライラすることがあるため、最初に自動更新サーバーのアドレスをキャッシュからクリアして、サーバーから収集された情報が最新であることを確認するルーチンを追加しました。