なぜ-MCarp =冗長を受け入れることを証明しないのだろうか?
質問
私は、このテストスクリプトを実行しました。
use strict;
use warnings;
use Test::More tests => 3;
use Carp;
ok(1<2);
pass();
fail();
croak "example";
コマンドラインprove -MCarp=verbose -v foo.pl
を使用して、次のエラーを得ます:
Subroutine App::Prove::verbose redefined at /opt/ActivePerl-5.12/lib/App/Prove.pm line 407
App::Prove::_load_extension('App::Prove=HASH(0x683718)', 'Carp=verbose') called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 419
App::Prove::_load_extensions('App::Prove=HASH(0x683718)', 'ARRAY(0x683850)') called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 481
App::Prove::run('App::Prove=HASH(0x683718)') called at /opt/ActivePerl-5.12/bin/prove line 11
Undefined subroutine &Carp::verbose called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 484.
私はperl -MCarp=verbose foo.pl
を使用して、それを実行している場合は問題ありません。何がカープ冗長に拒否するようprove
を引き起こしていますか?彼らは地球がcroak
にcroak
を交換せずにconfess
とき、どのように私は私のテストからの完全なコールスタックを得ることができますか?
解決
prove -M
はperl -M
と同等であることが表示されません。あなたのテストにモジュールをロードしない、証明拡張子をロードするように表示されます。ドキュメントは、この点には全く不明であるが、アプリケーション内のコード::ではないことを証明します。 prove -MCarp=verbose
輸入カープ::冗長なアプリになるよう::上の問題を引き起こして証明します。
あなたが欲しいものを行うための簡単な方法はPERL5OPT環境変数を使用することで、プラスカープ::常にのすべてをオンになると、スタックトレースに警告し、金型(と鯉とcroaks)。
PERL5OPT=-MCarp::Always prove ...
このはとか、証明なしで、どのような状況での作業という利点もあります。
他のヒント
証明完全に異なるプログラムであること、perlのよりコマンドライン引数の非常に異なるセットを持っている?
の証明-Mは、プラグマを有効にするためのもの、私は信じている、です。鯉は、実際の証明内部の仕組みを妨げる冗長()サブルーチンへの前方参照をエクスポートします。
あなたは、このような小さなモジュールを作成することができます
# Verbme.pm
use Carp;
$Carp::Verbose = 1;
と証明するからそれを有効にします。
prove -MVerbme -v foo.pl
しかします。
EXPORT_FAIL
はまだそれが「失敗」しているという事実にもかかわらず、verbose
に割り当てimport
にしようとすると、カープは、ほとんど間違っているExporter::Heavy
に*Carp::verbose
「オプション」を、処理するために輸出業者の*{"$callerpkg::verbose"}
メカニズムを使用しています。残念ながら、App::Prove
は、それが仕事に依存する、とあなたの-Mオプションは、インポートがApp::Prove
内で発生する原因となることを冗長サブを持っています。私は必ずここに責任がある人ではないよ - それはCarp
リストにかどうEXPORT_FAIL
からのものを除去しないため、この方法ではExporter::Heavy
、または@imports
を使用して(AB)のため@failed
が、一緒に彼らはそれを破壊している:)