北川广海の梦

北川广海の梦

灵活使用配置文件,适配不同软件环境(顺便试试阿里对象存储)

web
197
2020-05-11

通常开发的时候,我们都在Windows上进行开发,开发过程中也难免少不了进行必要的测试。例如文件上传,数据库访问等等。

常见场景

然而开发环境的路径和实际环境肯定是不同的,数据库访问也非常可能不同。
例如我使用了云数据库,在外网使用外网Url,内网使用内网Url。
再比如咱这个使用了JwtToken,token的过期时间在开发和实际生产环境中可能也不一样。

除了后端开发外,前端也是如此。例如开发单页面应用程序,后端api接口是部署在测试服务器的。而在生产环境,接口又换到了生产服务器上。每次都改代码实在是太麻烦了。

解决方案

好在现在许多流行的开发框架都很好的支持了根据不同环境来调整配置文件的特性。
下面以一些常用框架举例用法:

SpringBoot

Springboot 默认会有一个application打头的文件,作为配置文件。
image.png
我们首先根据不同的环境,创建不同的配置文件,
注意命名规则:
application-$environment.yml,这里用的是yml,如果是用的.properties文件也是一样的。

然后分别在不同的环境的配置文件中写好配置,
然后在application.yml中需要显示的指出:
image.png
启用的是什么环境

如果需要切换到生产环境,就将这个dev改成prod就行了。

然后是在程序中访问配置文件中的变量:
我这里设置一个在Windows下文件上传的路径。
image.png

然后设置映射。
image.png

	String path = enviroment.getProperty("uploadPath");

这里用依赖注入拿到Enviroment类型的对象,用它来访问。
每次都用getProperty()太麻烦了,还可以封装成静态方法,不过获取Enviroment对象这里得稍微处理下:
image.png
通过**@PostConstruct**注解,这个注解的作用就是用来完成需要依赖注入才能完成的初始化工作的。
这样就能通过FILE_UPLOAD_DIC()拿到写在配置文件里面的路径了。

AspNet Core

这是我最喜欢的一款web开发框架了,他配置起来也非常简单

aspNet Core 使用的是Json方式进行配置,一样有一个默认文件:
appsettings.json,我们同样新建几个代表不同环境的配置文件:
image.png

其实经过我测试,这样建好了就已经可以了。但是为了稳妥起见,我们还是显示的写点配置:
program.cs:
image.png
关键在于这个ConfigureAppConfiguration()方法,在它的委托参数里面添加Json文件,参数就是命名规则,框架会自动替换。

aspNet Core 比SpringBoot稍微方便一点。
下面也介绍下如何访问配置文件中的值:
image.png

我们直接将Configuration对象设置成public static,然后就可以直接拿到configuration对象。当然,也建议实际使用过程中,使用依赖注入获取对象。

然后通过扩展方法的方式,来获取配置中的值:
image.png

为什么不直接通过字符串访问,最主要的目的就是一个防止可能的出错,打字符串是非常容易出现错误的。并且不好排查,谁也不知道你是不是先打了一个错误的字符串,然后一直复制着使用它。就如同使用SQL一样,写SQL也是一件非常蛋疼的事情,因为出错率太高,拿Mybattis举例,为了防止出错,我们往往得翻来覆去的检查每一个字段和是否和实体对应,还要检查和数据库中是否对应。相比而言,Ef Core就能大大减少这些错误出现的概率,这也是为什么大家喜欢这个ORM框架的原因。所以在实际开发中,我们一定要尽量避免在多处直接使用字符串。比较好的方式就是在一个统一的地方,用一个常量引用它。

Angular

最后简单介绍下angular的不同环境配置
image.png
根目录下默认会有一个environments文件夹,里面就放着不同的环境的配置文件。
image.png

image.png
Angular会自动替换这两个不同的const,要区分他们就得设置:
"production: boolean"这一属性。

然后使用:
首先加上环境对象的引入

import { environment } from 'src/environments/environment';

然后直接访问这个对象的属性就可以了。
比如这样:
image.png

Angular也是我非常喜欢的框架,可惜国内市场不怎么样。