如何缩小基于Clojure+Origami的OpenCV AWS Lambda部署包体积?
我之前用Origami+OpenCV部署Lambda的时候也碰到过这个体积超标的坑,核心问题就是Origami默认会把多平台的OpenCV原生库都打包进去,而Lambda只需要Linux环境的版本就行。咱们可以通过调整Leiningen的uberjar配置来精准剔除多余文件,具体方案如下:
方法一:通过:uberjar-exclusions直接排除非Linux依赖
在你的project.clj里找到:uberjar配置块,添加正则规则排除macOS和Windows相关的原生库文件:
(defproject your-project-name "0.1.0-SNAPSHOT" ;; 其他项目配置(比如依赖、lambda配置等)... :uberjar {:aot :all :uberjar-exclusions [#"^.*macosx.*$" #"^.*windows.*$"]})
这个配置会让Leiningen在构建uberjar时,跳过所有路径中包含macosx或windows的文件,只保留Linux平台的OpenCV库。
方法二:精准指定只包含需要的Linux架构库
如果你的Lambda使用特定架构(比如arm64或者x86_64),可以进一步缩小打包范围,只保留对应架构的Linux库,同时排除其他:
:uberjar {:aot :all :uberjar-exclusions [#"^.*(macosx|windows|linux-(x86_64|aarch64))(?!-x86_64).*$"] :uberjar-inclusions [#"^.*linux-x86_64.*$"]}
比如上面的示例是针对x86_64架构的Lambda,如果你用的是arm64,就把配置里的x86_64替换成aarch64即可,这样只会保留对应架构的Linux库,体积能进一步压缩。
方法三:部署前手动清理(应急方案)
如果暂时不想修改project.clj,可以在执行lein lambda deploy production之前,手动删除target目录里的多余文件:
# 清理macOS和Windows的OpenCV库 rm -rf target/uberjar/lib/org/opencv/core/native/macosx* target/uberjar/lib/org/opencv/core/native/windows*
不过这个是临时方案,每次部署都要执行,不如配置project.clj来得省心。
验证效果
修改配置后,先执行lein uberjar,然后查看target/uberjar/lib/org/opencv/core/native/目录,确认只有Linux相关的文件夹(比如linux-x86_64),再执行部署命令,此时打包体积应该就能控制在250MB以内了。
内容的提问来源于stack exchange,提问作者benwiz

