我们目前正在我们的小组中介绍DBIx::Class
,我们希望从DBIx::Class::Schema::Loader
开始。但是,我们对代码样式有严格的要求,即我们Perl::Tidy
作为pre-commit
脚本的一部分,因为我们之前没有生成任何代码。现在,我们必须确保Schema::Loader
生成的代码干净整洁。我们无法在提交之前对代码运行perltidy
,因为它会破坏DBIC的MD5散列。因此集成到Schema::Loader
的后处理器将是我的首选,也可能是唯一可行的解决方案。但是仍然:你将如何处理这个问题?
编辑我也可以修补DBIx::Class::Schema::Loader::Base
以使用 perltidy
preprocess
参数(如果有的话)。
答案 0 :(得分:3)
DBICSL的开发版现在有一个overwrite_modifications选项,您可以使用该选项忽略代码的md5summed部分中的更改。这应该让你在提交之前对输出运行perltidy,并且仍然可以在以后重新转储。
答案 1 :(得分:3)
0.05000已经发布(之前的开发版本),它已经添加了overwrite_modifications选项rbuels。
我也会尽快添加一个post_process选项。
答案 2 :(得分:1)
这个问题刚才被问过,但我今天不得不处理这个问题,所以我想我会根据目前对该模块所做的更改分享我的解决方案。如果你扫描PerlTidy文档中的--format-skipping,你会发现你可以给出关于不应该整理哪些代码的PerlTidy指令。开始和结束标记是#<<<和#>>>分别。因此,默认设置如下所示:
# tidy my code
my $foo = 'bar';
#<<<
# don't tidy the code below
my $baz = 'foo';
# start to tidy again
#>>>
$foo .= 'stuff';
这很容易。现在您只需要让Loader用这些标记包装生成的代码。这可能看起来像这样:
my %args = (
components => [ 'InflateColumn::DateTime', 'TimeStamp' ],
debug => 1,
dump_directory => './lib',
filter_generated_code => sub {
my ( $type, $class, $text ) = @_;
return "#<<<\n$text#>>>";
},
generate_pod => 0,
naming => 'current',
overwrite_modifications => 0,
skip_load_external => 1,
use_moose => 1,
use_namespaces => 1,
);
make_schema_at( 'My::Schema', \%args, [$dsn, $user, $pass] );
重要的部分是filter_generated_code
,它允许您包装生成的代码。现在您可以生成模式文件,并且仍然可以对它们进行PerlTidy。这将允许您整理在生成的文件底部添加的自定义代码,而不会遇到生成的代码被make_schema_at()以外的其他内容更改时发生的错误。
在我的情况下,我决定关闭generate_pod
,因为PerlTidy仍然(由于某种原因)在生成的Pod中插入一些换行符。我还没弄清楚为什么会这样,但是关闭Pod会修复它而我可以没有它。