我怎样才能整理DBIx :: Class :: Schema :: Loader的输出?

时间:2010-01-20 14:54:17

标签: perl dbix-class

我们目前正在我们的小组中介绍DBIx::Class,我们希望从DBIx::Class::Schema::Loader开始。但是,我们对代码样式有严格的要求,即我们Perl::Tidy作为pre-commit脚本的一部分,因为我们之前没有生成任何代码。现在,我们必须确保Schema::Loader生成的代码干净整洁。我们无法在提交之前对代码运行perltidy,因为它会破坏DBIC的MD5散列。因此集成到Schema::Loader的后处理器将是我的首选,也可能是唯一可行的解​​决方案。但是仍然:你将如何处理这个问题?

编辑我也可以修补DBIx::Class::Schema::Loader::Base以使用 perltidy preprocess参数(如果有的话)。

3 个答案:

答案 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会修复它而我可以没有它。