web-dev-qa-db-ja.com

自動更新機能を実装するにはどうすればよいですか?

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

残念ながら、どんなに目を凝らしても、このプロセスに関する情報はどこにもありません。実装されている自動更新プログラムは、独自仕様であるか、重要ではないと考えられているようです。

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

63
num1

ここでは「言語にとらわれない」が制限要因になると思います。アプリケーションにはさまざまな形やサイズがあり、万能な答えはありません。私はいくつかの言語でいくつかの自動アップデーターを実装しましたが、似ている2つはありませんでした。

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

一般的な代替策は、アプリケーションが開始されたときにスクリプトを実行するようにホームロケーションを招待することです。スクリプトは、バージョンを確認し、必要に応じてアップデートをダウンロードし、使用状況のフィードバックを要求することができます。

パラメータを絞り込むと、より良い結果が得られるでしょう。

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

49
Ken Paul

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

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

18
Ants

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

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
}

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

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

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

8
abatishchev

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

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

5
Grey Panther

これは完全な答えではなく、最近実装した自動更新メカニズムの1つの例です。これは、仕事で使用される内部ツールであるため、Firefoxタイプの伝統的なユーザーアプリケーションとは少し異なります。

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

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

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

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

この非常にシンプルなループの自己更新システムは、ここ数か月の間、非常に役立ちました。自己完結型であるため、非常にエレガントです。自動更新はプログラム自体です。 「外部シェル」(自動更新部分)は非常に単純なので、「更新されたソースファイルから毎回実行される」「内部シェル」として更新してもメリットがなくてもかまいません。

2
Carl Seleborg

実際に言及されていないことの1つは、プログラムを実行しているユーザーには、実際にプログラムをアップグレードするための十分な権限がない可能性があることを真剣に検討する必要があることです。これは、少なくともビジネスユーザーにはかなり一般的で、ホームユーザーにはそれほど一般的ではありません。

私はセキュリティ上の理由から常に(自主的に)制限されたアカウントで作業しており、ほとんどの自動更新は単に管理者として実行していると仮定し、ダウンロード後に失敗し、他の実行方法を提供しないと常に怒っています実際にプログラムを閉じて管理コンテキストで再度実行する以外の更新。ほとんどの場合、ダウンロードされた更新をキャッシュすることすらせず、もう一度やり直す必要があります。

自動アップデーターが必要なときに管理者の資格情報を要求するだけで、それで処理を続行できれば、はるかに優れています。

2
Oliver Giesen

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

代替のより複雑なソリューションは、更新があるかどうかを定期的にチェックする小さなWindowsサービス(またはUNIXデーモン)を作成することです。このサービスは、更新をダウンロードしてインストーラーを起動できます。

一般的なアーキテクチャは、最新のバージョンとそれをどこから入手できるかを知っている、管理する中央サーバーがあるということです。次に、プログラムはサーバーに照会します。サンプルコードは、サーバーと選択した形式に対して非常に被告であるため、ここには含めません。しかし、それはひどく難しいことではありません。

2
vfilby

Windows用の答えを想定します。

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

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

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

1
Joshua

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

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

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

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

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

1
Davy Landman

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

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

0
abatishchev

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

長所:

  • 常に最新

短所:

  • ファイルを配布するには、アプリケーションサーバー(Tomcat、JBoss)が必要です。
  • アプリケーションを入手するにはインターネット接続が必要です
0
boutta

Carl Seleborgsの回答を読むと、汎用のコードリポジトリがどのように役立つかがわかりました。

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

誰かがこのシステムを利用して、ユーザーの実際のリビジョンから変更されたファイルのみをフェッチすることができます。

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

0
jishi

ソフトウェアがオープンソースで、Linuxまたは開発者をターゲットにしている場合。ソフトウェアをgitリポジトリとしてインストールするのは興味深いことです。そして、それが時々または毎回それが起動されたときに安定したブランチを引っ張らせる。

これは、アプリケーションがnpm、sbt、mavan、stack、Elm-packageなどを介して管理される場合に特に簡単です。

0
Beeno Tung

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

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

0

私のソリューションを使用できます( Target Eye プロジェクトの一部)。 http://www.codeproject.com/Articles/310530/Target-Eye-Revealed-part-Target-Eyes-Unique-Auto

0