目前我们使用DBIx::Class::Schema::Loader来生成和重新生成(当我们的 db 模式更改时)一组 Result 类。
我们在这些类的底部添加了额外的关系和方法,当人们重新生成或更改模式时,这会导致合并地狱。
我们希望在一组单独的文件中维护我们的自定义更改,这些文件与自动生成的文件并行。
有没有一种简单、干净、推荐的方法?
目前我们使用DBIx::Class::Schema::Loader来生成和重新生成(当我们的 db 模式更改时)一组 Result 类。
我们在这些类的底部添加了额外的关系和方法,当人们重新生成或更改模式时,这会导致合并地狱。
我们希望在一组单独的文件中维护我们的自定义更改,这些文件与自动生成的文件并行。
有没有一种简单、干净、推荐的方法?
我遇到了同样的问题。您可以创建另一个从生成的类继承的类。但是,您需要将表引用和关系拉到您正在编辑的类中,但是您可以将列定义以及不在生成的类中的内容保留下来。我基本上为加载器编写了一个帮助程序,它将类生成到“不可变”命名空间中,并在“可变”命名空间中为每个类创建一个子级,以及表名引用和生成模型的关系。它似乎工作得相当好,我不再需要担心开发人员编辑类的生成部分。这些天我可能应该在一篇博文中写下整个事情。
我通过 Moosifying 模式解决了这个问题,然后在 schema->connection(); 之后创建了一组应用于模式类的 Moose::Roles;
它有点像这样:
my $schema = My::Schema->connection();
foreach my $source ($schema->sources) {
my $domain_pkg = "My::Domain::$source";
eval "require $domain_pkg";
# ignore failures due to file-not-found
if ($@ && $@ =~/^Can't locate.*INC/) {
# but barf if class doesnt compile
} elsif ($@) {
confess "Failed to load $domain_pkg for $pkg!!: - $@";
# re-register domain class with the resultsource
# and apply the role
} else {
my $schema_pkg = "${pkg}::$source";
$c->register_class($source, $schema_pkg);
use Moose::Util;
# check schema is moosyfied
if ( $schema_pkg->can('meta') ) {
my $meta = $schema_pkg->meta;
eval {
Moose::Util::apply_all_roles($meta, $domain_pkg);
};
if ($@) {
confess "Failed to add $domain_pkg role to $schema_pkg: $@\n";
} else {
l4p->info("Found and applied Domain role: '$domain_pkg' for schema: '$schema_pkg'");
}
} else {
warn "Cant call meta on $schema_pkg. ";
}
}
}
附近..
use MooseX::Declare
role My::Domain::Person {
# modify schema
My::Schema::Person->inflate_column( ..);
My::Schema::Person->belongs_to(..);
My::Schema::Person->set_primary_key(..);
# add some method modifiers to check/modify construction
around new (ClassName $class : $params) {
munge params..
$self->$orig($params);
}
# post insert hook
after insert () {
do_something..
}
# domain methods
sub fullname {
$self->firstname.' '.$self->surname;
}
}
虽然这在技术上不是问题的答案,但它是产生它的合并地狱问题的解决方案。调用dbicdump
ormake_schema_at
时,您可以设置omit_version
andomit_timestamp
标志,这将生成如下签名:
# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CKsL4EO4b/JE3QXBSC4EXg
重新转储时,除非实际表更改,否则此签名不应更改,因此任何版本控制都不会看到不合理的冲突。