14

概要

最近、私のアプリケーションの 1 つが依存しているフレームワークの作成者と会話をしました。その会話の中で、彼は余談として、彼のフレームワークを自分のアプリケーションにバンドルし、自分のコードと一貫性があることがわかっているバージョンをエンド ユーザーに配信すれば、私の生活はよりシンプルになるだろうと述べました。直観的に、私は常にこれを避けようとしてきました。実際、プロジェクト全体を使用せずにコードの一部を再配布できるように、自分のコードをセグメント化するのに苦労しました (たとえ誰かが再利用する可能性がほとんどなかったとしても)。それ)。しかし、しばらく考えてみたところ、なぜこれを行うのか特に正当な理由を思いつくことができませんでした. 実際、考えてみると、バンドルするのにかなり説得力のあるケースが見えてきました。私のすべての小さな依存関係。私は賛否両論のリストを思いついた.誰かが私が見逃しているものを指摘できることを願っている.

長所

  • バージョンの一貫性は、テストとトラブルシューティングが容易になることを意味します。
  • インストールするコンポーネントが少ないように見えるため、アプリケーションはより多くのユーザーに届く可能性があります。
  • 依存関係の小さな調整は、アップストリームのコード ベースに浸透するのを待つよりも、ダウンストリームで簡単に作成してアプリケーションと共に配信できます。

短所

  • 依存関係を含めるためのより複雑なパッケージ化プロセス。
  • ユーザーは、自分のマシンに依存関係の複数のコピーを作成することになる場合があります。
  • bortzmeyer の回答によると、個々のコンポーネントをアップグレードできないという潜在的なセキュリティ上の懸念があります。

ノート

参考までに、私のアプリケーションは Python で書かれており、参照している依存関係は「軽い」ものです。つまり、小さく、あまり一般的に使用されていないということです。(したがって、それらはすべてのマシンやすべてのリポジトリに存在するわけではありません。) また、アプリケーションを「パッケージ化する」と言うときは、パッケージ内にあるスクリプトを使用してインストールするのではなく、独自のソース ツリーの下に配布することを意味します。バージョンが競合する可能性はありません。また、Linux のみで開発しているため、Windows のインストールの問題について心配する必要はありません。

そうは言っても、パッケージの依存関係のより広い(言語に依存しない)問題についての考えも聞きたいです。私が見逃しているものはありますか、それとも私が考えすぎているという簡単な決定ですか?

補遺1

私は下流のパッケージャーのニーズにも非常に敏感であることは言及しておく価値があります。ディストリビューション固有の Deb または RPM でアプリケーションをラップするのは、できるだけ簡単にしたいと考えています。

4

8 に答える 8

10

依存関係の自動解決 (つまり、setuptools) にシステムを使用することが現実的でない場合、およびバージョンの競合を発生させずに実行できる場合は、依存関係をバンドルすることをお勧めします。アプリケーションと対象者を考慮する必要があります。真面目な開発者や愛好家は、特定の (最新の) バージョンの依存関係を使用する可能性が高くなります。彼らが期待しているものではないので、ものをバンドルすることは彼らにとって迷惑かもしれません.

しかし、特にアプリケーションのエンドユーザーにとっては、ほとんどの人が依存関係を探すことを楽しんでいるとは思えません。複製コピーを作成する限り、Web サイトを検索するのに 10 分以上費やすよりも (ダウンしている可能性がある) Web サイトを検索するのに 10 ミリ秒を費やすよりも、追加のキロバイトをダウンロードするために余分な 10 ミリ秒を費やすか、余分なメガバイトのディスク領域に 1 セントの何分の 1 も費やすことをお勧めします。 )、ダウンロード、インストール (バージョンに互換性がない場合、失敗する可能性があります) など。

ディスク上にライブラリのコピーがいくつあっても、それらが互いに邪魔にならない限り気にしません。ディスク容量は本当に、本当に安いです。

于 2009-02-28T18:03:58.683 に答える
3

エンド ユーザー向けのソフトウェアを作成している場合、目標は顧客にソフトウェアを使用してもらうことです。邪魔になるものはすべて非生産的です。依存関係を自分でダウンロードする必要がある場合は、代わりにソフトウェアを避けることにする可能性があります。ライブラリに下位互換性があるかどうかを制御することはできず、ユーザーがシステムを更新したためにソフトウェアの動作が停止することは望ましくありません。同様に、顧客が古いライブラリを使用して古いバージョンのソフトウェアをインストールし、システムの残りの部分が破損することを望んでいません。

これは、バンドリングが一般的な方法であることを意味します。依存関係をバンドルせずにソフトウェアがスムーズにインストールされることを保証でき、それがより少ない作業である場合、それはより良いオプションかもしれません. 何がお客様を満足させるかです。

于 2009-03-02T20:20:52.503 に答える
3

ライブラリ/フレームワーク/その他をアプリケーションにバンドルすることの短所で重要な点が忘れられているようです: セキュリティ更新。

ほとんどの Web フレームワークにはセキュリティ ホールが多く、頻繁なパッチ適用が必要です。とにかく、どのライブラリも、セキュリティ バグのために、いつの日かアップグレードする必要があるかもしれません。

バンドルしない場合、システム管理者はライブラリの 1 つのコピーをアップグレードし、依存するアプリケーションを再起動します。

バンドルすると、システム管理者はおそらく何かをアップグレードする必要があることさえ知らないでしょう。

したがって、バンドルの問題はディスク容量ではなく、古くて危険なコピーを放置するリスクです。

于 2009-03-04T09:32:22.560 に答える
2

Linux の場合は、バンドルについても考えないでください。あなたはパッケージ マネージャーやパッケージャーよりも賢くはなく、各ディストリビューションは独自の方法でアプローチします。せいぜい、アプリのパッケージ化に煩わされることはありませんが、これは素晴らしいことではありません。

Linux では、依存関係が自動的に取り込まれることに注意してください。ユーザーにそれらを取得させることは問題ではありません。それはすでにあなたのために行われています。

Windows の場合は、自由にバンドルしてください。

于 2009-03-02T20:05:06.987 に答える
1

Web アプリケーションのすべての依存関係を常に含めます。これにより、インストールが簡単になるだけでなく、システム上の他のコンポーネントがアップグレードされた場合でも、アプリケーションは安定して期待どおりに動作します。

于 2009-02-28T20:14:12.613 に答える
1

古典的な Windows DLL 地獄を再現することに注意してください。依存関係の数は必ず最小限に抑えてください。理想的には、言語とそのフレームワークだけに依存し、可能であればそれ以外には依存しません。

結局のところ、ハードディスク容量を節約することはもはや目的ではないため、ユーザーは複数のコピーを持つことを気にする必要はありません。また、ユーザーの数が非常に少ない場合を除き、すべての依存関係を取得するようにユーザーに要求するのではなく、自分でパッケージングの責任を負うようにしてください。

于 2009-02-28T20:19:48.217 に答える