【发布时间】:2021-10-20 22:09:58
【问题描述】:
我想要实现的目标:为脚本创建虚拟环境、激活它并安装包依赖项的 make 规则。 (为方便起见,我创建了一个包含重新创建所需文件的存储库)。
这是我的 Makefile:
venv:
@echo VENV
virtualenv $@ -p python2
foo_requirements: requirements.txt venv .FORCE
@echo PIP
( . venv/bin/activate && pip install -r $< )
.PHONY: foo_requirements
FOO_CMD_SCRIPT = foo.py
FOO_CMD = . venv/bin/activate && python2 $(FOO_CMD_SCRIPT)
$(FOO_CMD_SCRIPT): foo_requirements
#--- Usage ---
all: $(FOO_CMD_SCRIPT)
$(FOO_CMD)
.FORCE:
目标all 仅用于测试,在现实生活中我会将内容放在foo.mk 文件中,并从另一个makefile 中包含它。
我的期望:
-
make all查看依赖关系FOO_CMD_SCRIPT(实际上是磁盘上文件的文件名)。依赖是foo_requirements规则 (PHONY) - 规则
foo_requirements具有文件依赖关系requirements.txt和venv。这里也有.FORCE,因为我不知道如何检查包安装是否已经完成。所以我认为应该发生的是:1. 没有任何依赖requirements.txt(文件存在,没有规则) 2. 如果venv不存在,则运行规则。 - 当
venv规则运行并创建目录时,运行规则的实际内容:pip install。 - 之后,
all的依赖应该已经完成,实际的命令应该运行了。
实际发生的情况:
-
venv可以正常创建 -
pip永远不会运行 - 实际的命令永远不会运行
为什么规则foo_requirements的内容不运行?
同样,all 规则内容永远不会运行。
结果:
$ make
VENV
virtualenv venv -p python2
created virtual environment CPython2.7.18.final.0-64 in 46ms
creator CPython2Posix(dest=/home/gauthier/tmp/test_mk/venv, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/gauthier/.local/share/virtualenv)
added seed packages: pip==20.3.4, pkg_resources==0.0.0, setuptools==44.1.1, wheel==0.34.2
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator
【问题讨论】:
标签: makefile dependencies