我有以下 python makefile。
.ONESHELL:
TEST_DIR = ./tests
DIR_NAME = $(shell date "+%Y-%m-%d_%T")
.PHONY: clean test backup env
env:
. .venv/bin/activate
test: env clean
pytest --cache-clear --cov -p no:logging --html=report.html --self-contained-html -n 8 --maxprocesses=8 $(TEST_DIR)
backup:
mkdir -p ./backup_test_results
cd ./backup_test_results
mkdir $(DIR_NAME) && cd $(DIR_NAME)
find . -name htmlcov -type d -exec cp -r '{}' ./ \;
find . \( -name "error.log" -o -name "download.log" -o -name ".coverage*" -o -name "report.html" \) -type f -exec cp '{}' ./ \;
cd ../../
clean: backup
find . -path ./.venv -prune -o \( -name __pycache__ -o -name .pytest_cache -o -name htmlcov \) -type d -exec rm -rf '{}' \;
find . \( -name "error.log" -o -name "download.log" -o -name ".coverage*" -o -name "report.html" \) -type f -delete
使用
.ONESHELL
命令按预期创建目录。但虚拟环境没有被激活。
运行 make 文件时,出现错误,提示未找到 pytest。因此,我假设虚拟环境未激活。
我做错了什么?
.ONESHELL
并不意味着 make 在 make 的整个运行过程中启动一个 shell,并以某种方式将所有配方中的所有命令传递到该一个 shell(这是不可能的,因为 make 需要知道每个配方的退出代码了解规则是否成功)。
.ONESHELL
表示每个单独配方中的所有行都传递到单个 shell:默认情况下,每个单独配方中的每个单独行都传递到单独的 shell。
因此,即使使用
.ONESHELL
,您也无法在不同配方之间共享 shell 环境设置。你可以这样做:
.ONESHELL:
SETVENV = . .venv/bin/activate
test: clean
$(SETVENV)
pytest --cache-clear --cov -p no:logging --html=report.html --self-contained-html -n 8 --maxprocesses=8 $(TEST_DIR)
(例如,将
$(SETVENV)
变量添加到每个配方中。)