76

多くのプログラムには自動アップデータが含まれており、プログラムは時々オンラインで更新を探し、見つかった更新をダウンロードして適用します。プログラムのバグが修正され、サポート ファイルが変更され、(通常は) 改善されます。

残念ながら、いくら探しても、このプロセスに関する情報はどこにも見つかりません。実装されている自動アップデーターは、独自のものであるか、重要とは見なされていないようです。

ネットワーク上で更新を探し、利用可能な場合はダウンロードするシステムを実装するのはかなり簡単に思えます。自動アップデーターのその部分は、実装ごとに大幅に変更されます。問題は、パッチを適用するさまざまなアプローチとは何かということです。ファイルをダウンロードして古いファイルを新しいファイルに置き換えたり、ダウンロードした移行スクリプトを実行したり、システムの一部にモンキーパッチを当てたりするだけですか? 概念が優先されますが、Java、C、Python、Ruby、Lisp などの例を歓迎します。

4

17 に答える 17

54

ここでは「言語にとらわれない」ことが制限要因になると思います。アプリケーションには非常に多くの形状とサイズがあるため、万能の答えはありません。私はいくつかの言語でいくつかの自動アップデーターを実装しましたが、同じようなものはありませんでした。

最も一般的な考え方は、アプリケーションが何らかのホーム ロケーション (Web アドレス、Web クエリ、企業ネットワークの場所など) をチェックして、そのバージョンが最新かどうか、または最新バージョンが何であるかを確認することです。回答が更新を必要とする場合、そのプロセスは状況ごとに異なります。

一般的な代替方法は、アプリケーションの開始時にホーム ロケーションを招待してスクリプトを実行することです。スクリプトは、たとえば、バージョンを確認し、必要に応じて更新をダウンロードし、使用に関するフィードバックを求めることができます。

パラメーターを絞り込むと、おそらくより適切に役立つ可能性があります。

更新: 「パッチ適用」へのアプローチは、アプリケーションの性質にも依存し、ここには非常に幅広い多様性があります。たとえば、実行可能ファイルが 1 つしかない場合は、おそらく実行可能ファイルを置き換えるのが最も実用的です。アプリケーションに多くのファイルがある場合は、置き換えられるファイルの数を最小限に抑える方法を探す必要があります。アプリケーションが高度にカスタマイズまたはパラメーター化されている場合は、再調整の労力を最小限に抑えるよう努める必要があります。アプリケーションが解釈されたコード (Excel VBA アプリケーションや MS Access MDB アプリケーションなど) を使用している場合、コードの一部を置き換えることができる場合があります。Java アプリケーションでは、JAR ファイルまたは JAR コンテンツのサブセットを置き換えるだけでよい場合があります。また、現在のクライアント バージョンを認識し、適切に更新する方法も必要です。何度でも言いますが、多様性についての私の主張を理解していただければ幸いです。これは、最良の答えが通常「まあ、場合による...!」で始まる多くのケースの 1 つです。そのため、「パラメータを絞り込んでください」という回答が非常に多いのです。

于 2008-10-24T03:12:38.493 に答える
21

更新に関する情報や更新バイナリ自体を吸い込むことによるセキュリティへの影響も考慮してください。

ダウンロード元を信頼しますか? 家に電話してアップデートを入手するかもしれませんが、途中で悪意のあるサーバーにリダイレクトする男がいる場合はどうなりますか. HTTPS または同様の安全な接続が役立ちますが、デジタル署名チェックを使用して、最終的にダウンロードするビットを再確認することをお勧めします。

于 2009-01-28T06:45:53.607 に答える
8

まず、アプリケーションのホーム Web サイトに最新バージョンのファイルが必要です。このタスク用に特別な SQL テーブルを用意し、新しいバージョンの公開/ナイトリー ビルドの完了後に自動的にデータを入力するのが最善の方法です。アプリケーションは、組み込みの http リンクをバージョンで要求し、現在のものと比較する新しいスレッドを作成します。.NET では、次のようなコードを使用できます。

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
}

この例では、version.php は 1.0.1.0 のような 1 つのプレーンな文字列のみです。

私が提供できるもう 1 つのヒントは、アップデートのダウンロード方法です。私は次のアイデアがとても気に入っています。アプリケーションのリソースには、一時フォルダーに (CodeDom を使用して) オンザフライでコンパイルする CLR コードの文字列があり、メイン アプリケーションはそれを呼び出して閉じます。アップデータは、引数、設定、またはレジストリを読み取り、新しいモジュールをダウンロードします。そして、すべての一時ファイルを削除するメイン アプリケーションを呼び出します。終わり!

(ただし、ここではすべて .NET に関するものです)

于 2008-12-04T06:41:53.390 に答える
6

最も簡単な解決策 (多くのプログラムで使用されています) は、以前のバージョンのアンインストーラーを実行し、新しいバージョンのインストーラーを実行することです (オプションで、EULA など、ユーザーが既に回答した質問をスキップします)。唯一の問題は、新しいバージョンが古いバージョンから構成オプションを読み取ることができなければならないことです。

また、Windows では使用中の実行可能ファイルを削除することはできません。そのため、プロセス全体を実行する小さな実行可能ファイルを Temp フォルダーにドロップし、最後に新しいバージョンのインスタンスから削除することをお勧めします。これが起動されました(または、次の再起動時に削除されるように登録するだけです)。

于 2009-01-28T07:51:31.353 に答える
2

これは完全な答えではありませんが、最近実装した自動更新メカニズムの 1 つの例です。従来の Firefox 型のユーザー アプリケーションとは状況が少し異なります。これは仕事で使用される内部ツールでした。

基本的には、Subversion ブランチのキューを管理してビルドし、インストーラーにパッケージ化する小さなスクリプトです。ブランチの名前が書かれている小さなファイルを読み取り、最初のファイルを取得してファイルの最後に書き直し、一連のスクリプトの呼び出しを含むビルド プロセスを開始します。ビルドする各ブランチの構成は .INI ファイルに記述され、ツール自体と共に Subversion リポジトリに保存されます。

このツールは複数のコンピューターで実行されるため、ツール自体または構成スクリプトに変更を加えるとすぐに、すべてのコンピューターで自動的に更新する方法が必要でした。

実装方法は簡単で、ツールを起動すると「外殻」になります。この外部シェルは、次の 2 つの非常に単純なことを行います。

  • svn updateそれ自体と構成ファイル
  • 今回は「内部シェル」として、実際に 1 つの構成を処理する (そして再び終了する) ものとして、再び起動します。

この非常に単純なループ内の更新システムは、数か月間非常に役に立ちました。自己完結型であるため、非常に洗練されています。自動アップデーターはプログラム自体です。「外側のシェル」(自動更新部分) は非常に単純なので、「内側のシェル」 (更新されたソース ファイルから毎回実行される) として更新の恩恵を受けなくても問題ありません。

于 2009-01-28T07:46:15.920 に答える
2

自動更新は一般的なシナリオであるため、ほとんどの言語には、これをサポートするために少なくとも 1 つのパッケージが用意されています。(以下に、利用可能なパッケージの一部をリストします)

本当に素晴らしいアイデアの 1 つは、.NET 用のClickOnceディストリビューションです。これは、アプリケーションをサンドボックス化してユーザー コンテキストにインストールするインストーラーであるため、管理者権限は必要ありません。パブリッシュで ClickOnce を構成して、アプリケーションの起動ごとに更新を確認できます。

Java には、Java アプレットに同じ種類の機能を提供するJava Web Startがあります。

Delphi には自動更新に関する多数の記事があり、Torry にはWebUpdate コンポーネントのリストがあります。たとえば、GoUpdaterには非常に幅広い機能があるようです。

それらはすべて、Web サイト/ネットワーク共有を使用して新しいバージョンをチェックし、パッチまたは完全なインストール ファイルを取得して実行します。したがって、独自のソリューションを開発および保守する手間を省くために、アプリケーションに適したパッケージを見つけるようにしてください。

于 2009-01-28T08:28:41.950 に答える
2

最も簡単な方法は、プログラムでサーバー (Web サイト) にクエリを実行して、更新があるかどうかを確認することです。更新がある場合は、新しいバージョンをダウンロードするよう促し、リンクを提供するメッセージをユーザーに表示できます。

別のより複雑な解決策は、更新があるかどうかを定期的に確認する小さな Windows サービス (ま​​たは UNIX デーモン) を作成することです。このサービスは、更新をダウンロードしてインストーラーを起動できます。

一般的なアーキテクチャは、最新バージョンとそれを入手する場所を知っている、制御する中央サーバーがあることです。次に、プログラムはサーバーにクエリを実行します。サンプル コードは、サーバーと選択した形式に大きく影響するため、含めません。とはいえ、それほど難しいことではありません。

于 2008-10-24T03:14:03.747 に答える
1

Windowsの答えを想定します。

この方法はうまくいくようです。

インストーラーで次のことを行い
ます。1。LocalSystemとして実行される手動開始サービスを作成します。このサービスは、開始時に更新を実行してから停止します。
2.すべてのユーザーがサービスを開始できるように、サービスのアクセス許可を変更します(すべてのユーザーが管理者権限なしで更新できる必要がある場合)。
3.単純なメカニズムを使用して開始したときに更新を確認するように、メインプログラムを変更します。更新を検出した場合、ユーザーがそれを適用するかどうかを確認します。
4.ユーザーが更新を受け入れたら、サービスを開始します。

アーキテクチャで許可されている場合は、実行中の更新を監視する方法を作成します。

于 2009-01-30T00:09:15.743 に答える
0

プログラムにパッチをインストールする機能は、基本的にインストーラーの基本機能の1つです。インストーラーソフトウェアは多くの場所で文書化されていますが、通常はインストーラーごとに文書化されています:Microsoftインストーラー(Install Shield Extensions付き)、Ruby gemJava .jarファイル、さまざまなLinuxパッケージマネージャーシステム(RPMApt-get)など。

これらはすべて複雑なシステムであり、プログラムのパッチ適用の問題を一般的に解決しますが、システムが少し異なります。自分に最適なものを決定するには、これらのシステムのどれにアプリケーションが最も似ているかを検討してください。あなた自身を転がすことは問題ありませんが、これらのシステムを見ることは出発点です。

于 2009-01-28T08:05:32.153 に答える
0

Java-Webstart 設定では、アプリケーションの実行に必要な Jar ファイルのダウンロードをトリガーする JNLP ファイルを開始します。Webstart は毎回、Jar の新しいバージョンがあるかどうかを確認し、それらをダウンロードして、ローカルにキャッシュされたものと置き換えます。jardiff という名前のツールを使用すると、新しい jar への差分のみを作成し、サーバー経由でこれらを配布します (たとえば、更新のみを取得します)。

長所:

  • 常に最新

短所:

  • ファイルを配布するには、アプリケーション サーバー (Tomcat、JBoss) が必要です。
  • アプリケーションを取得するには、インターネット接続が必要です
于 2009-01-28T07:33:47.100 に答える
0

アプリケーションの内部モジュールを作成して、更新を行うことができます。更新を行う外部ミニ アプリケーションを作成できます。

また、.NET のオンザフライ コンパイル テクノロジを見てください。このようなミニ アプリケーションをオンザフライでオンデマンドで作成できます。たとえば、http://fly.sf.net/

于 2009-01-28T08:56:50.707 に答える
0

Carl Seleborgs の回答を読んで、一般的なコード リポジトリがどのように役立つかについていくつかのアイデアが得られました。

svn には svnsync というツールが付属しています。これは svn エクスポートのように動作しますが、エクスポートの実際のリビジョンを追跡します。

ユーザーの実際のリビジョンから変更されたファイルのみを取得するために、誰かがこのシステムを利用する可能性があります。

実際には、バイナリがコンパイルされたリポジトリがあり、svnsync を実行すると、変更されたバイナリのみがフェッチされます。また、新しい構成オプションを使用して、ローカルの変更をテキストベースの構成ファイルにマージできる場合もあります。

于 2009-01-28T07:56:46.100 に答える
-1

クロスプラットフォームのソフトウェア アップデート ソリューションをお探しの場合は、www.updatenode.comをご覧ください。

いくつかのハイライト:

  • オープンソース プロジェクトは無料
  • クロスプラットフォーム & オープン ソース アップデート クライアント ツール
  • 最も重要な言語用にローカライズ済み
  • 統合しやすく、扱いやすい
  • アップデートを定義および管理するためのクラウドベースの管理プラットフォーム
  • メッセージを表示するための追加サポートを提供します (新しいイベント、製品などについて通知します)。
  • Web インターフェイスが開いています (サービスを使用して独自のクライアントを作成できます)
  • 使用されているオペレーティング システム、地理的位置、バージョンの使用状況など、多くの使用統計。
  • モバイル アプリの更新用の Android API

やってみなよ。

ところで、私はオープン ソース クライアントの開発チームの一員です。:)

于 2014-03-25T13:06:00.540 に答える