conda pack打包时未保留对包的monkey patch修改是什么原因?
问题原因与解决方案
核心原因
conda pack 默认采用归档优先的打包逻辑:
- 它会先查询环境中每个文件所属的conda包,优先从全局conda包缓存(默认路径为
/opt/conda/pkgs/)中拉取对应包的原始文件打包,不会主动读取环境目录下被修改过的文件,目的是提升打包速度、支持跨包文件去重。 - 手动执行时可以正常打包补丁文件的原因:手动操作时大概率你之前执行过清理命令清空了包缓存,
conda pack找不到对应包的缓存文件,就会自动降级为直接遍历读取环境目录下的实际文件,所以修改后的内容会被包含。而CI容器环境是全新干净的,安装依赖后包缓存完好,因此conda pack直接调用缓存中的原始文件,忽略了你在/opt/conda/envs/venv/下的修改。
解决方案
直接在conda pack命令中添加--no-archive参数即可,该参数会强制conda pack跳过包缓存,直接读取环境目录下的所有实际文件进行打包:
conda pack --name venv --no-archive --output "$BUILD_DIR/runtime.tar.gz"
替代方案(可选)
如果你不想牺牲归档模式的打包速度,也可以在打完补丁后,将修改后的文件同步覆盖到包缓存中对应Python包的相同路径,再执行打包:
# 找到python 3.7对应的包缓存目录 PY_PKG_DIR=$(ls -d /opt/conda/pkgs/python-3.7.*) # 覆盖缓存中的对应文件 cp /opt/conda/envs/venv/lib/python3.7/ctypes/__init__.py ${PY_PKG_DIR}/lib/python3.7/ctypes/__init__.py # 再执行正常打包 conda pack --name venv --output "$BUILD_DIR/runtime.tar.gz"
内容的提问来源于stack exchange,提问作者Zhao Li
相关产品推荐
相关产品推荐

