将monorepo的一部分打包并确定依赖项。
项目描述
Py包制作工具
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.tsv 和 requirements.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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ce95ae793772249c42e692ed38cd1c4d51a34303e424b69d8ea6f7b28af1d3aa |
|
MD5 | 3a1e28bdf5a069565b0178e481080bf4 |
|
BLAKE2b-256 | 89aa344749891222f671a4f280d1f2371a4b417d766b6306a61122109a461126 |