跳转到主要内容

启用与包含大量包的Python项目一起工作,其中您只想开发其中的一些。

项目描述

使用pip在稳定的约束条件之上构建的混合开发源代码包

mxdev [mɪks dɛv] 是一个实用工具,可以轻松地与包含大量包的Python项目一起工作,其中您只想开发其中的一些。

它建立在拥有稳定的版本约束并在其之上从版本控制系统(VCS)进行开发的想法之上。

在上面的用例中,有时稳定的约束条件的版本需要使用不同的(即较新)版本进行覆盖。遵循相同想法的其他软件有Python的 zc.buildoutmr.developer 或NPM包的 mrs-developer

在Github上关注我们

概述

mxdev的过程是

  1. 读取配置
  2. 读取要求和约束(在配置中给出)。
  3. 从版本控制系统(VCS)获取的资源将被放入目标目录中。
  4. 修改后的约束(已注释的处理包,替换了覆盖的版本)和要求(处理包作为从源的可编辑包)将被写入。

mxdev 不会为您运行 pip

配置

给定一个 requirements.txt(或类似命名的)文件,该文件本身引用了内部的 constraints.txt 文件。

创建一个 INI 文件,例如 mx.ini,使用 configparser.ExtendedInterpolation 语法。

主节 [settings]

主节必须命名为 [settings],即使保持为空。在主节中定义了输入和输出文件。

requirements-in

要开始的主要要求文件。这也可以是一个 URL。

如果给定空值,mxdev 将只生成 INI 文件本身提供的信息的输出。

默认值:requirements.txt

requirements-out

结合了开发源的要求输出,稍后可以用 pip install 使用。默认:requirements-mxdev.txt

constraints-out

结合的约束输出。

默认:constraints-mxdev.txt

include

包含一个或多个其他 INI 文件。

包含的文件在主文件之前读取,因此主文件覆盖了包含的设置。包含的文件可以包含其他文件。最内层的包含首先读取。

如果包含的文件是 HTTP-URL,则从那里加载。

如果包含的文件是相对路径,则相对于父目录或 URL 加载。

该功能利用了 ConfigParser 功能一次性读取多个文件

默认:空

default-target

版本控制系统(VCS)资源的目标目录。默认:./sources

default-install-mode

节中 install-mode 的默认值,详细内容请参阅该节。允许的值:directskip

默认:direct

default-update

节中 update 的默认值,详细内容请参阅该节。

允许的值:yesno

默认:yes

threads

并行获取资源时使用的线程数。可以加快从版本控制系统(VCS)的获取。

默认:4

offline

不获取任何源。当离线工作时很有用。

默认:False

version-overrides

覆盖已定义在依赖约束文件中的包版本。例如,上游 constraints.txt 已包含 somefancypackage==2.0.3。鉴于某种原因(例如,使用我进一步开发的源),我们可能需要上面提到的包的 3.0.0 版本。

然后在此节中,可以定义为

[settings]
version-overrides =
    somefancypackage==3.0.0
    otherpackage==33.12.1

可以添加所需的任何数量的覆盖。在写入 constraints-out 时,将考虑新版本。如果为同一包定义了源节,则使用源,并忽略此处的内容。

注意:当使用 uv pip 安装时,此处不需要版本覆盖,因为它 原生支持覆盖。使用 uv 时,建议创建一个包含版本覆盖的 overrides.txt 文件,并使用 uv pip install --overrides overrides.txt [..] 安装包。

ignores

忽略在依赖约束文件中已定义的包。不会提供新版本。如果计划从本地文件系统安装包(如 -e .),但已在上游约束文件中锁定,则这特别有用。

可以定义为

[settings]
ignores =
    somefancypackage
    otherpackage

default-use

默认为 true。当为 false 时,不会检出源,并且不会覆盖此包的版本。此外,可以定义自定义变量为 key = value 对。它们可以在其他值中作为 ${settings:key} 引用,并将在那里展开。

main-package

mxdev可以直接通过ini配置处理一个Python包作为主包。如果已定义,它将被添加到生成的requirements.out文件中的最后一个条目。

可以定义为

[settings]
main-package = -e .[test]

如果主包在依赖约束文件中定义,则其名称必须添加到ignores中。

默认设置

mxdev提供了默认设置,可以在包或自定义部分中使用。

目录

包含当前工作目录,可以像这样使用

[sectionname]
param = ${settings:directory}/some/path

后续包源部分

所有其他部分都是定义要使用的源。

[PACKAGENAME]

部分名称是包名称。

url = URL

存储库的检出URL。

URL是必需的。

pushurl = URL

可以指定一个可写URL以供推送使用。

如果pushurl在初始检出后设置,则不会应用它。要应用它,请删除存储库并重新检出。

vcs = VCS

要使用的版本控制系统。

支持的有

  • git(稳定,已测试)
  • fs(稳定,已测试)- 实际上没有vcs,但指向本地目录。这可以通过在需求输入文件中使用-e PATH来实现,而无需使用mxdev。
  • svn(不稳定,需要重写测试)
  • gitsvn(不稳定,需要重写测试)
  • hg(不稳定,需要重写测试)
  • bzr(不稳定,需要重写测试)
  • darcs(不稳定,需要重写测试)

默认为git

branch = BRANCHNAME_OR_TAG

要检出的分支名称或标记。

默认为main

extras = EXTRA1,EXTRA2

安装包的额外内容。默认为空。

subdirectory = SUBPATH

用于指定Python包的路径,当它不在VCS目录的根目录时。

默认为空。

目标

此部分源的目标目录。

默认为主部分中配置的默认目标目录[settings] default-target =值。

install-mode

pip安装有不同的模式

skip

不使用pip安装,只需克隆/更新存储库

direct

使用pip -e PACKAGEPATH安装包。依赖项立即解决

默认为主部分中配置的默认模式[settings] default-install-mode =值。

use

默认为true,除非在常规设置中为default-use为false。当为false时,不会检出源,且不覆盖此包的版本。

submodules

有3个不同的选项

always

(默认)git子模块始终检出,如果已存在,则更新它们

checkout

子模块仅在检出期间获取,现有的子模块保持不变

recursive

递归获取子模块,结果是在检出时使用git clone --recurse-submodules on,在更新时使用submodule update --init --recursive

用法

运行mxdev(要获取更多信息,请运行mxdev --help)。

Mxdev将

  1. 读取来自mx.ini的配置,
  2. 获取在配置文件中定义的包,
  3. 写入一个需求和约束文件。

现在,使用生成的需求和约束文件,例如pip install -r requirements-mxdev.txt

mxdev >=4.0需要pip版本至少为23才能正常工作

示例配置

示例mx.ini

它看起来像这样

[settings]
requirements-in = requirements.txt
requirements-out = requirements-mxdev.txt
contraints-out = constraints-mxdev.txt

version-overrides =
    baz.baaz = 1.9.32

ignores =
    my.ignoredpackage

# custom variables
github = git+ssh://git@github.com/
mygit = git+ssh://git@git.kup.tirol/

[foo.bar]
url = ${settings:github}orga/foo.bar.git
branch = fix99
extras = test,baz

[kup.fancyproject]
url = ${settings:mygit}customers/fancycorp/kup.fancyproject.git
branch = fix99
extras = test,baz

GitHub上的示例

扩展

mxdev的功能可以通过钩子进行扩展。这非常有用,可以生成额外的脚本或文件,或自动化与mxdev领域相关的任何其他设置步骤。

扩展配置设置最终会在mx.ini文件中。它们可以添加到全局的settings部分,作为专门的配置部分或针对特定包的配置。为了避免命名冲突,所有与钩子相关的设置和配置部分都必须以命名空间作为前缀。

建议使用包含钩子的包名作为命名空间。

它看起来像这样

[settings]
myextension-global_setting = 1

[myextension-section]
setting = value

[foo.bar]
myextension-package_setting = 1

扩展作为mxdev.Hook的子类实现。

from mxdev import Hook
from mxdev import State

class MyExtension(Hook):

    namespace = None
    """The namespace for this hook."""

    def read(self, state: State) -> None:
        """Gets executed after mxdev read operation."""

    def write(self, state: State) -> None:
        """Gets executed after mxdev write operation."""

INI文件中的默认设置部分可在state.configuration.settings中找到。包配置可在state.configuration.packages中找到。与钩子相关的配置部分可在state.configuration.hooks中找到。

钩子必须作为入口点在您的包的pyproject.toml中进行注册。

[project.entry-points.mxdev]
hook = "myextension:MyExtension"

理由

问题

存在一个类似-c constraints.txt的约束文件,其中包含一个版本固定的包foo.bar。然后,无法在可编辑的-r requirements.txt要求文件中使用-e git+ssh://git@github.com/orga/foo.bar.git@fix-99来安装此包。也无法用自定义版本约束覆盖继承的版本约束。

想法

一个预处理器会获取(这可以是URL)并展开所有-c SOMEOTHER_FILE_OR_URL-r SOMEOTHER_FILE_OR_URL文件,将其合并为一个,并从配置文件中过滤出所有包。对于这些包中的每一个,将生成一个-e ...条目并写入新的TARGET.txt。对于版本覆盖也是如此:将新的条目写入生成的约束文件,同时禁用原始版本。配置从ExtendedInterpolation INI语法(YAML会很棒,但该包必须尽量减少对其他包的依赖)的mx.ini文件中读取。

趣闻轶事

Mx(通常发音为mix [mɪks],或在英国为[məks])旨在成为Mr.和Ms.的中性替代品,但也与“混合”一词相关联。

其他

与VCS相关的代码取自mr.developer。感谢Florian Schulze和贡献者。

贡献

如果您想帮助开发(改进、更新、错误修复、...)mxdev,这是一个好主意!

代码位于GitHub MXStack组织 / mxdev

您可以分叉它,在项目中工作并创建一个拉取请求。

维护者是Jens Klein和BlueDynamics Alliance的开发者团队。

我们感激任何贡献!如果您有任何想法,发现了错误,想给我们留言,或者需要发布,请只需在mxdev问题跟踪器中提交问题。

变更

4.0.3 (2024-05-17)

  • 修复#45:在检出时,不忽略大写命名的包。[jensens]

4.0.2 (2024-03-13)

  • 修复#42:已弃用的pkg_resoures用法来加载入口点和解析要求。这使mxdev能够在Python 3.12上工作,其中pkg_resources不再默认在虚拟环境中安装。[jensens]

4.0.1 (2024-03-01)

  • 修复指定修订版(#40)[pbauer]

4.0.0 (2024-02-28)

  • 破坏性更改:从生成的requirements-mxdev.txt中删除对来源的--pre选项。通常不再需要,至少与pip 23.x一起使用时如此。如果您依赖生成的文件中存在--pre选项,则这是一个破坏性更改。现在,在生成文件使用时,应将--pre选项添加到pip install。[jensens]

  • 破坏性更改:停止对Python 3.7的官方支持(它已过时)。[jensens]

  • 记录mx.ini中的vcs设置。[jensens]

3.1.0 (2023-12-10)

  • 功能:提供directory默认设置[rnix]
  • 特性:包含其他INI配置文件[jensens]

3.0.0 (2023-05-08)

  • 移除了多余的打印[jensens]

3.0.0b3(2023-04-23)

3.0.0b2(2023-02-07)

  • 在此包中,使用pyproject.toml和markdown为README等文件。[jensens]

  • 向源添加use选项,并将default-use添加到设置中。default-use默认为true。当为false时,源不会被检出,并且不会覆盖此包的版本。[maurits]

3.0.0b1(2022-11-21)

  • 不要使用libvcs,而是回收和更新(类型提示、测试)的mr.developer VCS代码。Git代码经过良好测试,SVN、Mercurial、Bazaar和DARCS的代码需要在此领域有知识的贡献者。还添加了额外的选项,如pushurl等(见README)。不再支持pip样式的VCS URL。[jensens, rnix, zworkb]

  • 配置解析器选项现在被认为是大小写敏感的。[rnix]

  • 如果缺少requirements.txt,不要使mxdev运行失败。[rnix]

  • 添加了标志以只获取仓库并跳过生成文件。[rnix]

  • 添加了标志以跳过仓库的获取。[rnix]

  • 添加了对自定义钩子的支持。[rnix]

  • 在文档中将sources.ini重命名为mx.ini。[rnix]

  • 引入状态对象并将其传递给读取/获取/写入。状态对象包含所有必需的运行时数据。[rnix]

2.0.0 (2022-01-31)

  • 依赖于pip 22,其中不再需要互依模式。删除所有与互依相关的代码。[jensens]

  • 如果要求-in文件不存在,则提供更好的错误消息。[jensens]

  • 提供带有完整pip命令的更好的最后消息。[jensens]

  • 允许空的requirements-in配置。[jensens]

1.1.0 (2021-12-29)

  • 特性:忽略现有约束。新设置ignores包含要忽略约束而不提供版本的包列表(每行一个)[jensens]

1.0.1 (2021-12-21)

  • 修复:如果一个开发的包依赖于另一个开发的包,则有时(!?)会忽略依赖包。相反,取最后发布版。解决方案:使用--pre选项安装它,以允许其他非最终/开发版发布。[jensens]

1.0.0 (2021-12-12)

  • "outfiles"的默认值现在是*-mxdev.txt。[jensens]

1.0.0b4(2021-12-07)

  • 修复了互依模式。[jensens]

1.0.0b3(2021-12-07)

  • 修复:不要在要求上应用禁用覆盖。[jensens]

1.0.0b2(2021-12-07)

  • 添加功能:版本覆盖。[jensens]

1.0.0b1(2021-12-04)

  • 添加-s--silent选项。[jensens]

  • 美化输出。[jensens]

  • 修复了如果*.txt不以换行符结尾则缺少CR的问题。[jensens]

1.0.0a9(2021-12-01)

  • 添加了pip URL的自动纠正,因此GitHub或GitLab URL可以像在sources.ini中复制一样使用。[zworkb]

1.0.0a8(2021-11-30)

  • 添加了互依处理以避免手动解决依赖顺序。[jensens, gogobd]

  • 添加了跳过模式以排除要安装的包(仅克隆/更新)。[jensens, gogobd]

  • 移除了位置功能。[jensens, gogobd]

1.0.0a7(2021-11-30)

  • 移除了对libvcs的解决方案并依赖于libvcs>=0.10.1。[jensens]

1.0.0a6(2021-11-30)

1.0.0a5(2021-11-30)

1.0.0a4(2021-11-29)

  • 修复:可编辑的可以配置在初始要求之前或之后进行处理。[jensens]

1.0.0a3 (2021-11-23)

  • 修复 #1: pip 重新运行后,已提交的更改消失 [jensens]

1.0.0a2 (2021-11-21)

  • 简化打包。 [jensens]

  • 实现子目录可编辑安装 [jensens]

  • 实现包额外功能 [jensens]

1.0.0a1 (2021-11-21)

  • 初始工作。 [jensens]

许可证

版权所有 (c) 2022-2023,mxstack 贡献者

保留所有权利。

以下条件满足时,允许重新分发和使用源代码和二进制代码,无论是否修改:

  • 源代码重新分发必须保留上述版权声明、本条件列表和以下免责声明。

  • 二进制形式的重新分发必须复制上述版权声明、本条件列表和以下免责声明在随分发提供的文档和/或其他材料中。

本软件由版权所有者和贡献者提供“按原样”以及任何明示或暗示的保证,包括但不限于适销性和针对特定目的的适用性保证。在任何情况下,版权所有者或贡献者不对任何直接、间接、偶然、特殊、示范性或后果性的损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)负责,无论何种原因造成,无论基于合同、严格责任还是侵权(包括疏忽或其他),即使在被告知此类损害的可能性时也不例外。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

mxdev-4.0.3.tar.gz (44.5 kB 查看哈希)

上传时间 源代码

构建分发

mxdev-4.0.3-py3-none-any.whl (47.5 kB 查看哈希)

上传时间 Python 3

由...