当前位置: 首页 > 后端技术 > Python

Python项目管理和构建工具:CookieCutter、PyScaffold、PyBuilder、Poetry

时间:2023-03-26 16:01:50 Python

Python这么久都没有一个事实上的标准项目管理和构建工具,以至于Python项目的结构和构建方式五花八门。这或许反映了Python的自由意志。不像Java经历了最初的手工构建,到半自动化的Ant,再到Maven,基本上已经是事实标准了。期间,Maven也接受了Gradle(Android项目主推)、SBT(主要是Scala项目)、Ant+Ivy、Buildr等其他挑战,但很难撼动Maven的江湖地位,其他几乎遵循Maven的目录布局。回到Python,pip、pipenv、conda等包管理工具已经产生,但是对于项目的目录布局一直没有达成一致。构建方面,延续了传统的Makefile方式,增加了setup.py和build.py,使用程序代码安装构建。关于项目目录布局,有项目模板,然后做成工具应用项目模板。下面简单浏览一下四个工具的使用CookieCutterPyScaffoldPyBuilderPoetryCookieCutter一个经典的Python项目目录结构$pipinstallcookiecutter$cookiecuttergh:audreyr/cookiecutter-pypackage#以github上的audreyr/cookiecutter-pypackage为模板,然后回答一堆问题generateAPythonproject...project_name[PythonBoilerplate]:sample...cookiecutter生成的最终项目模板如下所示:$treesamplessample├──AUTHORS.rst├──CONTRIBUTING.rst├──HISTORY.rst├──LICENSE├──MANIFEST.in├──Makefile├──README.rst├──docs│├──Makefile│├──authors.rst│├──conf.py│├──contributing.rst│├──history.rst│├──index.rst│├──installation.rst│├──make.bat│├──readme.rst│└──usage.rst├──requirements_dev.txt├──样本│├──__init__.py│├──cli.py│└──样本.py├──setup.cfg├──setup.py├──测试│├──__init__。py│└──test_sample.py└──tox.ini3个目录,26个文件这大概是目前流行的目录结构的主要框架,主要元素有:$treesamplesample├──Makefile├──README.rst├──文档│└──index.rst├──requirements.txt├──样本│├──__init__.py│└──sample.py├──setup.cfg├──setup.py└──tests├──__init__.py└──test_sample.py项目示例目录复制Python源文件在示例目录下,tests目录是测试文件,外加一个docs目录用于存放文档、README.rst、其他设置、setup.cfg和用于构建的Makefile文件这其实是一个非常经典的Python项目结构。下一次构建将使用make命令。输入make,你会看到Makefile文件中定义的指令默认Pythontest-all在每个带有toxcoverage的Python版本上运行测试使用默认Pythondocs快速检查代码覆盖率生成SphinxHTML文档,包括APIcomperveiledocsdocsPython的site-packages要使用上面的构建过程,需要安装相应的包,比如tox、wheel、coverage、sphinx、flake8,都可以通过pip安装。之后可以maketest,makecoverage,makedocs,makedist等,其中makedocs可以生成非常漂亮的Web文档。PyScaffold创建项目PyScaffold顾名思义,是一个创建Python项目脚手架的工具,安装使用:$pipinstallpyscaffold$putupsample这样创建一个Python项目,目录结构类似于cookiecutter选择的模板早些时候,except将源文件放在src目录而不是sample目录中。$treesamplessample├──AUTHORS.rst├──CHANGELOG.rst├──CONTRIBUTING.rst├──LICENSE.txt├──README.rst├──docs│├──Makefile│├──_static│├──authors.rst│├──changelog.rst│├──conf.py│├──contributing.rst│├──index.rst│├──license.rst│├──readme.rst│└──requirements.txt├──pyproject.toml├──setup.cfg├──setup.py├──src│└──样本│├──__init__.py│└──skeleton.py├──tests│├──conftest.py│└──test_skeleton.py└──tox.initox工具用于构建整个项目。tox是一种自动化测试和构建工具,可在构建过程中创建Python虚拟环境,从而为测试和构建提供一个干净的环境。tox使用教程tox-av可以显示tox.ini中定义的所有任务:$tox-avdefaultenvironments:default->Invokepytesttorunautomatedtestsadditionalenvironments:build->BuildthepackageinisolationaccordingtoPEP517,见https://github.com/pypa/buildclean->删除旧的分发文件和临时构建工件(./build和./dist)docs->调用sphinx-build来构建docsdoctests->调用sphinx-build来运行doctestslinkcheck->检查文档发布中的损坏链接->将您开发的包发布到包索引服务器。默认情况下,它使用testpypi。如果你真的想发布你的包以在PyPI中公开访问,请使用`----repositorypypi`选项。要执行任何命令,使用tox-ebuild、tox-edocs等。在我使用tox命令的过程中,每一步似乎都比较慢,创建虚拟机应该需要一些时间。PyBuilder最好看看另一个构建工具PyBuilder,它创建的目录结构和Maven很接近,我们来看看$pipinstallpybuilder$mkdirsample&&cdsample#项目目录需要手动创建$pyb--start-project#回答完一些问题后,创建所需的目录和文件,然后查看其目录结构:$treesample.├──build.py├──docs├──pyproject.toml├──setup.py└──src├──main│├──python│└──scripts└──unittest└──python构建过程仍然使用pyb命令,可以使用pyb-h查看帮助,pyb-t列出所有任务,PyBuildertasks是作为插件添加的,在build.py文件中配置插件。$pyb-tsampleTasksfoundforproject"sample":analyze-执行分析插件。取决于任务:preparerun_unit_testsclean-清理生成的输出。compile_sources-编译需要编译的源文件。取决于任务:准备覆盖范围-<无可用描述>取决于任务:验证安装-安装已发布的项目。取决于任务:packagepublish(可选)package-打包应用程序。打包python应用程序。取决于任务:compile_sourcesrun_unit_tests(可选)prepare-准备构建项目。创建目标VEnvsprint_module_path-打印模块路径。print_scripts_path-打印脚本路径。发布-发布项目。取决于任务:packageverify(optional)coverage(optional)run_integration_tests-在打包的应用程序上运行集成测试。取决于任务:packagerun_unit_tests-运行所有单元测试。基于结束Python的任务运行单元测试:compile_sourcesupload-将项目上传到PyPi。verify-验证项目和可能的集成测试。取决于任务:run_integration_tests(optional)$pybrun_unit_testssamplePyBuilder在构建或测试之前也会创建一个虚拟环境,从0.12.9版本开始可以通过参数--no-venvs跳过创建虚拟环境的步骤。如果使用--no-venvs,Python代码将在当前运行pyb的Python环境中执行,并手动安装所需的依赖项。项目的依赖也应该在build.py文件中定义@initdefset_properties(project):project.depends_on('boto3','>=1.18.52')project.build_depends_on('mock')然后执行pyb来创建一个虚拟环境将安装上述依赖项并在其中运行测试和构建。Poetry最后的Poetry,感觉这是一个更成熟也更活跃的Python构建。它具有更强大的信任管理功能。您可以使用poetryaddboto3添加依赖项,poetryshow--tree显示依赖树。查看如何安装和创建项目$pipinstallpoetry$poetrynewsample它创建的项目比上面的简单$treesamplessample├──README.rst├──pyproject.toml├──sample│└──__init__.py└──tests├──__init__.py└──test_sample.py如果给poetrynew--src参数,那么源文件目录sample会放在src目录下,即sample/src/sample.poetryinit会在当前目录下生成pyproject.toml文件,目录的生成等需要手动完成。它不关注文档生成、代码规范检查或代码覆盖率。它的项目配置比较集中,都在pyproject.toml文件里,什么是toml?它是一种配置文件格式Tom'sObvious,MinimalLanguage(https://github.com/toml-lang/...).pyproject.toml一些package.json文件类似于NodeJS,比如poetryadd,poetryinstall命令poetryaddboto3#将boto3的依赖添加到pyproject.toml并安装(add也可以从本地或git安装依赖),使用--dev参数是为了开发poetryinstall#会按照pyproject.toml文件定义并安装对应当前Python虚拟环境的依赖,比如在/lib/python3.9/site-packages目录下。模块安装完成后,测试用例也可以使用其他主要poetrybuilds#构建可安装的*.whl和tar.gz文件poetryshell#将根据pyproject.toml文件poetryrun中定义的依赖项创建并使用虚拟环境pytest#使用pytest运行测试用例,例如tests/test_sample.pypoetryrunpython-munittesttests/sample_tests.py#运行unittest测试用例poetryexport--without-hashes--outputrequirements.txt#导出requirements.txt文件,--devexportdependencieswithdev,或者使用poetryexport--without-hashes>requirements.txtpoetryrun可以执行任何系统命令,但是会在它想要的虚拟环境中执行。所以可以想象,poetry项目必须使用poetryrun...命令来支持sphinx、coverage或者flake8才能生成文档或者coverage。在sample目录下创建文件my_module.py(与pyproject.toml文件同级),内容为defmain():print('hellopoetry')然后在pyproject中写入[tool.poetry.scripts]my-。tomlscript="sample.my_module:main"然后执行$poetryrunmy-script会输出“hellopoetry”。通过对以上四个工具的了解,从cookiecutter-pyproject->PyScaffold->PyBuilder->Poetry依次降低了项目结构的复杂度,使用难度大致相同。最近为初学者整理了数百G的Python学习资料,包括电子书、教程、源码等,免费分享给大家!想上“Python编程学习圈”,发“J”免费领取