Perl::Criticでコーディングスタイルを統一
Perl::Critic - Critique Perl source code for best-practices. - metacpan.orgをコーディングスタイルを統一するために使っています。
(実際には字面としてのコーディングスタイル(コードレイアウト?)はPerl::Tidy - metacpan.orgが担当しているわけですけども、ここでは「use strictを入れる」「PODを付ける」なども含めてコーディングスタイルと言ってます)
コーディングスタイルに唯一絶対的に正しいなんてものはないわけで(だから宗教論争にもなるわけで)、機械的に統一することで揉め事はなくなります。
しかしその時に.perlcriticrcなんかを使ってコーディングスタイルをデフォルトから変更してしまうと元も子もありません。
.perlcriticrcに何を設定するかで揉めますし、例えその時に揉めなかったとしても将来新しい人が入ってきた時にその人と揉めるかも知れません。同じ理屈で、.perltidyrcも作りません。
多少気に食わない規約でも第三者が定めたルール(つまりデフォルトのルール)に従っておくが吉です。
というわけで全てのPerlスクリプトはperlcritic -1に従うようにしています。最初はやり過ぎだとは思いましたが、一番コードの統一性があり一番揉め事が無いのがPerl::Critic -severity=1だと思いますので。
上記を遵守するため、プロジェクトには以下のテストスクリプトをt/01perlcritic.tとして含めるようにしています。
#!/usr/bin/env perl # # $Id$ # use strict; use warnings; use version; our $VERSION = qv('0.0.1'); use blib; use English qw(-no_match_vars); use Test::Base; if ( $ENV{TEST_CRITIC} || $ENV{TEST_ALL} || !$ENV{HARNESS_ACTIVE} ) { eval { my $format = "%l: %m (severity %s)\n"; if ( $ENV{TEST_VERBOSE} ) { $format .= "%p\n%d\n"; } require Test::Perl::Critic; Test::Perl::Critic->import( -format => $format, -severity => 1 ); }; if ($EVAL_ERROR) { plan skip_all => 'Test::Perl::Critic required for testing PBP compliance'; } } else { plan skip_all => 'set TEST_CRITIC for testing PBP compliance'; } all_critic_ok();
対象にしたくないファイル(CatalystのヘルパースクリプトやDBIC::Schema::Loaderで生成したファイルなど)は以下のように除外処理を記述できます。
if ( my $all_code_files = Test::Perl::Critic->can('all_code_files') ) { no warnings 'redefine'; *Test::Perl::Critic::all_code_files = sub { my @files = $all_code_files->(@_); # @filesから対象にしたくないファイルを除外 return @files; }; } all_critic_ok();