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

Python项目管理的四种构建工具

时间:2023-03-26 18:08:15 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为模板,然后回答一堆问题生成一个Python项目...project_name[PythonBoilerplate]:sample...最后,cookiecutter生成的项目模板是这样的:$treesamplessample├──AUTHORS.rst├──CONTRIBUTING.rst├──HISTORY。rst├──LICENSE├──MANIFEST.in├──Makefile├──README.rst├──docs│├──Makefile│├──authors.rst│├──conf.py│├──贡献。rst│├──history.rst│├──index.rst│├──installation.rst│├──make.bat│├──readme.rst│└──usage.rst├──requirements_dev.txt├──样本│├──__init__.py│├──cli.py│└──sample.py├──setup.cfg├──setup.py├──测试│├──__init__.py│└───test_sample.py└──tox.ini3个目录,26个文件这大概是th的主要框架当前流行的目录结构。主要元素有:$treesamplesample├──Makefile├──README.rst├──docs│└──index.rst├──requirements.txt├──sample│├──__init__.py│└──sample.py├──setup.cfg├──setup.py└──tests├──__init__.py└──test_sample.py项目示例目录重复Python源文件在sample目录下,tests目录是测试文件,外加一个docs目录存放文档,README.rst,其他setup,setup.cfg和Makefile文件用于构建这其实是一个非常经典的Python项目结构。下一个构建使用make命令。输入make,你会看到Makefile文件中定义的指令默认pythountest-all运行测试在每个Python版本上都具有TOXCoverage检查代码覆盖范围,默认的Pythondocs生成sphinxhtml文档,包括APIdocssoverocs编译文档查看ChangeRelease的文档,以查看更改程序软件包,并上传释放的源构建source和WheelpackageandwheelpackageandwheelpackageandwheelconspartsandivethewheelconspartsconvactsandpackientovinecoppittiveandivePython的site-packages为使用上面的构建过程,需要安装相应的包,如tox,wheel,coverage,sphinx,flake8,它们都可以通过pip安装。之后可以maketest、makecoverage、makedocs、makedist等,其中makedocs可以生成非常漂亮的web文档。PyScaffold创建项目PyScaffold顾名思义,是一个创建Python项目脚手架的工具,安装使用:$pipinstallpyscaffold$putupsample通过这种方式创建一个Python项目,目录结构类似于选择的模板上面的cookiecutter,除了它把源文件放在src目录而不是sample目录。$treesamplesample├──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│└──sample│├──__init__.py│└──skeleton.py├──tests│├──conftest.py│└──test_skeleton.py└──tox.ini工具tox用于构建整个项目。tox是一种自动化测试和构建工具,可在构建过程中创建Python虚拟环境,从而为测试和构建提供一个干净的环境。tox-av可以显示tox.ini中定义的所有任务:$tox-avdefaultenvironments:default->Invokepytesttorunautomatedtestsadditionalenvironments:build->BuildthepackageinisolationaccordingtoPEP517,seehttps://github.com/pypa/buildclean->删除旧的分发文件和临时构建工件(./build和./dist)docs->调用sphinx-build来构建docsdoctests->调用sphinx-build来检查doc>中的断开链接文档发布->将您一直在开发的包发布到包索引服务器。默认情况下,它使用testpypi。如果你真的想发布你的包以在--PyPI中公开访问,--`pypi`选项。使用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-tsampleTasks找到项目“sample”:分析-执行分析插件。取决于任务:准备run_unit_testsclean-清除生成的输出。compile_sources-编译需要编译的源文件。取决于任务:准备覆盖范围-<无可用描述>取决于任务:验证安装-安装已发布的项目。取决于任务:包发布(可选)包-打包应用程序。打包python应用程序。取决于任务:compile_sourcesrun_unit_tests(可选)准备-准备要构建的项目。创建目标VEnvsprint_module_path-打印模块路径。print_scripts_path-打印脚本路径。发布-发布项目。取决于任务:包验证(可选)覆盖(可选)run_integration_tests-在打包的应用程序上运行集成测试。取决于任务:包run_unit_tests-运行所有单元测试。基于Python的单元测试模块运行单元测试取决于任务:compile_sources上传-将项目上传到PyPi。验证-验证项目和可能的集成测试。dependstasks: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有点类似于NodeJS的package.json文件,比如poetryadd,poetryinstall命令#将boto3的依赖添加到pyproject.toml并安装(add也可以本地安装依赖,也可以从git安装依赖),poetryaddboto3#会根据pyproject中的定义,将相应的依赖安装到当前的Python虚拟环境中。tomlfile中#比如在/lib/python3.9/site-packages目录下,安装模块后,测试用例也可以使用poetryinstallOther1.poetrybuild#Buildinstallable*.whl和tar.gz文件2.poetryshell#会根据pyproject.toml文件中定义的依赖关系创建并使用虚拟环境3.poetryrunpytest#使用pytest运行测试用例,例如tests/test_sample.py4。poetryrunpython-munittesttests/sample_tests.py#运行unittest测试用例5--without-hashes>requirements.txtpoetryrun可以执行任何系统命令,但是会在它想要的虚拟环境中执行。所以可以想象,poetry项目必须使用poetryrun...命令来支持sphinx、coverage或者flake8才能生成文档或者coverage。在sample目录下创建文件my_module.py(与pyproject.toml文件同级),内容为defmain():print('hellopoetry')并写入[tool.poetry.scripts]my-inpyproject.tomlscript="sample.my_module:main"然后执行$poetryrunmy-script会输出“hellopoetry”。通过对以上四个工具的了解,从cookiecutter-pyproject->PyScaffold->PyBuilder->Poetry依次降低了项目结构的复杂度,使用难度大致相同。