web-dev-qa-db-ja.com

依存関係地獄:ポータブルアプリケーションを作成してみませんか

私がWindowsを使用していた時代にさかのぼると、アプリケーションは独立した方法でインストールされていました。これにより、エンドユーザー/システム管理者は、他のアプリに干渉することなく、何をどこでアップグレードするか、何にパッチを適用するか、いつアップグレードするかを自由に決めることができました。

* NIXでは、絡み合った依存関係は苦痛な頭痛の種です。 PC-BSDは、自己完結型のアプリケーションを作成することにより、 [〜#〜] pbi [〜#〜] でこれを克服しようとしました。 AFAIK、これは現在非推奨のようで、パッケージ管理方法に戻り(PBIはポートのラッパーになりました)、すべてのLinuxディストリビューションは同じ方向に実行されます:最後まで何百もの依存関係があります デスクトップ環境)システム管理デーモンに依存することが予想されます

何百もの依存関係に基づいてアプリを構築すると、プログラマーは楽になりますが、エンドユーザーとシステム管理者に衝撃的な問題が発生します。たとえば、DebianJessieで古いDebianEtchバージョンのアプリを実行し続けることはできなくなりました。多くの人がセキュリティやパッチ、最新のシステムの話を持ってくることを私は知っていますが、オープンソースは何を、いつ、どこで更新するかを自由に決定できることを意味します。システムまたはその一部を更新しない、または少なくとも一般的な* NIXパッケージマネージャーがユーザーを実行している方法(つまり、オフラインで動作するマシン、古いハードウェア、必要な古いデータとの互換性)を更新しないことには、非常に正当な理由があります。コンプライアンスのために保管されています...)。また、システム管理者は、セキュリティのためにいくつかのステップでそれを行うことを好みます。

個人的には、システム管理者としての私は、何をいつ更新するかを決定し、リスクを負うべきだと信じています。現在の状況では、これは不可能です。 (つまり、Debianに新しいバージョンのlibc6がある場合、これにはどこにでも依存関係があります)。問題を克服するために2つ以上のリポジトリを保持することにした場合、別の悪夢が発生します。

特定の依存関係(つまり、MySQLがインストールされている)は主要な依存関係であるため許容できることは理解していますが、ライブラリのような小さな依存関係がコードに単純に埋め込まれていない理由は理解できません。ディスクは安いです。 Windowsに移植された多くのLinuxアプリがこれを達成しました。

編集:意見に基づくだけではないことを確認する

次の目的で* NIXにソフトウェアをインストールするためのオプションは何ですか(簡単にするためにDebian/FreeBSDとしましょう)。

  • アップグレードせずにソフトウェアの特定のバージョンを何年も実行し続け、その後のベースOSとライブラリのアップグレードに関係なくそのままにしておくことができるようにします。alaapt-get holdですが永久に。

  • 他のソフトウェア/ライブラリと競合することなく、アップグレード/ダウングレードすることを決定します。

  • そのソフトウェアの2つ以上のバージョンをインストールします。

Jails/chroot/VMはオプションではありませんが、明らかな回避策です。また、

  • PBIがこの独立した目標を達成できず、ポート/パッケージ管理に戻った理由は何ですか?
5
null_pointer

PBIが成功しなかった理由には答えられませんが、Linuxで共有ライブラリが好まれる理由には答えることができます。

主な議論isセキュリティ、一般的に使用されるライブラリに脆弱性がある場合は、そのライブラリのみを更新する必要があり、そのライブラリを使用するすべてのアプリケーションを更新する必要はありません(ABI互換性のおかげで) )。これは、(主にメインリポジトリとPPA(Ubuntuの場合)に固執する場合)、アプリケーションがそれらのバージョン(Windowsなど)に対してコンパイルされたという理由だけで、4つの異なるバージョンのライブラリをインストールする必要がないことも意味します。 、おそらく異なるバージョンの.NETライブラリがインストールされているか、異なるバージョンのビジュアルC++ランタイムがインストールされている可能性があります)。

とはいえ、アプリケーションがシステムバージョンのライブラリを使用することを強制されず、代わりに独自のバージョンを使用できる場合もあります。たとえば、Chromiumは、ほとんどのディストリビューションのリポジトリに存在する多くのライブラリに依存しています。通常の状況では、アプリケーションは、それらが使用するライブラリがディストリビューションによってコンパイルされたものになるようにコンパイルされます。ただし、Ubuntuでは(少なくとも)、Chromiumは独自のバージョンのライブラリでコンパイルされます。理由は次のとおりです。

  • ライブラリのシステムバージョンを使用するということは、UbuntuのリリースごとにChromiumをテストする必要があることを意味します。
  • Chromiumは、ほとんどの場合、すでに最新バージョンのライブラリを使用しています。つまり、脆弱性が存在する可能性ははるかに低くなります。

ディスク容量の議論については、DebianJessieのdebootstrap'edバージョンをインストールするのに必要なディスク容量は1GB未満であるため、小さいSDカードに最適であると主張できます。一方、Windowsには少なくとも数ギガバイトのディスク容量が必要です。

古いソフトウェアに関しては、アプリケーションを静的にコンパイルし、ほとんどの依存関係を自己完結型にすることができます。ただし、ディストリビューションには静的バージョンのライブラリがない可能性があるため(DebianとUbuntuにはほとんどの場合ありません)、これらのライブラリの静的バージョンを取得するには、これらのライブラリを自分でコンパイルする必要があります。

最後に、Unixの原則の1つは、各アプリケーションが1つのことだけを実行し、それが得意であるということです。アプリケーションとライブラリが静的にリンクされている場合、それらは(間接的に)多くのことを行っていると見なされる可能性があります。

6
saiarcot895