我有以下 Makefile:
PYTHON = python
.DEFAULT_GOAL = help
help:
@echo ------------------------------Makefile for Flask app------------------------------
@echo USAGE:
@echo make dependencies Install all project dependencies
@echo make docker Run Docker
@echo make env Set environment variables
@echo make run Run Flask app
@echo make test Run tests for app
@echo ----------------------------------------------------------------------------------
dependencies:
@pip install -r requirements.txt
@pip install -r dev-requirements.txt
docker:
docker compose up
env:
@set CS_HOST_PORT=5000
@set CS_HOST_IP=127.0.0.1
@set DATABASE_URL=postgresql://lv-python-mc:[email protected]:5482/Realty_DB
@set REDIS_IP=127.0.0.1
@set REDIS_PORT=6379
run:
${PYTHON} app.py test:
@${PYTHON} -m pytest
set
命令不起作用,环境变量未设置,可能是什么问题?
您当然可以设置对 make 将调用的程序有效的环境变量。但是
make
无法为调用 make 的 shell 设置环境变量。因此,如果您的 makefile 运行一个程序,那么您可以在 makefile 中设置一个环境变量,该变量将在该程序中可见。
顺便说一句,这与 make 无关。这是操作系统的限制(或功能,取决于您的观点)。试试这个实验:
set FOO=bar
echo %FOO%
。看到它打印了 bar
。cmd.exe
set FOO=nobar
echo %FOO%
。看到它打印了 nobar
。exit
echo %FOO%
您会看到它仍然打印
nobar
,而不是 bar
。这是因为操作系统不允许子程序修改其父程序的环境。
因此,make对此无能为力。
尝试:
...
env:
@echo @echo off > env.bat
@REM === ^^^ Only SINGLE ONE Sign HERE !!! ===
@echo set CS_HOST_PORT=5000 >> env.bat
@echo set CS_HOST_IP=127.0.0.1 >> env.bat
@echo set DATABASE_URL=postgresql://lv-python-mc:[email protected]:5482/Realty_DB >> env.bat
@echo set REDIS_IP=127.0.0.1 >> env.bat
@echo set REDIS_PORT=6379 >> env.bat
@REM === +5 lines below ===
@echo ${PYTHON} app.py test: >> env.bat
@echo echo %ERRORLEVEL% >> env.bat
@echo @${PYTHON} -m pytest >> env.bat
@echo echo %ERRORLEVEL% >> env.bat
@del /Q env.bat
run:
call env.bat