自動アップデータを実装するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/232347

  •  04-07-2019
  •  | 
  •  

質問

多くのプログラムには自動更新プログラムが含まれており、プログラムは更新プログラムをオンラインで検索し、見つかった更新プログラムをダウンロードして適用します。プログラムのバグが修正され、サポートファイルが変更され、物事が(通常)より良くなりました。

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

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

役に立ちましたか?

解決

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

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

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

パラメータを絞り込めば、おそらくもっと役立つでしょう。

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

他のヒント

アップデートに関する情報だけでなく、アップデート自体を吸い込むことのセキュリティへの影響も考慮してください。

ダウンロードのソースを信頼していますか?自宅に電話してアップデートを入手することもできますが、中間に悪意のあるサーバーにリダイレクトする人がいる場合はどうでしょうか。 HTTPSまたは同様のセキュアな接続が役立ちますが、デジタル署名チェックを使用して最終的にダウンロードするビットを二重チェックすることをお勧めします。

最初に、アプリケーションのホーム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つのプレーン文字列のみに含まれています。

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

(ただし、ここでのすべては.NETについてです)

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

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

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

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

一般的なアーキテクチャでは、最新バージョンとその入手先を把握している中央サーバーを管理しています。次に、プログラムはサーバーに照会します。サンプルコードは、サーバーおよび選択した形式で非常に保護されるため、サンプルコードは含めません。ただし、それほど難しくありません。

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

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

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

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

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

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

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

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

自動アップデーターが必要に応じて管理者の資格情報の入力を要求し、それを取得するだけの場合は、はるかに良いでしょう。

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

本当に素晴らしいアイデアの1つは、 ClickOnce の配布です。 .NETは、アプリケーションをサンドボックス化してユーザーコンテキストにインストールするインストーラーであるため、管理者権限は不要です。パブリッシュでClickOnceを設定して、各アプリケーションが起動する更新を確認できます。

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

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

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

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

長所:

  • 常に最新

短所:

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

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

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

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

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

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

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

更新を行うために、アプリケーションの内部モジュールを作成できます。更新を行う外部ミニアプリケーションを作成できます。

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

Windowsの回答を想定します。

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

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

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

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

ソフトウェアがオープンソースであり、Linuxまたは開発者をターゲットにしている場合。ソフトウェアをgitリポジトリとしてインストールするのは興味深いことです。また、安定したブランチを時々、または起動するたびにプルします。

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

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

いくつかのハイライト:

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

試してみてください。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top