启用与包含大量包的Python项目一起工作,其中您只想开发其中的一些。
项目描述
使用pip在稳定的约束条件之上构建的混合开发源代码包
mxdev [mɪks dɛv] 是一个实用工具,可以轻松地与包含大量包的Python项目一起工作,其中您只想开发其中的一些。
它建立在拥有稳定的版本约束并在其之上从版本控制系统(VCS)进行开发的想法之上。
在上面的用例中,有时稳定的约束条件的版本需要使用不同的(即较新)版本进行覆盖。遵循相同想法的其他软件有Python的 zc.buildout 的 mr.developer 或NPM包的 mrs-developer。
概述
mxdev的过程是
- 读取配置
- 读取要求和约束(在配置中给出)。
- 从版本控制系统(VCS)获取的资源将被放入目标目录中。
- 修改后的约束(已注释的处理包,替换了覆盖的版本)和要求(处理包作为从源的可编辑包)将被写入。
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
的默认值,详细内容请参阅该节。允许的值:direct
或 skip
默认:direct
default-update
节中 update
的默认值,详细内容请参阅该节。
允许的值:yes
或 no
默认: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将
- 读取来自
mx.ini
的配置, - 获取在配置文件中定义的包,
- 写入一个需求和约束文件。
现在,使用生成的需求和约束文件,例如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上的示例
- "new" plone.org后端
- Conestack
- (添加更多)
扩展
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
,这是一个好主意!
您可以分叉它,在项目中工作并创建一个拉取请求。
维护者是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)
-
修复了使用
--install-option='pre'
的问题,并在需求文件中使用--pre
选项。pip 23已经弃用安装选项,Plone最近已经切换到pip 23。更多信息:[thet, fredvd] https://github.com/pypa/pip/issues/11358 https://discuss.python.org/t/passing-command-line-arguments-to-pip-install-after-install-options-deprecation/22981/6 -
修复了在没有默认值的情况下从配置解析器读取部分的问题,如果该部分包含一个也作为默认值存在的设置。[rnix]
-
如果没有定义约束,则不要将约束写入文件。[rnix]
-
将
main-package
选项添加到设置中。[rnix]
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)
- 对libvcs错误的解决方案 https://github.com/vcs-python/libvcs/issues/295 [jensens, gogobd]
1.0.0a5(2021-11-30)
- 对libvcs错误的解决方案 https://github.com/vcs-python/libvcs/issues/293 [jensens, gogobd]
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 贡献者
保留所有权利。
以下条件满足时,允许重新分发和使用源代码和二进制代码,无论是否修改:
-
源代码重新分发必须保留上述版权声明、本条件列表和以下免责声明。
-
二进制形式的重新分发必须复制上述版权声明、本条件列表和以下免责声明在随分发提供的文档和/或其他材料中。
本软件由版权所有者和贡献者提供“按原样”以及任何明示或暗示的保证,包括但不限于适销性和针对特定目的的适用性保证。在任何情况下,版权所有者或贡献者不对任何直接、间接、偶然、特殊、示范性或后果性的损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)负责,无论何种原因造成,无论基于合同、严格责任还是侵权(包括疏忽或其他),即使在被告知此类损害的可能性时也不例外。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。