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
源代码;大多数任务都是简单的命令。
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_requires
和extras_requires
)。匹普
理解这些,所以相同的可选依赖组是
可供用户使用(例如,用户可以运行pip install package[examples]
来获取包和
运行它的示例。
为了支持conda生态系统中的"选项",多个包是
生成-尽管通常我们的项目只有"基础"和
"示例"包。包示例
取决于特定的固定
包
(在生成时固定)。
pyctdev鼓励测试用户将要安装的包, 而不是只专注于测试开发人员的工作。
在python生态系统中,tox用于构建包,创建 清理虚拟环境,安装包,然后运行 测验。tox还支持在多个 多个环境中的python版本(例如,具有不同的集合 安装的依赖项的数量)等。
在conda生态系统中,conda build被多次调用以 实现同样的目标。
<H3>7。测试开发人员的工作为一个项目做贡献常常是困难的,因为建立它 要运行测试是很困难的。调味的 项目开发人员知道他们在做什么,但是 偶尔的开发人员。
pyctdev确保开发项目所需的依赖项是 很明显,并鼓励开发人员保持更新(例如 在中性ci机器上测试doit development_install。
pyctdev还试图捕捉开发人员如何设置环境。
例如,conda安装的依赖项,带有python setup.py development--上面没有deps
。
例如,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安装
必要时依赖。
除了指定一次依赖项之外,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
)…?
网站
- nbsite示例->;网站
实时文档
- 用户尝试的实时/浏览器方式示例:mybinder
<H3>15。版本控制
版本通过git标签。版本只存储在
存储库(git标记),并写入到包中。每个地方
需要知道版本(\uu init\uu.py
;打包:setup.py
,
meta.yaml
;docs)从单个源读取它。
存储在一个地方,它是标记而不是git repo 源代码,使自动化其他各种"发布时间"变得更容易 任务。我们的项目通常使用 自动更新(通过参数)。
版本控制方案:
我们使用vx.y.z
post 1.0(TOdo:复制高压方案?)
只要运行一个或几个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
样式标签(对于
快速变化的项目)。
注:"包构建"是指生成包,将包安装到 清洁环境,运行测试。
自动生成的网站
两个主要选项:
对于年轻、快速发展的项目:单个主网站(默认: https://package.github.io/)已在发行版上更新(可能还包括 特殊的发布后标签,我们在这里修复小文档问题 不更改代码,可能必须标记 特别是),有一个单独的开发网站(默认: https://pyviz docs.github.io/package master)更新于 推到master(或者每次alpha/beta/rc格式标签是 推?)
与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