2012-05-25 12 views
6

私は現在、約15歳のWebアプリケーションを開発中です。巨大なPerlコードベースを整理する

これは主にCGI perlスクリプトHTML :: Templateテンプレートを含んでいます。

それは000 12上のファイルおよび全コードの約260メガバイトを有します。私は、1500を超えるPerlスクリプトは必要ないと推測し、私は未使用のコードをすべて取り除きたいと思っています。

コードのために書かれた事実上何のテストはありません。

私の質問は以下のとおりです。あなたは私だけuse Dとrequire Dモジュールのリストを得るのを助けることができる任意のCPANモジュールの意識

  • ていますか?
  • 余分なコードをすべて削除したい場合、あなたのアプローチは何でしょうか?

私は以下のアプローチで考えていた:

  • 試みをするものでuserequire perlの組み込み関数をオーバーライドするために、出力の特定の場所にロードされたファイル名
  • オーバーライドwarningsおよび/またはstrict modules import関数を実行し、特定の場所にファイル名を出力します。
  • Devel::Cover perlモジュールを調べ、同じアプローチをとり、c自動テストの代わりに手動テストを行うときにodeを実行します。
  • lsofのいくつかの創造的な使用法(私はまだそれを行う方法がわかりません)を読み込むファイル名を記録するカスタムファイルでperl実行可能ファイルを置き換えます。 (?!?)
+0

私のアプローチは、コードをタッチする前にテストを書くことから始まります。 –

+0

私の見積もりでは、コードの80%が使用されていない/必要でない - コード全体のテストを書くことは経済的に実現可能ではない。 –

+1

@ TudorConstantin - CODEの単体テストを記述しません。アプリのユースケースの機能テストを作成します。 – DVK

答えて

5

Devel::Modlistはあなたが必要なものを与えることがあります... CGIを実行するときに、これは困難であることを知っているが、私はそれを使用したことがありません。

私はこのような何かをする必要がありましたが、私はプログラムの最後に%INCを検査するよりブルートフォースのアプローチを選択しました。

END { 
    open my $log_fh, ...; 
    print $log_fh "$_\n" for sort keys %INC; 
} 
+0

甘い。 $ log_fhを$ 0の関数にして、少しでも動かしてみましょう... – gsiems

+0

これを行うには複数の方法があります - あなたの両方の方法は私の必要性のためにちょうど正しいようです。今、私は 'END {...} 'のアプローチに取り組んでおり、スムーズに動作します。大変ありがとうございます –

2

第一近似として、私は単純に続いて

egrep -r '\<(use|require)\>' /path/to/source/* 

を実行し、その出力をクリーンアップする日のカップルを費やすだろう。これは、使用されている、または必要とされているすべてのモジュールのリストを提供します。

また、特定のライブラリパスを除外するために@INCで遊ぶことができるかもしれません。

実行パスを決定しようとしている場合は、デバッガで 'trace'(デバッガの 't')をオンにしてコードを実行し、その出力をテキストファイルにリダイレクトすることができます。さらなる分析。私は

+0

これは、コードベース内のすべてのモジュールを使用/必要として出力しますなぜなら、古いバージョンのアプリケーションが書き換えられているからです(コピー/ペーストしてから書き直す)。これらの依存関係のグラフを作成し、エントリポイントに関連するすべてのファイルを抽出すると、アプリケーションのエントリポイントがわかります..... –

+0

Ahh。だから、あなたは12000のソースファイルを持っていますが、実行されているファイルと実行されていないファイルは分かりません。 –

+0

Webサーバーのログからエントリポイントを決定できるはずです。その後、短いスパイダーを作成して、リスト内の各ファイルを読み取り、useおよびrequireステートメントを検索することを検討します。新しく発見された各ファイルをスコアボードやグラフに記録し、それをリストに置き、リストが空になるまで続行します。 –

2

関連するタイムスタンプを使用すると、さまざまなスクリプトファイルにアクセス時間をチェックすることができ、オンになっていると仮定すると、 - 使用されていないすべてのトップレベルのスクリプトファイルを除外するべきです。

CGI.pmに現在のスクリプト名($ 0)を記録して何が起こっているかを見るための計測器を追加する価値があります。

+0

あなたの答えをありがとう - 調査の価値がある - 特にイメージのようなperl以外のリソース –

関連する問題