从卸载的滚轮生成requirements.txt

时间:2018-09-24 11:11:06

标签: python docker continuous-integration python-packaging

我正在尝试从本地未安装的车轮生成需求列表。只需将作为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 optimizerssetup.py非常接近,但是1)仅在将软件包上传到pyPI时才有效(我的目标软件包不是),以及2)进行大量构建以获取软件包列表

1 个答案:

答案 0 :(得分:1)

我的项目johnnydep正是具有此功能,用于从未安装滚轮文件生成依赖项。

a

演示:

pip install johnnydep
johnnydep your-wheel-file.whl --output-format=pinned