5

私のPerlコードに本番コードの場所と「ベータ」コードの場所がある場合(たとえば、本番Perlコードは/usr/code/scripts、ベータPerlコードはあり/usr/code/beta/scripts、本番Perlライブラリはあり/usr/code/lib/perl、それらのライブラリのベータ版/usr/code/beta/lib/perlはあります)、簡単な方法はありますか?そのような設定を達成するには?

正確な要件は次のとおりです。

  • コードは、本番環境とベータ版の場所で同じである必要があります。

    明確にするために、コード(ライブラリまたはスクリプト)をベータ版から本番環境に昇格させるために必要なのは、文字通りcpベータ版から製品の場所にコマンドを発行することだけです。ファイル名とファイルの内容の両方が同一である必要があります

  • スクリプトのベータ版は、他のベータスクリプトとベータライブラリ(存在する場合)または本番ライブラリ(ベータライブラリが存在しない場合)を呼び出す必要があります

  • /usr/code/コードパスは、ベースディレクトリ( vs /usr/code/beta/)を除いて、ベータ版と本番環境で同じである必要があります。

  • スクリプトはすべて同じベースディレクトリの下にある必要がありますが、任意の深さレベルのサブディレクトリにある可能性があります(これにより、セクション31.13use lib "$FindBin::Bin/../lib"の従来のソリューションが除外されます。 「ProgrammingPerl」のlibを使用してください)

この質問への回答として、どのように問題を解決したかを紹介しますが、もっと良い方法があるかどうか知りたいです。

4

3 に答える 3

2

私たち自身の解決策は次のとおりです。

  • ライブラリを持っている(BetaOrProd.pmと呼びましょう)

    • ライブラリは、すべてのスクリプトuse BetaOrProd;に「 」を介して含める必要があります
    • ライブラリは、 " "プラグマ(およびそれを使用する場合は "警告を使用")の後のすべてのスクリプトの最初のuseステートメントである必要があります。ブロックuse strict;の前を含みます。BEGIN
    • ライブラリには、BEGINほとんどのロジックを含むブロックがあります
    • ライブラリ内のそのBEGINブロックは、プログラムのディレクトリパスをチェックします(絶対パスが適用された$ 0に基づく)
    • ディレクトリパスがで始まる場合/usr/code/beta、プログラムはベータ版の場所で実行されていると見なされ、それ以外の場合は本番環境で実行されます。
    • いずれの場合も、リスト/usr/local/lib/perlの先頭にシフトされていません@INC
    • ベータ版の場所の場合、その後はリスト/usr/code/beta/lib/perlの先頭にシフトされません。@INC
    • BETAの場所の場合、特別な変数$ isBETA(BetaOrProd.pmからエクスポートされたアクセサメソッドによってアクセス可能)が「BETA」に設定されます。
  • スクリプト/ライブラリが別のスクリプトを呼び出す必要があるときはいつでも、呼び出されたスクリプトへのパスは、BetaOrProd.pmからエクスポートされた$isBETA変数へのアクセサーに基づいて計算されます。

  • Perlライブラリが必要または使用される必要があるときはいつでも、特別なロジックは必要ありません@INC。BetaOrProd.pmによって変更されたものが、モジュールのインポート元を認識します。モジュールがベータ版の場所にある場合は、ベータ版の場所からのライブラリがベータ版スクリプトによって使用されます。それ以外の場合は、製品の場所からのライブラリが使用されます。

このアプローチの主な欠点は次のとおりです。

  1. すべてのスクリプトには、" "プラグマの後のすべてのスクリプトuse BetaOrProd;の最初のuseステートメントとして""が必要です。use strict;

    当社では、デプロイされたすべてのコードが自動バリデーターに合格する必要があるため、この要件をチェックできます。

  2. を介してBetaOrProd.pmをベータテストすることはできません/usr/code/beta/lib/perl。ええと。

    ライブラリの非常に徹底的なユニットおよび統合テストによって軽減されます

于 2010-03-19T02:26:46.453 に答える
2

私はFindBinでこれに対処します:

use FindBin;
use lib "$FindBin::Bin/../lib";

または、汚染モードがアクティブな場合:

use FindBin;
use lib ("$FindBin::Bin/../lib" =~ m[^(/.*)])[0];

これは既知のパスや固定パスに依存しないため、プロジェクトディレクトリの新しいコピーを作成するだけで、1台のマシンで好きなだけコードの独立したセットを作成できます。

プロジェクトの各開発イメージですべてのプロジェクトモジュールの完全なコピーを維持していますが、そうではなく、代わりにライブコピーのモジュールにフォールバックするベータコピーに依存しているようです。上記のsのuse lib /path/to/live/bin前にそれを処理するか、または上のディレクトリの1つにuse libリンクするだけで、いつでもすぐに利用できるようになります。/path/to/live/bin@INC

ライブバージョンとベータバージョンが異なるアカウントから実行される場合、local :: libも一見の価値があるかもしれませんが、これは実際には意図されたものではないようです。

更新:これは、スクリプト自体が特定のディレクトリの複数のサブディレクトリに存在する可能性がある場合は機能しませんが、それ以外の場合は機能します。

于 2010-03-19T10:59:08.377 に答える
0

同様の構成を使用する必要がありました。ただし、モジュールはプロジェクト名にちなんで名付けられており、環境固有の構成変数(データの場所、dev / prodデータベースの資格情報など)の読み込み、コマンドライン引数の処理、設定など、他のいくつかの役割を実行できます。プロジェクト内のほとんどのスクリプトに役立つその他の変数(YYYYMMDD形式の現在の日付、株式市場が現在開いているかどうかなど)

于 2010-03-19T04:56:56.077 に答える