我正在尝试从本地未安装的车轮生成需求列表。只需将作为packages
参数的列表放入setup.py
的{{1}}调用中,将是最佳选择。如果安装了轮子,则setuptools.setup
会生成的输出也可以工作。
我想构建将在CI链中使用的docker映像。为了减少流水线时间,应该将其与所有运行时相关性放在首位。但是,在构建映像的时候,还没有构建python包,仅在链外构建包以获得pip freeze
既麻烦又容易出错。
将其入侵Dockerfile :
requirements.txt
这不是很好,因为docker在其构建上下文中做得很奇怪。在python -c $'\
import setuptools\n\
setuptools.setup = lambda *args, **kwargs: None\n\
exec(compile(open("setup.py").read(), "setup.py", "exec"))\n\
for requirement in requirements: print(requirement)\n' > python_packages.txt
# `requirements` is the name of variable that holds the package list
中拥有任何可访问本地文件的代码(例如,从setup.py
文件中获取当前版本号)便可以破解此黑客。
修复docker-build上下文以使此代码起作用将解决我的问题,但是我更喜欢一个适当的解决方案,该解决方案不隐式依赖VERSION
中的内容。
使用pip / pipreqs / pipenv / pipdeptree :
所有这些工具都可以在本地环境上运行,并且无法处理未安装的车轮。 built-in optimizers与setup.py
非常接近,但是1)仅在将软件包上传到pyPI时才有效(我的目标软件包不是),以及2)进行大量构建以获取软件包列表
答案 0 :(得分:1)
我的项目johnnydep
正是具有此功能,用于从未安装滚轮文件生成依赖项。
a
演示:
pip install johnnydep
johnnydep your-wheel-file.whl --output-format=pinned