跳转到主要内容

将monorepo的一部分打包并确定依赖项。

项目描述

Py包制作工具

Build Status Coverage PyPi PyPI - Python Version Documentation Status

Py包制作工具可以将monorepo的一部分打包并确定依赖项。

给定一个Python代码库的根目录、Python文件列表(来自该代码库)和目标目录,Py包制作工具将确定指定文件的依赖模块。脚本和本地依赖项将被复制到指定的目标目录。外部依赖项(如PyPI包)不会被复制(也不需要安装),而是生成包含外部依赖项子集的列表。

monorepo的外部依赖项需要指定在<root directory>/requirements.txt<root directory>/module_to_requirement.tsv中。

requirements.txt遵循Pip格式(请参阅pip文档)。该文件定义了整个代码库需要哪些外部包。Py包制作工具将读取此列表并提取指定Python文件所需的子集。

module_to_requirement.tsv 文件定义了 Python 模块与 requirements.txt 文件中定义的需求之间的对应关系。由于无法自动将 Python 模块映射到 pip 包,因此这种对应关系需要手动定义。在 module_to_requirement.tsv 文件中的对应关系以两行制表符分隔的值给出。第一列是完整的模块名(例如 PIL.Image),第二列是 requirements.txt 文件中的包名(例如 pillow)。应省略包的版本,并且版本应仅在 requirements.txt 中指定。

请勿忘记在 requirements.txt 文件中的 URL 和文件名中添加 #egg 片段,以便在将 module_to_requirement.tsvrequirements.txt 合并时能够唯一地解析包名。

用法

需求规范

如前所述,需求预期遵循Pip格式(参见pip文档)并位于代码库根目录下的requirements.txt中。模块到需求的映射预期在代码库根目录下的module_to_requirement.tsv中。

假设代码库位于~/workspace/some-project

以下是~/workspace/some-project/requirements.txt的部分内容。

pillow==5.2.0
pytz==2018.5
pyzmq==17.1.2

以下是~/workspace/some-project/module_to_requirement.tsv的部分内容(请注意,它是以制表符分隔的)。

PIL pillow
PIL.Image   pillow
PIL.ImageFile       pillow
PIL.ImageOps        pillow
PIL.ImageStat       pillow
PIL.ImageTk pillow
cv2 opencv-python

目录

假设代码库位于~/workspace/some-project,并且我们感兴趣将所有内容捆绑到pipeline/out目录中。

要确定文件和需求的部分,运行以下命令行

pypackagery \
    --root_dir ~/workspace/some-project \
    --initial_set ~/workspace/some-project/pipeline/out

这将给出以下详细且易于阅读的输出

External dependencies:
Package name | Requirement spec
-------------+---------------------
pyzmq        | 'pyzmq==17.1.2'
temppathlib  | 'temppathlib==1.0.3'

Local dependencies:
pipeline/out/__init__.py
common/__init__.py
common/logging.py
common/proc.py

如果我们想要以JSON格式获取相同的输出,我们需要调用

pypackagery \
    --root_dir ~/workspace/some-project \
    --initial_set ~/workspace/some-project/pipeline/out \
    --format json

这将给出一个JSON编码的依赖图

{
  "requirements": {
    "pyzmq": {
      "name": "pyzmq",
      "line": "pyzmq==17.1.2\n"
    },
    "temppathlib": {
      "name": "temppathlib",
      "line": "temppathlib==1.0.3\n"
    }
  },
  "rel_paths": [
    "pipeline/out/__init__.py",
    "common/__init__.py",
    "common/logging.py",
    "common/proc.py"
  ],
  "unresolved_modules": []
}

文件

再次假设代码库位于~/workspace/some-project。我们想要获取由脚本列表所需的代码库的子集。我们需要将初始集合指定为文件列表

pypackagery \
    --root_dir ~/workspace/some-project \
    --initial_set \
        ~/workspace/some-project/pipeline/input/receivery.py \
        ~/workspace/some-project/pipeline/input/snapshotry.py

这将给出

External dependencies:
Package name | Requirement spec
-------------+-------------------
icontract    | 'icontract==1.5.1'
pillow       | 'pillow==5.2.0'
protobuf     | 'protobuf==3.5.1'
pytz         | 'pytz==2018.5'
pyzmq        | 'pyzmq==17.1.2'
requests     | 'requests==2.19.1'

Local dependencies:
pipeline/__init__.py
pipeline/input/receivery.py
pipeline/input/snapshotry.py
common/__init__.py
common/img.py
common/logging.py
protoed/__init__.py
protoed/pipeline_pb2.py

未解决模块

如果有模块无法解决(既不在内置中,也没有在需求中指定,也不在代码库中),pypackagery将返回非零退出代码。

如果您指定了--dont_panic,即使有未解决的模块,退出代码也将为0。

模块packagery

Pypackagery提供了一个模块packagery,可以用来以编程方式确定代码库子集的依赖关系。例如,这对于部署到远程机器特别有用,您只想根据某些给定的配置部署代码库的一部分。

以下是一个示例

import pathlib

import packagery

root_dir = pathlib.Path('/some/codebase')

rel_pths = [
    pathlib.Path("some/dir/file1.py"),
    pathlib.Path("some/other/dir/file2.py")]

requirements_txt = root_dir / "requirements.txt"
module_to_requirement_tsv = root_dir / "module_to_requirement.tsv"

requirements = packagery.parse_requirements(
    text=requirements_txt.read_text())

module_to_requirement = packagery.parse_module_to_requirement(
    text=module_to_requirement_tsv.read_text(),
    filename=module_to_requirement_tsv.as_posix())

pkg = packagery.collect_dependency_graph(
    root_dir=root_dir,
    rel_paths=rel_pths,
    requirements=requirements,
    module_to_requirement=module_to_requirement)

# do something with pkg ...

请注意,相对路径(作为rel_paths参数给出)所有都需要是文件,而不是目录。

文档

文档可在readthedocs上找到。

安装

  • 创建虚拟环境

python3 -m venv venv3
  • 激活它

source venv3/bin/activate
  • 使用pip安装pypackagery

pip3 install pypackagery

开发

  • 检出仓库。

  • 在仓库根目录中,创建虚拟环境

python3 -m venv venv3
  • 激活虚拟环境

source venv3/bin/activate
  • 安装开发依赖项

pip3 install -e .[dev]

我们使用tox进行测试和打包分发

tox

pre-commit检查

我们提供了一系列pre-commit检查,用于检查代码的格式和风格。

具体来说,我们使用

  • yapf来检查格式。

  • 使用pydocstyle来检查文档字符串的风格。

  • 使用mypy进行静态类型分析。

  • 使用pylint进行各种检查。

  • 使用Python的doctest模块执行doctests。

在激活的开发依赖项虚拟环境中从本地运行pre-commit检查

./precommit.py
  • pre-commit脚本还可以自动格式化代码

./precommit.py  --overwrite

版本控制

我们遵循语义版本控制。版本X.Y.Z表示

  • X是主版本(向下不兼容),

  • Y是次版本(向下兼容),和

  • Z是补丁版本(向后兼容的bug修复)。

项目详情


下载文件

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

源代码分发

pypackagery-1.0.5.tar.gz (16.1 kB 查看哈希)

上传时间 源代码

由支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误日志 StatusPageStatusPage 状态页