macOS打tar包部署Flask出现._开头隐藏py文件报错如何解决
这些._开头的文件是macOS生成的AppleDouble格式元数据文件,用来存储文件的扩展属性、资源分叉、Finder标记这类macOS独有的文件信息。
macOS自带的bsdtar打包时默认会把这类元数据单独打包成与原文件同名、加._前缀的伴随文件。你在本地macOS环境解压时,系统会自动将这些伴随文件内的元数据合并回对应原文件,随后自动删除._前缀文件,因此你本地无论通过快捷键显示隐藏文件、用find命令扫描、用第三方文件管理器查找,都看不到这些独立文件。但Linux系统不识别AppleDouble格式,解压时会把这些._文件原样释放到目录中,就会被lint检查、测试脚本扫描到,导致运行崩溃。
你之前执行dot_clean、本地查找._*文件无效,是因为打包前这些元数据存储在macOS文件系统的扩展属性位中,根本不是独立存在的磁盘文件,自然无法被扫描清理。
从打包源头避免带入元数据文件(推荐)
打包时临时禁用macOS的元数据自动拷贝逻辑,在tar命令前加环境变量即可:
COPYFILE_DISABLE=1 tar -cvf project.tar myfolder
如果不想每次打包都手动加这个参数,可以把环境变量永久写入shell配置,后续所有打包操作都会自动生效:
- 若使用macOS默认的zsh shell,执行:
echo 'export COPYFILE_DISABLE=1' >> ~/.zshrc && source ~/.zshrc
- 若使用bash shell,执行:
echo 'export COPYFILE_DISABLE=1' >> ~/.bash_profile && source ~/.bash_profile
也可以通过Homebrew安装GNU版本的tar替代系统自带的bsdtar,GNU tar默认不会打包macOS专属的元数据文件:
brew install gnu-tar # 后续打包使用gtar命令即可 gtar -cvf project.tar myfolder
清理服务器上已解压的残留文件
如果已经把带这类元数据文件的压缩包解压到服务器,直接在项目根目录执行命令批量删除所有._前缀文件即可:
find /mydeployedfolder -type f -name '._*' -delete
执行完成后可以再跑一遍find /mydeployedfolder -type f -name '._*'确认无残留,再执行lint检查、测试或启动服务就不会出现相关报错。
内容的提问来源于stack exchange,提问作者user19413311

