本文翻译自WritingMakefilesforPythonProjects[1]。原作者:BastianVenthur。作为Makefile的粉丝,我几乎在每个副项目中都使用它们。我也提倡在工作项目中使用。对于开源项目,Makefile让代码贡献者知道如何构建、测试和部署项目。而且,如果您正确使用Makefile,它们可以大大简化您的CI/CD过程脚本。因为你只需要简单的调用相应的make命令即可。最重要的是,Makefile可以简化您的开发工作。对于Python项目,我总是使用虚拟环境,所以我使用两种不同的Makefiles策略:假设make命令在虚拟环境中执行用make命令封装虚拟环境命令假设make命令在虚拟环境中我们来看一个非常简单的Makefile,允许您构建、测试和发布Python项目:find.-typed-name__pycache__-delete这几段代码写的很直接,所有潜在的贡献者都会立刻知道你项目的入口点在哪里。假设已经有虚拟环境,那么你需要先激活它,然后运行make命令:$.venv/bin/activate$maketest当然不方便的是你的每个shell窗口都必须手动激活虚拟环境.所以当你用tmux激活一个新的终端窗口或者让vim在后台运行的时候,就很麻烦了。在make命令内部激活一个虚拟环境似乎很难做到,因为每段代码甚至每条命令都会在自己的shell中运行。但是我们稍后会看到绕过这个限制的方法,比如使用.ONESHELL标志,但这不能解决打开新代码片段在新shell中运行的问题。将虚拟环境的调用命令封装在make命令中第二种方法基本解决了make命令中激活虚拟环境的问题。这个方法是从makefile.venv[2]学来的,我简化了它:#systempythoninterpreter.usedonlytocreatevirtualenvironmentPY=python3VENV=venvBIN=$(VENV)/bin#makeitworkonwindowstoooifeq($(OS),Windows_NT)BIN=$(VENV)/ScriptsPY=pythonendifall:linttest$(VENV):requirements.txtrequirements-dev.txtsetup.py$(PY)-mvenv$(VENV)$(BIN)/pipinstall--upgrade-requirements.txt$(BIN)/pipinstall--升级-需求-dev.txt$(BIN)/pipinstall-e.touch$(VENV).PHONY:testtest:$(VENV)$(BIN)/pytest.PHONY:lintlint:$(VENV)$(BIN)/flake8。PHONY:releaserelease:$(VENV)$(BIN)/pythonsetup.pysdistbdist_wheeluploadclean:rm-rf$(VENV)find.-typef-name*.pyc-deletefind.-typed-name__pycache__-delete功能上看,这个Makefile是类似的与上一个相比,但代码看起来更复杂。那么我们就一行一行的看一下它是如何实现的。如果虚拟环境已经启动,或者系统Python环境中已经安装了pytest、flake8等包,那么我们可以直接调用。但是现在,在新的Makefile中,我们在虚拟环境中使用绝对路径显式调用它们。每段代码都依赖于$(VENV)来确保虚拟环境存在。此条目确保最新的虚拟环境当前可用。这个解决方案之所以有效,是因为当我们执行.venv/bin/activate时,原来的虚拟环境将自己的绝对路径放在了环境变量中。因此,每次调用Python或其他包时,都会将它们安装在虚拟环境中。虽然Makefile文件变得有点复杂,但是当我们想要测试代码时,仍然只需要简单的执行命令:$maketest,而无需关心虚拟环境是否已经安装。如果你不需要支持Windows,你甚至可以从Makefile中删除与Windows相关的部分。这样,这个Makefile即使是不怎么用的人也不难理解。哪一个更好?我认为第二种选择更方便。虽然第一种方法我已经愉快地使用了几年,但第二种方法是最近才学习的。我以前真的没有注意到这种做法。但我注意到几乎所有使用Makefile的Python项目都使用第一种方法,我想知道为什么。Kingname评论说我在Python项目和Golang项目中经常使用Makefiles。在Python项目中,我主要用它来删除__pycache__。在Golang项目中,由于我使用的是VSCode开发,它的lint有一些问题,所以代码写完了,以后我会使用Makefile执行一个gofmt命令,格式化所有的.go文件。但是Makefile有一个非常弱智的地方——里面的缩进必须使用tabs,不能使用空格。所以我要写Makefile的时候,就得用vim来写。因为我的PyCharm已经调整为将所有的tab都换成空格。而如果Makefile的缩进中混入了空格,则会报错。如果你对Makefile感兴趣,我会为你写一篇从入门到精通的文章。有兴趣的同学请留言~参考文献[1]WritingMakefilesforPythonProjects:https://venthur.de/2021-03-31-python-makefiles.html[2]makefile.venv:https://github.com/sio/Makefile.venv本文转载自微信公众号“闻所未闻的代码”,可通过以下二维码关注。转载本文请联系Code公众号。
