Table of Contents
はじめに
Delphi の旧バージョンで作られたプロジェクトを最新環境へ移行する際、思わぬ設定やコードが足かせになることは少なくありません。こうした課題を効率的に洗い出し、改善のヒントを与えてくれるのが 「Delphiプロジェクトアップグレードアドバイザ」 です。RAD Studio 13 Florence から利用できるこの新機能を使えば、不要なパスや古いエイリアス、循環参照といった問題点を自動的に検出し、プロジェクトのクリーンアップを大幅に省力化できます。今回はこのツールの使い方を、実際の旧バージョンプロジェクトをスキャンする流れに沿って紹介していきます。
Delphiプロジェクトアップグレードアドバイザって何?
「昔のコードを開くと、どこを直せばいいのか分からない…」Delphi ユーザーなら誰もが一度は経験したことがある悩みではないでしょうか。RAD Studio 13 に搭載された「Delphiプロジェクトアップグレードアドバイザ」を使えば、プロジェクトをスキャンして、古い設定や非効率な記述をピンポイントで指摘してくれるので、移行作業の不安が一気に軽減されます。移行作業の効率化はもちろん、コンパイル速度の向上や快適な開発エクスペリエンスにも直結する 移行に必要なツール です。Delphi プロジェクトアップグレード アドバイザは、有効なアップデートサブスクリプションをお持ちの方なら GetIt パッケージマネージャからインストールできます。
Step 1:アップグレードアドバイザを起動する
まずは、Delphi 13がインストールされている環境で、アップグレードアドバイザを起動してみましょう。
起動方法
- Delphi 13のIDEを起動
- プロジェクトを開く
- メニューから [ツール] → [Delphi Project Upgrade Advisor] を選択
Step 2:アップグレードアドバイザによってプロジェクトを分析する
現在開いているプロジェクトに対してアップグレードアドバイザを使用 してプロジェクトを分析してみましょう。
ウィザードでは次の4種類の診断が行えます。
- 無効なライブラリパスの確認
- ユニットのエイリアス検出
- 修飾されていないユニット名の確認
- 循環参照の検出
各機能の詳細な内容については、DokWiki のDelphiプロジェクトアップグレードアドバイザに詳しく解説されています。
特に後述する循環参照の検出に関しては、別途コンパイラのGraphViz ファイル(.gv)が必要となるので注意してください。
必要な診断項目にチェックに ✔ を入れて、[Execute]ボタンを押してください。
Step 3:アップグレードアドバイザによる分析の結果を確認する
実行すると、問題が一覧で表示されます。「どのパスが無効か」「どのユニットが古い設定のままか」が一目で分かり、不要なものをすぐに整理できます。
無効なパスのチェック
検索パスまたはライブラリパスに無効なパスがあると、無効な場所をチェックしたり開こうとしたりするオペレーティングシステムの呼び出しコストが高くなるため、コンパイル速度が低下する可能性があります。これは比較的軽微な問題ですが、無効なパスが多く、検索対象となるユニットが数百個ある場合は、パフォーマンスに影響を与える可能性があります。出力例を以下に示します。
[crayon-68d67f69cb5f8109539446/]
ご覧のとおり、プロジェクト検索パスに無効なパスが検出されました。設定から無効なフォルダを削除することをお勧めします。
ユニットのエイリアス検出
ユニットエイリアスは、Delphi 1との互換性のためにDelphi 2で導入され、その後長年にわたり新規プロジェクト用の定義済み設定として残っていました。古いプロジェクトを保守し、新しいバージョンに移行している場合、この設定が残っている可能性があります。ユニットを使用する際に、コンパイラは頻繁にこの設定をチェックする必要があります。
長年にわたり、ユニット構造の変更に対応するために、他のユニットエイリアスが追加されてきました。繰り返しますが、以下は古いプロジェクトのサンプル出力です。
[crayon-68d67f69cb5ff659133500/]
ユニット名を正しいものに置き換え、プロジェクトオプションからユニットエイリアスの設定を削除することをお勧めします。ユニットを置き換えるには、ウィザードのGetItパッケージに含まれる専用のreFindスクリプトを使用できます。このスクリプトについては後ほど説明します。
修飾されていないユニット名の確認
3つ目のテストは、非修飾ユニット名(「uses VCL.Forms」ではなく「uses Forms」など)を検出します。すべてのユニットに対してすべてのプレフィックスを試す必要があるため、コンパイラの負荷が増大します。そのため、クリーンアップすることをお勧めします。ツールは、実際のコード内で非修飾ユニット名を検索しないことに注意してください。 プロジェクト構成をチェックし、該当するエントリを削除することを推奨します。
以下は出力例です。
[crayon-68d67f69cb601381895357/]
このエントリを削除すると、次のようなエラーが表示される可能性があります。
[crayon-68d67f69cb602522277956/]
繰り返しますが、uses ステートメント内のユニット名を修正するには、ウィザードの GetIt パッケージに含まれる専用の reFind スクリプトを使用できます。これについては後ほど説明します。
循環参照の検出
4つ目のオプションは、循環ユニット参照のチェックです。この場合、プロセスは2つのステップに分かれます。まず、コンパイラオプションでGraphVizファイルの生成を有効にし(https://docwiki.embarcadero.com/RADStudio/Florence/en/GraphViz_file_export_for_the_Delphi_Compiler を参照)、プロジェクトをコンパイルします。次に、ウィザードでファイルを選択します。
これはシステムライブラリを除外したサンプル出力です(GraphViz ファイルで –graphviz-exclude パラメータを追加することで、VCL ライブラリを除外することもできます)。
[crayon-68d67f69cb604101879736/]
GraphViz ファイルを調べることで、ウィザードは循環ユニットを検出して表示できます。これは、大きなグラフでは非常に複雑な処理となります。
一部の uses ユニットの循環は避けられませんが、アプリケーション内の循環を確認し、コード構成とアーキテクチャを改善することで回避できる循環を検討する必要があります。一般的に言えば、これはモジュール間の依存関係を削除するのに役立つ良い検証となります。
Step 4:Refindスクリプトを実行(任意)
Delphiプロジェクトアップグレードアドバイザに含まれるrefindスクリプトを使えば、不要なユニット名の置き換えや整理を自動化可能です。
refindスクリプトは、以下のパスに配置されています。
C:Users<ログイン名>DocumentsEmbarcaderoStudio37.0CatalogRepositoryDelphiProjectsUpgradeAdvisor1.0RenameUnits.txt
まずは結果を確認し、バックアップを取ってから実行するのがおすすめです。
reFindの使い方にについては、下記のDocWikiに詳しい解説があります。上記のRenameUnits.txtがルールファイルとして利用できます。
まとめ
Delphiプロジェクトアップグレードアドバイザは、既存の古い(そして大規模な)Delphi アプリケーションをクリーンアップするのに役立ちます。これにより、最新のコードをコンパイラ(および DelphiLSP エンジン)でより高速に処理できるようになります。長年にわたり、大規模なアプリケーションを持つお客様が同様の変換の恩恵を受けているのを目の当たりにしてきました。そして今回、同様の変換をより迅速に実現するためのツールをリリースしました。
このツールにより、プロジェクトの最新環境への移行が省力化され、効率的になることを期待しています。