Delphiアプリケーションをシームレスに更新できるようにするために、独自のコードをローリングすることを考えていました。これは、「頻繁にリリースし、早期にリリースする」という考え方をさらに進めるためです。さまざまなDelphiソリューション(フリーウェアと有料の両方)が世の中にあります。それらのいずれかを使用したことがあるのか、またはこの分野で独自のソリューションを単に使用したのかをお聞きします。自動更新トピックに関するコメントは歓迎します。
数年前、私は実際のプログラムの代わりに起動し、更新をチェックし、それらをロードしてインストールし(利用可能な場合)、最後に実際のアプリケーションを起動するシンプルなツールを書きました。
ただし、プログラムが適切に管理された環境で動作する場合、そのアプローチには問題があります。この場合、ユーザーは通常、プログラムディレクトリへの書き込みアクセス権を持ちません。このような環境では、自分のプログラムを単に更新することはできません。そのため、最近の多くのプログラムには独自の更新ツールが付属しており、高度な権限でインストールして実行できるため、標準ユーザーだけがシステムにログオンする場合でもプログラムの更新を適用できます。
ターゲットオーディエンスをパワーユーザーアカウントまたは管理者アカウントで実行すると想定できるかどうか、または上記の問題に対処する必要があるかどうかを決定する必要があります。 Vistaでは、事態はすでにかなり難しくなっています。
これらすべての問題(プロキシ経由のネットアクセス、インストールディレクトリへの書き込み権限の欠如、アップデーター自体が使用しているファイルを更新する必要性-いくつか例を挙げると)で、私はこれを自分でコーディングしようとはしません。利用可能なソリューションのいずれかがあなたがそれを必要とするすべてを行っているかどうかを確認する方がはるかに良いです。
どのスキームを使用する場合でも、実行中の.exeファイルの名前を実際に変更できることを知っておくと便利です。したがって、ファイルの名前を変更し、新しいファイルにコピーすることでうまくいきます。そして、次に誰かがプログラムを起動したときに、彼らは新しいバージョンを起動します。これはもちろん、citrix /ターミナルサーバー/ネットワーク共有の場合のように、多くのユーザーが同じ.exeファイルを実行する環境で非常に便利です。
Synapse ルーチンGetHTTPを使用して特定のリソースを返し、見つかった場合はローカルシステムをチェックして、更新が必要かどうかを確認します。もしそうなら、リソースは起動するページを教えてくれ、シェル実行にURLを投げるので、ユーザーの好みのブラウザが表示されます。
ほとんどの場合、ダウンロードは、ユーザーのシステムとデータベースを最新バージョンに更新するInnoSetupによって作成されたセットアッププログラムです。新しい「有料」アップグレードが必要な場合は、ユーザーに「購入アップグレード」フォームを送信します。私のWebリソースはASPページなので、顧客のバージョン番号に基づいて別のリソースにリダイレクトできます。
メインアプリケーション(私たちのアプリケーションにはサーバー部分とクライアント部分があります)には、サーバー上のクライアントファイルのバージョンがクライアント上のバージョンと異なるかどうかを確認するためにサーバーをチェックするローダーがあります... ifそのため、ユーザーが更新/元に戻したい場合は、ユーザーにプロンプトを表示します。偶発的なバグがシステムに侵入することがあり、トラブルシューティングを支援するために特定のマシンのみをダウングレード/アップグレードする必要があるため、ユーザーにプロンプトを表示することを選択しました。データベースパッチを介して更新される必要最低限のバージョンでデータベースレコードを維持しているため、バージョンを廃止する必要がある場合、それに応じてレコードが更新されます。
私は TmxWebUpdate を使用しています。これは無料でシンプルで、プロセスを適切に制御できます。 TWebUpdateを備えたTMSコンポーネントパックを実際に所有していますが、切り替える正当な理由は本当に見つかりませんでした。
編集:リンクを更新しました
ダウンロード用のIndyとファイルパッチ用の http://sourceforge.net/projects/makeupdate/ にも基づいて、独自のソリューションも作成しました。それ以前は、いくつかの商用ツールを使用して試しましたが、誰も私が必要とするものを正確に実行していませんでした。
私たちも自分で転がしました。それほど難しくありません。
プロセスは次のようになります。
メインアプリが起動すると、(シナプスライブラリのfuncsを使用して)利用可能なアップデートがあるかどうかをチェックします(もちろん、チェックするように構成されていると仮定します)。
その場合は、ユーザーに通知し、更新するかどうかを尋ねます。
存在する場合は、アップデーター.exeを起動し、メインアプリを閉じます。
アップデーターexeは、取得したテキストファイルの内容に基づいて新しいファイルをダウンロードし、ファイルメモリ内を保持します。
アップデーターがすべてを正しくダウンロードすると、ダウンロードしたファイルがディスクに保存され、置き換えられたファイルがバックアップされます。これにより、ダウンロードが中断した場合でも、ファイルの半分がインストールされたままになることはありません。
最後に、メインアプリを再度起動し、自分自身を閉じます。
Vistaでのトリックは、管理者権限で実行するように強制するには、アップデータプログラムのマニフェストにエントリが必要なことです。
通常はサードパーティのツールを使用します。しかし、一部の状況では使用できなかったため、かなり標準的な独自のソリューションを作成しました。
次の手順に従う独自のソリューションを使用します。
追加のアップデーターは必要ありません。アプリ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\";
私は TWebUpdate を使用しています。それは問題なく動作し、興味深いオプションがたくさんありますが、ドキュメントはそれほど大きくなく、いくつかの問題にぶつかりました-ファイルだけでなく、フルインストーラーをダウンロードするのはそのためです...
私はこの質問に目を光らせています。
「stg」や「GuyWithDogs」と同じように、TMSのTWebUpdateを使用しています。ドキュメントはそれほど素晴らしいものではありませんが、学ぶことはそれほど難しくありません。
TWebUpdateを使用すると、使用するプロトコルにいくつかのオプションがあり、HTTP、FTP、またはネットワークアクセスを介して実行できます。
通信層の場合、TWebUpdateはWinInetを使用します。一部のマシンでは、Windows/IE URLキャッシュがフラストレーションになる可能性があるため、最初にキャッシュから自動更新サーバーのアドレスをクリアして、サーバーから収集した情報が最新の。