本人博客:http://chen-shang.github.io
原文地址
约定优于配置
- 配置文件目录以 conf_ + "项目名称" 组成, 如 saas 项目其配置文件目录为 conf_saas
- 配置文件目录与项目目录同级
chenshang@MrRobot-3:~/work/git$ tree -L 1
.
├── conf_saas
└── saas
这样约定是为了写部署脚本的时候方便,因为打包的时候需要应用对应环境的配置文件,所以需要制定配置文件所在目录.这里有考虑将配置文件写到项目目录中,但是这样配置文件就和项目耦合到一起了,倒不如以多项目的形式组织到一起。
因为配置文件需要使用 git 放到远程仓库中,这样每次修改都会有一个明确的提交,做到有迹可循(像以前放到服务器上的话,谁修改了配置文件连个记录都没有,而且修改一台机器后其他机器的修改可能会忘记)。
chenshang@MrRobot-3:~/work/git/conf_saas [master]$ tree -L 1
.
├── README.md
├── dev
├── local
├── prod01
├── prod02
└── test
chenshang@MrRobot-3:~/work/git/saas/src/main [master]$ tree -L 2
.
├── resources
├── conf
├── database
├── jdbc
├── logback.xml
├── mapper
├── script
├── spring
├── spring-mybatis
└── spring-redis
相同配置文件放到项目中,不同环境的配置文件放到配置文件目录中,比如 logback.xml 中的日志的输出路径,不同环境的日志输出目录肯定是不同的,所以这个文件就需要放到配置文件中,对于配置文件夹中的配置文件遵守有则改之无则添加的原则。
chenshang@MrRobot-3:~/work/git/conf_saas [master]$ tree -L 1 local/
local/
└── logback.xml
Gradle 实现多环境部署
grale 多环境部署需要应用到gradle 的源集(具体就是配置源文件夹和资源文件夹<这虽然提供了灵活,但打破了约定优与配置的原则,本来约定好了各个目录结构的>)
sourceSets {
main {
resources {
srcDir(project['resources_dir'])
}
}
}
指定源文件夹,源文件夹由配置来决定
ext {
/**
* 部署环境配置
* env 的值可以是 local、dev、test、prod
* local:代表本地环境(部署的时候应用的是 本地[src/main/resources]的配置文件)
* dev|test|prod:代表 dev 环境(部署的时候应用的是 dev|test|prod 的配置文件)
*/
if (!project.hasProperty("env")) env = "local"
resources_dir = "${project.getRootDir().getParentFile().getPath()}/conf_saas/$env"
}