如果我有一个绿地项目,使用基于Perl的配置模块的最佳实践是什么?
将有一个Catalyst应用程序和一些命令行脚本.他们应该共享相同的配置.
我认为我想要的一些功能......
分层配置,以干净地维护不同的开发和实时设置.
我想定义一次"全局"配置(例如,results_per_page => 20),那些继承但是我的dev/live配置可以覆盖.
Global: results_per_page: 20 db_dsn: DBI:mysql; db_name: my_app Dev: inherit_from: Global db_user: dev db_pass: dev Dev_New_Feature_Branch: inherit_from: Dev db_name: my_app_new_feature Live: inherit_from: Global db_user: live db_pass: secure
当我将项目部署到新服务器,或分支/分叉/复制到新的某个地方(例如,新的开发实例)时,我想(仅一次)设置要使用的配置集/文件,然后是所有未来的更新是自动的.
我想到这可以通过符号链接来实现:
git clone example.com:/var/git/my_project . # or any equiv vcs cd my_project/etc ln -s live.config to_use.config
然后在将来
git pull # or any equiv vcs
我也喜欢类似于FindBin的东西,所以我的配置可以使用绝对路径,也可以使用相对于当前部署.特定
/home/me/development/project/ bin lib etc/config
where/home/me/development/project/etc/config包含:
tmpl_dir: templates/
当我的perl代码查找tmpl_dir配置时,它将得到:
/home/me/development/project/templates/
但在实时部署方面:
/var/www/project/ bin lib etc/config
相同的代码将神奇地返回
/var/www/project/templates/
应该遵守配置中的绝对值,以便:
apache_config: /etc/apache2/httpd.conf
在所有情况下都会返回"/etc/apache2/httpd.conf".
而不是FindBin样式方法,替代方案可能是允许根据其他配置值定义配置值?
tmpl_dir: $base_dir/templates
我也喜欢小马;)
Catalyst :: Plugin :: ConfigLoader支持多个覆盖配置文件.如果您的Catalyst应用程序被调用MyApp
,那么它有三个覆盖级别:1)MyApp.pm
可以有一个__PACKAGE__->config(...)
指令,2)它接下来MyApp.yml
在应用程序的主目录中查找,3)它查找MyApp_local.yml
.每个级别可以覆盖每个其他级别的设置.
在我构建的Catalyst应用程序中,我将所有不可变设置MyApp.pm
,我的调试设置MyApp.yml
和我的生产设置放入MyApp_
,然后符号链接MyApp_local.yml
指向MyApp_
每个部署的服务器(它们都有点不同......).
这样,我的所有配置都在SVN中,我只需要ln -s
一步即可手动配置服务器.
Perl最佳实践警告您正是您想要的.它声明配置文件应该很简单,并避免使用您想要的巴洛克式功能.它继续推荐三个模块(其中没有一个是Core Perl):Config :: General,Config :: Std和Config :: Tiny.
这背后的一般理性是配置文件的编辑往往是由非程序员完成的,你制作配置文件越复杂,他们就越有可能搞砸它们.
所有这些都说,你可以看看YAML.它提供了一个功能齐全,人类可读的*
序列化格式.我相信Perl目前推荐的解析器是YAML :: XS.如果你这样做我会建议为最终用户编写一个配置工具,而不是让他们直接编辑文件.
ETA:根据Chris Dolan的回答,听起来YAML是你的方法,因为Catalyst已经在使用它(.yml是YAML文件的事实上的扩展).
*
我听说过盲人可能有困难的抱怨