python为开发人员打包常见任务

pyctdev的Python项目详细描述


pyctdev:python为开发人员打包常见任务

支持许多类似任务的工具(和文档) 项目,重点是那些组成holovix.org的项目。

注意:文档是草稿/当前正在编写

什么是pyctdev?

pyctdev的主要部分是一个跨平台的、类似于tool plus的库 使项目管理任务能够同样良好地运行 本地或在不同的ci系统上,在不同的平台上,或支持 不同的python包"生态系统"(pip和conda):

$ doit list
build_docs        build docs
develop_install   python develop install with specified optional groups of dependencies.
ecosystem_setup   Common pip setup
env_capture       Report all information required to recreate current environment.
env_create        TODO: create named environment if it doesn't already exist.
env_export        TODO
list_envs
package_build     Build pip package, then install and test all_quick (or other
package_upload    Upload pip packages to pypi
test_all          Run "all" tests
test_examples     Run "examples" tests
test_flakes       Run "flakes" tests
test_unit         Run "unit" tests

$ doit ecosystem=conda list
build_docs           build docs
develop_install      python develop install, with specified optional groups of dependencies (installed by conda only).
ecosystem_setup      Common conda setup (must be run in base env).
env_capture          Report all information required to recreate current conda environment
env_create           Create named environment if it doesn't already exist
env_export           Generate a pinned environment.yaml from specified env, filtering against specified groups of deps.
list_envs
miniconda_download   Download Miniconda3-latest
miniconda_install    Install Miniconda3-latest to location if not already present
package_build        Build and then test conda.recipe/ (or specified alternative).
package_upload       Upload package built from conda.recipe/ (or specified alternative).
test_all             Run "all" tests
test_examples        Run "examples" tests
test_flakes          Run "flakes" tests
test_unit            Run "unit" tests

尽管必须安装doit+pyctdev才能运行这些任务,但是 正在尽可能调用标准的python和/或conda工具, 这样人们就可以独立运行命令而不必安装 doit+pyctdev.这意味着pyctdev可以被视为:

  • 所有常见任务的文档

  • 执行这些任务所需命令的文档

  • 一种暴露底层工具漏洞的方法 填补(或暴露我们对如何使用它们的缺乏知识,所以我们 可以更正:)

  • 一种映射相对不变的"高级任务"(如"运行")的方法 单元测试")到可能改变的底层特定命令 时间(例如,随着python打包生态系统的变化)或 项目之间(例如,使用nose或pytest运行测试)。

  • 我们目前对如何执行各种任务的最佳理解 (平衡最好的方法和实际可行的方法 一般来说,考虑到当前广泛可用的工具)。

附带的背景文档(甚至更多草稿 比这一个!)包含更多详细信息,以及 选择。它被分成了相同的部分,所以可以一起阅读 此文档。

还有一个用于设置的文档 创建一个新项目(但它现在只是一个占位符…。

如果您有问题,请随时提出问题(首先 检查常见问题

Pyctdev包括什么?

Pyctdev正在进行中,当它稳定下来时,我们需要 展开此描述以包含有关 pyctdev打算涵盖的内容以及包的哪些方面 管理超出范围。

<H3>0。所有的任务是什么?如何运行任务?

pyctdev显示有哪些任务,例如"运行单元测试"、"构建条件" 软件包、"上载conda软件包"、"作为开发人员安装"等等。

pyctdev还记录了如何执行这些任务,即 必要的命令用于任务,或应运行哪些任务 先于其他人。

要查看所有任务,可以使用pyctdev在项目中键入doit list。 获取包含描述的任务列表。doit info提供更多信息 任何特定任务的详细信息。或者,您可以读取pyctdev 源代码;大多数任务都是简单的命令。

<H3>1。可以在本地、CI上和跨平台运行项目管理任务

doit/pyctdev是用python编写的,所以python的 可用(不只是在类unix系统上,与许多项目不同 配置文件)。(一旦任何python可用,doit就可以 必要时用于安装其他蟒蛇-当前为miniconda和 在每个平台上运行相同的命令有助于确保 测试、包构建和相关任务是一致的 跨平台,这在开发人员使用 一个平台,但用户将为另一个平台下载软件包。

pyctdev使用的其他建议工具也是跨平台的:tox, conda、pip等 <H3>2。支持python和conda生态系统

pyctdev支持perform使用python/pip或 康达生态系统。例如,doit develop_install通常运行pip install-e.[tests],它使用pip和 然后执行可编辑安装。或者,doit ecosystem=conda develop install将使用conda安装依赖项,然后 可编辑安装。项目可以设置默认生态系统。

使用pip或conda安装,创建可复制/隔离的 使用python工具(virtualenv+pip或pipenv)或 conda-tools(conda-env),pip或conda的包,帮助开发人员 主要使用一个生态系统来支持另一个生态系统(例如,通过CI 系统)。

<H3>3。支持多种版本的python

类似于允许开发人员同时支持pip和conda pyctdev允许开发人员支持 蟒蛇。对于python,doit使用tox在多个 使用毒物的环境。对于conda,pyctdev在多个 python的版本。

<H3>4。一个地方的依赖关系

pyctdev允许开发人员表达他们项目的"抽象" 在一个地方依赖。目前这个地方是setup.py,因为它是 被python和conda工具广泛支持。依赖关系 setup.py中列出的用于:

  • 最终用户PIP软件包

  • 最终用户Conda软件包

  • 使用conda的开发人员

  • 使用pip的开发人员

  • 生成环境文件(例如examples environment.yml)

抽象的依赖可以转化为更具体的依赖, 例如,对于教程示例环境,所有依赖项的版本 可固定以确保再现性(见10/环境文件, 下面)

pyctdev支持转换依赖项并生成environment.yml (也可能是pipenv或类似产品)。

<H3>5。为不同目的标记的依赖项

pyctdev支持表示构建和安装/运行时依赖关系,另外 各种可选的依赖项组(例如,对于运行示例, 建筑文档等)

pyctdev使用标准/一般支持的python/pip/setuptools setup.py 执行此操作的参数(install_requiresextras_requires)。匹普 理解这些,所以相同的可选依赖组是 可供用户使用(例如,用户可以运行pip install package[examples]来获取包和 运行它的示例。

为了支持conda生态系统中的"选项",多个包是 生成-尽管通常我们的项目只有"基础"和 "示例"包。包示例取决于特定的固定 (在生成时固定)。

<H3>6。测试用户安装的内容

pyctdev鼓励测试用户将要安装的包, 而不是只专注于测试开发人员的工作。

在python生态系统中,tox用于构建包,创建 清理虚拟环境,安装包,然后运行 测验。tox还支持在多个 多个环境中的python版本(例如,具有不同的集合 安装的依赖项的数量)等。

在conda生态系统中,conda build被多次调用以 实现同样的目标。

<H3>7。测试开发人员的工作

为一个项目做贡献常常是困难的,因为建立它 要运行测试是很困难的。调味的 项目开发人员知道他们在做什么,但是 偶尔的开发人员。

pyctdev确保开发项目所需的依赖项是 很明显,并鼓励开发人员保持更新(例如 在中性ci机器上测试doit development_install。

pyctdev还试图捕捉开发人员如何设置环境。 例如,conda安装的依赖项,带有python setup.py development--上面没有deps

<H3>8。在不同环境中测试

例如,doit package\u build--test python=py36--test\u requires=with\u xarray--test group=unit 将构建一个包,然后将其安装到Python3.6环境中, 然后将进一步安装带有xArray依赖项的,然后 将运行单元测试。与\u xarray的依赖关系是 在tox.ini中指定(与单元测试命令一样)。这与 生态系统=PIP,生态系统=Conda。也有可能有额外的 只在特定测试环境中运行的测试命令 (例如,使用"xarray")。

doit test_unit将在当前环境中运行单元测试。 如果有针对特定环境的额外命令,它们将 如果您选择它,请运行。例如,doit test_unit——使用"xarray"的测试组。但是,您当前的环境不会被测试更改 命令,因此您需要使用xarray安装 必要时依赖。

<H3>9。按需包装?简化包装配方?

除了指定一次依赖项之外,pyct还尝试表示 只打包一次元数据。目前这是在setup.py中。模板法 然后用于conda构建。这防止了 描述、URL、许可证等不匹配。

Pyctdev希望首先在Pypi和 anaconda.org频道。从这些来源,conda forge可以更新,然后 水蟒默认(但我们不一定是那些 频道)。

pyctdev目前主要支持纯python包。同时 它们通常具有复杂的、特定于平台的依赖关系, 到目前为止,pyct控制的包都是纯python。因此 我们尽可能构建noarch:python conda包。如果我们开始 使用二进制代码维护包,pyct将被扩展 以支持特定于平台的包,但目前没有 包裹需要这些。

<H3>10。依赖的渠道/来源

对于python/pip:通常只是pypi.org。但其他"频道"可以是 明确规定。例如test.pypi.or g,或一个私有服务器。

我们为holovix.org维护的conda包通常可以安装 无论是水蟒违约还是康达锻造。我们现在 它们位于anaconda.org pyviz(发布版)和pyviz/label/dev(开发版)上 只有我们的特定软件包在这个频道上。对于一个 我们建议任何一个安装都不要混合使用 康达锻造和违约。对于有复杂需求的项目,我们 一个比一个好。或者如果一个项目 无论是哪方面的表现,我们都会提出建议。

travis ci上项目的dev构建和dev包发布 pyviz/label/dev获取其他包,同时生成发布包 使用pyviz就行了。如果开发人员对这些包满意, Conda Forge和默认值应更新。

<H3>11。如何构建项目

虽然没有必要,但是一个通用的结构可以简化一些事情 跨越多个类似项目。Holovix项目通常有 存储库看起来像:

package/
package/tests
package/tests/data
package/examples/
package/examples/data
package/examples/assets
examples -> package/examples

doc/       # minimal nbsite skeleton only
doc/assets # e.g. favicon - not relevant to notebooks

我们试图限制存储库中的内容与 为避免创建自定义 包装建筑规范。

<H3>12。统一各种工具的运行方式

通常,不清楚如何为项目运行测试。Pyct已经 通过具有高级任务(如"运行单元")来帮助实现这一点 试验"。然而,pyctdev还鼓励内部命令定义 只出现一次。

目前,setup.cfg用于存储命令的全局选项 (例如flake8规则),而tox.ini用于存储各种实际的 用于不同用途的命令(例如运行单元测试、运行 在不同环境中的测试等)。(待办事项:共享的内容 项目,怎么做?宁愿没有pyctdev的配置文件…

运行测试有各种工具(如pytest、nose)。目的 Pyctdev的目的是让我们的HoloViz项目最终都使用相同的 尽可能使用开发工具。并在 同样的方式。

  • 单元测试:pytest

  • 薄片:薄片

  • 示例:

    • 笔记本电脑运行正常:pytest plugin nbsmoke

    • 笔记本薄片:pytest插件nbsmoke

    • 笔记本"数据测试":pytest插件nbva

  • 性能/基准测试:(pytest基准,自定义内容, 空速,??)

  • …?

pytest具有定义("标记")然后选择组的功能 要运行的测试。所以Pyctdev希望有:

  • "慢速测试"(pytest-m slow

  • …?

<H3>14。DOCs

网站
  • nbsite示例->;网站

实时文档

  • 用户尝试的实时/浏览器方式示例:mybinder
<H3>15。版本控制

版本通过git标签。版本只存储在 存储库(git标记),并写入到包中。每个地方 需要知道版本(\uu init\uu.py;打包:setup.pymeta.yaml;docs)从单个源读取它。

存储在一个地方,它是标记而不是git repo 源代码,使自动化其他各种"发布时间"变得更容易 任务。我们的项目通常使用 自动更新(通过参数)。

版本控制方案:

  • 我们使用vx.y.z

  • post 1.0(TOdo:复制高压方案?)

<H3>16。在Travis上自动执行释放类型任务

只要运行一个或几个doit命令, 我们避免使用ci提供的魔法,除非它确实不可避免或非常 有用(例如,并行构建等),因为我们需要支持 多个ci系统(travis ci for linux和mac,以及appveyor for 窗口)。

自动生成的包

每个(开发)版本:

  • conda软件包已经构建并上传到anaconda.org (pyviz/label/dev)pyviz/label/main

  • pip包(sdist-zip,universal-wheel)已经构建并上传 到(test.pypi.org)pypi.org

当按下vx.y.z标记时,释放发生。开发版本可以 或者被定义为"每一个要掌握的合并"(例如,对于一个成熟的 或者"每次按下vx.y.zan样式标签(对于 快速变化的项目)。

注:"包构建"是指生成包,将包安装到 清洁环境,运行测试。

自动生成的网站

两个主要选项:

  1. 对于年轻、快速发展的项目:单个主网站(默认: https://package.github.io/)已在发行版上更新(可能还包括 特殊的发布后标签,我们在这里修复小文档问题 不更改代码,可能必须标记 特别是),有一个单独的开发网站(默认: https://pyviz docs.github.io/package master)更新于 推到master(或者每次alpha/beta/rc格式标签是 推?)

  2. 与1相同,但也为每个主要版本存档网站 (即X.Y一份,每个新的.Z更新一份)直到 我们最终删除了它们。可能只需要两个 默认值,其定义为只有版本1.0或 更重要的是作为一个主要版本,在这种情况下 策略1直到达到1.0,然后是策略2,从而充当 适用于1.0版之前的年轻、快速发展的项目, 然后存档每个X.Y版本。

注意:例如,对于datashader,使用travis ci目前不可行 (构建花费太长/占用太多内存/需要太大 数据)。但是travis只是使用doit命令,所以可以运行 在发布时本地。

<H3>17。额外的ci内容

平台

  • ubuntu(特拉维斯ci)

  • MacOS(特拉维斯CI)

  • 窗口(AppVeyor)

缓存

每次从头开始安装miniconda和依赖项都需要 一些项目需要相当多的构建时间。

因此,miniconda/conda环境的缓存 支持。(也支持python/pip,尽管速度不是 在那里发布)。

在许多方面,这可能是一个比从 scratch,因为许多开发人员/用户将更新现有的conda 安装/环境而不是从头开始。

构建阶段/构建的并行化

而不是按顺序运行任务(挂钟耗时;a 任务可能会影响后续任务),任务可以在 平行。

添加到文档

  • 生成pinned conda包
  • 生成环境.yml

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
http POST请求Java CouchDB   java删除带有大量尾随0的浮点字符串上的科学符号   JavaEE5和Hibernate   java如何在Spring Social中获得比特定id更早的tweet   java是框架。revalidate()在事件后获取输出是否重要?   java为什么不能返回通用映射?   java如何理解和优化工厂方法的高自时间   java Eclipse 202006错误由于项目的生成路径不完整,因此未生成该项目   多线程是java。util。向量序列化线程安全?   在Eclipse和java中使用不同的构建配置。属性文件   编译Java:从命令行运行的问题   java如何知道消息是否已确认/取消?   Java铸造一套   java Android Seekbar progress已更改变量,给出错误