我想检查一下,在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.,用于打印),并想知道是否有更好的方法。
1条答案
按热度按时间nwwlzxa71#
正如@Beta在他的评论中提到的,你只需要在你的
Makefile
的顶部写include .env
,它应该包括.env
文件中声明的变量。显示一个非常简单的工作示例(文件和示例取自https://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/):
.env
文件的内容:以及
Makefile
的内容:运行
make all
应该首先打印变量DB_NAME
的内容,然后打印DB_HOST
。