私が働いている会社は、Delphiでシステムを開発しています。このシステムには、数十のexeモジュールが含まれており、ソースコードに関しては、それぞれがある程度同一です。悲しいことに、誰もライブラリを使用して共有コードを挿入することを気にしませんでした。つまり、これらすべてのモジュールが共有するコードでバグ修正を行うたびに、プログラマーはそれらすべてを個別に修正する必要があります。いつもとても時間がかかります...
共有コードをライブラリに入れる方法を見つけることにしました。DLLとBPLを検討しました。この場合、BPLはプログラマーにとってはるかに使いやすく、面倒ではないように見えました。特に、コードがソフトウェアでのみ使用され、Delphiでのみ使用されていることがわかりました。
すべてのexeモジュールで共有されているすべてのコードをBPLに入れて、すべてがうまくいくように見えますが、理解できないことがいくつかあり、説明していただければ幸いです。
コードをBPLに分割した後、私が期待したのは、作成したBPLを使用してexeファイルを展開するだけで十分であるということでした。しかし、rtl100.bplとvcl100.bplも必要であることが判明しました。なんでそうなの?exeとBPLのみをデプロイしたい。ボーランドやサードパーティ企業が提供する大量のライブラリをエンドユーザーに提供したくありません:)。以前にコンパイルされていたので、exe内でコンパイルしてほしい。それは可能ですか?
私がこれまでにしたことは次のとおりです。
- すべての共有pasユニットをBPLに配置しました。各BPLには同じカテゴリに属するユニットが含まれているため、プログラマーは特定のBPLでどのコードを期待するかが明確になります。
- 各BPLは、「ランタイムおよびデザインタイム」ライブラリです。
- 各BPLは「明示的に再構築」されます。後者の2つは、BPLのデフォルトのプロジェクト設定です。
そして、exeプロジェクトに関しては:
- 以前にBPLに配置したすべてのユニットを削除しました。
- BDS2006の[ツール]->[パッケージのインストール]メニューからBPLをインストールしました。
- exeプロジェクトの設定で、[ランタイムパッケージを使用してビルドする]オプションをオンにし、下の編集ボックスにすべてのBPLパッケージを一覧表示しました(そこに表示される他のすべてのパッケージをクリアしたため、パッケージのみ)。
これが私がしたすべてです。exeプロジェクトは正しくコンパイルされますが、すべてのBPLがソースコードファイルと一緒に保存されていても、BPLのソースコードにアクセスできません(exeプロジェクトからそのコードに移動できません)。なんで?それは私には奇妙に思えます。
私はいつも長い説明を書く傾向があります-申し訳ありません:)。よろしくお願いします。私が言及したポイントについて、いくつかの説明が必要です。BPLのみを使用してexeを展開すること、全体として行ったことの正確さ、およびBPLソースコードに移動できないことです。事前にどうもありがとうございました!
議論してくれてありがとう。私が選んだアプローチは良い考えではないと言う人もいました。私たちのソフトウェアは100以上のモジュールで構成されています(それらのほとんどはさまざまなデバイスのドライバーのようなものです)。それらのほとんどは同じコードを共有します-ほとんどの場合クラス。問題は、これらのクラスが常に個別のスタンドアロンpasユニットに配置されるとは限らないことです。つまり、共有コードは、モジュールに固有のコードを含むユニットに入れられることがよくあります。つまり、共有クラスのバグを修正する場合、それが定義されているpasユニットをすべてのソフトウェアモジュールにコピーして再コンパイルするだけでは不十分です。残念ながら、固定されたコードを1つずつコピーして、適切なユニットとクラスに貼り付ける必要があります。これには多くの時間がかかります。これは私が排除したいことであり、正しいアプローチを選択します。助けてください。
BPLを使用することは良い解決策になると思いましたが、一部の人が言及したように、いくつかの欠点があります。最悪の問題は、各EXEに複数のBPLが必要な場合、テクニカルサポート担当者がどのEXEにどのBPLが必要かを把握し、エンドユーザーに適切なファイルを提供する必要があることです。ソフトウェアアップデーターがない限り、これは技術者とエンドユーザーの両方にとって大きなメリットになります。彼らは確かに迷子になって怒ります:-/。
また、互換性の問題が発生する可能性があります-1つのBPLが多くのEXEで共有されている場合、1つのBPLの変更は、1つのEXEには有効であり、他のいくつかのEXEには不利になる可能性があります-@WarrenP。
非常に多くのプロジェクトでバグ修正をより迅速に行うには、どうすればよいですか?私は次のアプローチの1つを考えます。もっと良いアイデアがあれば教えてください。
- 共有コードを個別のスタンドアロンpasユニットに配置します。そのため、そのうちの1つにバグ修正がある場合は、それをすべてのプロジェクトにコピーして(古いファイルを上書きして)、すべてを再コンパイルするだけで十分です。
この解決策は、後から変更されたコードが具体化されている限り、問題ないようです。しかし、一般的な使用機能と手順を備えたpasユニットもあります。これは、多くの場合、変更を取り消すものです。必要に応じて、単一のプロジェクトで新しい機能を追加します。したがって、100個のモジュールの1つに新しい関数を記述し、それを汎用ユニットに配置するとします。1、2か月後、別のモジュールを変更し、2か月前に作成したものと同じ関数が必要だと思います。モジュールを見つけて(それがどれであったかを覚えていないと難しい)、関数をコードにコピーする必要があります。そして明らかに、一般的な使用単位は、各プロジェクトに個別に保存されている限り、モジュールごとに完全に異なります。そして、実行するバグ修正がある場合...全体の話が繰り返されます。
- すべての共有コードのBPLを作成しますが、EXEをスタンドアロンにするために、それらをEXEにリンクします。
私にとっては今のところ最善の解決策のようですが、いくつかの短所があります。BPLでバグ修正を行う場合、各プログラマーは自分のコンピューターのBPLを更新する必要があります。彼らが忘れたらどうしますか?それでも、それは小さな問題だと思います。変更についてお互いに通知するように注意すれば、すべてがうまくいくはずです。
- @CodeInChaos:あなたを正しく理解したかどうかはわかりません。プロジェクト間でpasファイルを共有するという意味ですか?どうやってするか?ソースコードはSVNに保存されます。つまり、共有コードを別のフォルダーに保存し、すべてのプロジェクトでそのコードを検索する必要がありますね。そして、SVNからプロジェクトとそれが依存するすべてのフォルダーをダウンロードします...
どうか、私が良い解決策を選ぶのを手伝ってください。ソフトウェア開発への愚かなアプローチのために、バグ修正で必要以上の時間とお金を会社が失うことを望んでいません。
どうもありがとうございます。