【发布时间】:2014-11-20 22:41:29
【问题描述】:
在哪里放置初始化代码(连接到数据库、生成内容、加载数据文件等)?
以下是一些现有选项:
- 将其放入相关模块中。这将在模块为
used 时执行BEGIN{}中的代码
(+) 良好的封装性。
(-) 一切都与数据库、配置、特定文件位置等相关联。难以隔离单元测试,更难运行代码 sn-ps 来查找错误,如 perl -MFoo -d -we 'Foo->new'
- 将其放入单独的脚本中(
startup.pl等)
(-) 代码远离使用的地方,容易忘记。
(-) 初始化全有或全无。
-
项目中每个模块中的
startup()(或其他名称)例程。
(-) 还是很容易忘记运行它。
- 使用 Perl 的内置 INIT 块。
这就是问题所在(当然,Apache 也是如此):
bash$ plackup -e 'use warnings; INIT{ warn "foo"; }; sub { warn "here"; return [200, [], []] };'
Too late to run INIT block at (eval 7) line 1.
HTTP::Server::PSGI: Accepting connections at http://0:5000/
here at (eval 7) line 1.
127.0.0.1 - - [20/Nov/2014:14:18:08 +0200] "GET / HTTP/1.1" 200 - "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:33.0) Gecko/20100101 Firefox/33.0"
注意Too late to call INIT 警告,输出中没有“foo”的迹象。
现在我想要一个如下使用的模块:
在项目的模块中:
use Init::Queue sub {
get_dbh();
load_file();
build_cache();
}; # postpone till explicitly called
在生产/初始化代码中:
Init::Queue->startup();
# this executes all startup blocks,
# in order of appearance
有这样的模块吗?如果没有,是否需要?或者有没有我忽略的更简单的方法?
【问题讨论】:
标签: perl