shell Makefile:从'.env'阅读环境变量

qeeaahzv  于 2022-12-30  发布在  Shell
关注(0)|答案(1)|浏览(189)

我想检查一下,在Makefile中从.env读取环境变量的方法是否正确/可接受。
生成文件:

export DB_HOST=$(shell grep DB_HOST .env | cut -d '=' -f2)
export DB_PORT=$(shell grep DB_PORT .env | cut -d '=' -f2)
export DB_NAME=$(shell grep DB_NAME .env | cut -d '=' -f2)
export DB_PASSWORD=$(shell grep DB_PASSWORD .env | cut -d '=' -f2)
export DB_CONTAINER_NAME=$(shell grep DB_CONTAINER_NAME .env | cut -d '=' -f2)

.PHONY: run-mysql-database
run-mysql-database:
    @docker run --name $(DB_CONTAINER_NAME) -p $(DB_PORT):3306 -e MYSQL_ROOT_PASSWORD=$(DB_PASSWORD) -e MYSQL_DATABASE=$(DB_NAME) -d mysql

.env的含量:

DB_HOST=localhost
DB_PORT=13306
DB_NAME="spring-boot-todo"
DB_PASSWORD="password"
DB_CONTAINER_NAME="spring-boot-todo-db"

我也尝试过使用另一种方法--引入init目标并在执行run-mysql-database之前调用它,但是这种方法不起作用:

init:
    source .env
    export DB_HOST
    export DB_PORT
    export DB_NAME
    export DB_PASSWORD
    export DB_CONTAINER_NAME
    • 错误:**make: source: No such file or directory

另一个选项是在执行命令之前使用source .env

# run Spring Boot application
.PHONY: run
run: run-mysql-database
    # set environment variables from .env file and run Spring Boot application
    @echo "Running Spring Boot application..."
    @source .env && ./mvnw spring-boot:run

这很有效。但是有时候,我需要访问一个特定的环境变量(eidogg.,用于打印),并想知道是否有更好的方法。

nwwlzxa7

nwwlzxa71#

正如@Beta在他的评论中提到的,你只需要在你的Makefile的顶部写include .env,它应该包括.env文件中声明的变量。
显示一个非常简单的工作示例(文件和示例取自https://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/):
.env文件的内容:

Makefile-Test$ cat .env
DB_HOST=localhost
DB_PORT=13306
DB_NAME="spring-boot-todo"
DB_PASSWORD="password"
DB_CONTAINER_NAME="spring-boot-todo-db"

以及Makefile的内容:

include .env
hellomake: hellomake.c hellofunc.c
    @echo ${DB_HOST}
    gcc -o hellomake hellomake.c hellofunc.c -I.

clean:
    @echo ${DB_NAME}
    rm -f hellomake

all: clean hellomake

运行make all应该首先打印变量DB_NAME的内容,然后打印DB_HOST

相关问题