本文由Markdown语法编辑器编辑完成。
1. 前言
近日在项目中,遇到一个比较奇怪的问题。就是代码基本没有做任何修改,只是在配置文件中增加了几行配置,结果用CI的服务器,打了一个新的tag, 然后再运行时,就会出现报错。
ImportError: cannot import name 'Celery' from 'celery'
而报错的地方,可以肯定与做的更改没有任何关系。
这时,就陷入了困境。到底是哪里发生了问题呢?
2. 解决思路:
2.1 重新打包
遇到这种问题, 一般首先想到的,是不是自动打包时发生了异常,导致打出来的安装包出问题了.
因此,一般都会再Retry一下.但是经过一段时间的等待,重新打出来的包,启动时还是会报相同的问题.
2.2 查看依赖库
因为代码几乎没有变,那经过CI时,最可能变化的,可能就是依赖的第三方包的版本了.
从网上查到了类似的问题:
https://stackoverflow.com/questions/74025035/importerror-cannot-import-name-celery-from-celery
而且报错几乎完全一致.
下面第一个回答就是关于这个问题的.
它是说,由于Celery依赖的包importlib-metadata的版本发生了变化.
如果在打镜像时,没有特别指明这个第三方包的版本时,CI会自动安装最新的版本.
因此,CI自动下载了 importlib-metadata==5.0.0的版本.
而由于我们使用的Celery是4.3.0的版本,它需要依赖importlib-metadata的版本是4.12.0, 才不会报错.
知道了原因后,再去CI的服务器上看一下打包记录.
我查看CI服务器上的打包记录,显示的是下载的importlib_metadata==6.0.0的版本.
因此导致了Celery出错.
修复方案:
知道了问题后,再修改就很简单了.
在requirements.txt中,指明这个包的版本为4.12.0即可.再重新打镜像,便解决了这个问题.
......
importlib_metadata==4.12.0