本人博客: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"
}