我试图实现的:一个make规则,它将为脚本创建虚拟环境,激活它,并安装包依赖项。(为了方便,我已经创建了一个包含需要重新创建的文件的repo)。
这是我的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
的依赖项for(实际上是磁盘上文件的文件名)。依赖是foo_requirements
规则(PHONY
)- 规则
foo_requirements
有文件依赖requirements.txt
和venv
。这里也有.FORCE
,因为我不知道如何检查软件包安装是否已经完成。所以我认为应该是这样的:1。requirements.txt
(文件存在,没有规则)如果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
如果您不告诉它,make
将始终在makefile中构建第一个目标(以及它的任何先决条件),然后停止。
makefile中的第一个目标是venv
,它没有先决条件,因此目标被构建然后make停止。
可以执行make <target>
命令运行指定的目标器,例如make all
。
或者您可以将all
目标作为makefile中的第一个目标。
或者你可以在你的makefile中添加.DEFAULT_GOAL: all
。
参见make如何处理Makefile