当前位置: 首页 > 科技观察

四款Python项目管理和构建工具,推荐收藏!

时间:2023-03-13 18:34:33 科技观察

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├──docs│└──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中定义的命令了。$makeclean删除所有构建、测试、覆盖和Pythonartifactsclean-build删除构建artifactsclean-pyc删除Python文件artifactsclean-test删除测试和覆盖artifactslintcheckstyletest使用默认Python快速运行测试使用默认的Pythondocs快速覆盖生成SphinxHTML文档,包括APIdocsservedocs编译文档watchingforchangesreleasepackageanduploadareleaseistbuildssourceandwheelpackageinstallinstallthepackagetotheactivePython'ssite-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-av可以显示tox.ini中定义的所有任务:$tox-avdefaultenvironments:default->Invokepytesttorunautomatedtestsadditionalenvironments:build->BuildthepackageinisolationaccordingtoPEP517,seehttps://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-打印脚本路径。发布-Publishes项目。取决于任务:packageverify(optional)coverage(optional)run_integration_tests-在打包的应用程序上运行集成测试。取决于任务:packagerun_unit_tests-运行所有单元测试。基于模块上的Python桌面单元测试运行ta单元测试: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/toml)的配置文件格式。pyproject.toml类似于NodeJS的package.json文件,比如诗行添加,诗安装命令#将boto3的依赖添加到pyproject.toml中并安装(add也可以在本地或从git安装依赖),poetryaddboto3#会根据pyproject.toml文件中的定义,将相应的依赖安装到当前的Python虚拟环境中#比如在/lib/python3.9/site-packages目录下,模块安装完成后,测试用例也可以使用poetryinstallothermain1.poetrybuild#Buildinstallable*.whlandtar.gz文件2.poetryshell#将根据pyproject.toml文件中定义的依赖关系创建并使用虚拟环境3.poetryrunpytest#使用pytest运行测试用例,例如tests/test_sample.py4。poetryrunpython-munittesttests/sample_tests.py#运行unittest测试用例5poetryexport--without-hashes>requirements.txtpoetryrun可以执行任何系统命令,但它会在它想要的虚拟环境中执行。所以可以想象,poetry项目必须使用poetryrun...命令来支持sphinx、coverage或者flake8才能生成文档或者coverage。在sample目录下创建一个文件my_module.py(类似于pyproject.toml文件),内容为defmain():print('hellopoetry')然后写入pyproject.toml中。[tool.poetry.scripts]my-script="sample.my_module:main"然后执行$poetryrunmy-script会输出“hellopoetry”。通过对以上四个工具的了解,从cookiecutter-pyproject->PyScaffold->PyBuilder->Poetry依次降低了项目结构的复杂度,使用难度顺序大致相同