env_环境变量

5 min read

环境变量

环境变量是程序运行时候可以从系统中获取到的变量的值。

例如java中通过System.getEnv("xx")来获取环境变量,而node中使用process.env.xx来获取。

对于不同的运行环境可能需要设置不同的环境变量,例如本地运行的时候连接的数据库信息和线上的数据库连接信息就是不一样的。对于不同环境的配置信息,使用不同的环境变量来隔离就是个非常通用的方法了。当然了也可以指定不同的profile或者说不同的配置文件,例如springboot中常用的就是通过指定不同的配置文件。

image

.env与nodejs

每次通过如上图的export方式放到启动脚本中去给变量赋值,显然是不够灵活和记录性交叉。.env文件类似spring中application.xx.yml文件,指定不同的文件名来区分不同环境运行,最常见的就是在node中的大量使用了。

nodejs中早期的用法是通过引入dotenv这个包,通过config方法将环境变量引入,用法如下

image

注意config函数如果传空参数的话,默认是找当前路径下的.env这个文件,所以为了不改代码,可以通过在不同环境设置不同的.env这个文件也是可以的。

node在比较新的版本例如v20中,已经不再需要单独引入第三方的dotenv包了,自身已经支持通过运行时参数--env-file=xxx来指定环境变量了。

image

.env与rust

rust中也有dotenv这个包cargo add dotenv,用法如下,在项目根目录防止.env文件。

extern crate dotenv;

use dotenv::dotenv;
use std::env;

fn main() {
    dotenv().ok();
    println!("k1={}", 
        env::var("k1").unwrap_or("".to_string()));
    println!("k2={}", 
        env::var("k2").unwrap_or("".to_string()));
}

image

.env与springboot

java中一般配置并不是重度依赖环境变量,一般都通过专门的配置文件来指定,但是又可以用环境变量,整体就比较灵活。不建议直接用java的.env框架来读.env文件,还是建议通过spring自己的配置文件进行配置,如果是一些敏感信息,注入到了环境变量,也可以在yml配置中拿到。

java中有获取属性System.getProperty和获取环境变量的System.getEnv方法,但是一定注意spring的yml配置并不会直接设置属性,换句话说通过System.getProperty不能拿到spring的配置如下图,只能通过@Value注入。

image

与get相对应的也有set的方法,一般较少通过代码去set,更常见的是运行指令中去获取

java启动指令中- ---D的区别

  • -是指定java的参数的,例如jvm的参数-Xmx
  • --是spring.boot项目中,放到指令的最后,覆盖yml配置中的属性的。
  • -D是jvm中用来覆盖System.property的,同时也会覆盖yml配置中的属性,-D参数需要放到jar包前面,放到最后就不生效了。

---D有点像,建议使用-D不要使用--

在yml中注入环境变量的方式

通过:可以指定未设置该环境变量时候的默认值。

my.property=${my.env:默认值}

这里要注意my.env其实可以从两个地方获取,就是属性和环境变量都会去看有没有设置。例如我们通过配置文件或者-D指定了my.env属性的话,也是会被my.property取到该值。

my.env=jjj
my.property=${my.env:222333}

上面如果同时设置了my.env环境变量和属性值,会优先取环境变量的值。