Osx10.14升级watchman踩坑记
背景
使用 watchman
检测文件变化通知非常的好用, 但有些时候会出现 watchman 占用内存和 CPU 特别疯狂, 通过 watch-del
也无济与事, 由于 watchman 的版本 2021.09.13 比较老, 于是就想着升级一下版本.
正常来说, 在 mac 下使用 brew upgrade
升级非常的简单, 但是我的 OS 系统版本比较老, 一直使用的是 10.14 的 Mojave ( 之前也升级过 Bigsur, 后面因为休眠问题又退回了) . 众所周知, 官方已经不维护这个系统版本了, 所以 brew 上安装和更新软件也特别麻烦, 不能使用 bottle 安装已编译好的二进制, 必须要自己编译安装, 不光编译时间是个问题, 而且编译失败的概率也很高.
趁着周末的时间, 于是就准备通过 brew upgrade 升级 watchman, 但是杯具也是从这里开始了.
升级 watchman
首先更新 brew 的 formula 仓库, 把相关软件的版本和依赖数据库更新.
brew update
更新 watchman
brew upgrade watchman# output ==> Would upgrade 1 outdated package: watchman 2021.09.13.00 -> 2022.12.12.00 ==> Would install xx dependencies for watchman: folly 2021.09.13.00 -> 2022.12.12.00 edencommon 2022.12.12.00 fizz 2021.09.13.00 -> 2022.12.12.00 wangle 2021.09.13.00 -> 2022.12.12.00 fbthrift 2021.09.13.00 -> 2022.12.12.00 fb303 2022.12.12.00...
结果就是漫长的等待, 一堆一堆的依赖软件编译和安装, 包含 rust 和 llvm 这些大型软件, 结果整整编译了半天才编译完这些大型软件, 到最后编译 folly 时候居然失败了.
"std::__1::__fs::filesystem::path::__filename() const", referenced from: std::__1::__fs::filesystem::path::operator/=[abi:v15006](std::__1::__fs::filesystem::path const&) in AsyncBase.cpp.o "std::__1::__fs::filesystem::path::__root_directory() const", referenced from: std::__1::__fs::filesystem::path::operator/=[abi:v15006](std::__1::__fs::filesystem::path const&) in AsyncBase.cpp.o "std::__1::__fs::filesystem::path::lexically_normal() const", referenced from: folly::fs::lexically_normal_fn::operator()(std::__1::__fs::filesystem::path const&) const in Filesystem.cpp.o "std::__1::__fs::filesystem::__read_symlink(std::__1::__fs::filesystem::path const&, std::__1::error_code*)", referenced from: folly::AsyncBaseOp::fd2name(int) in AsyncBase.cpp.o
通过分析 debug 的编译日志, 编译应该都是成功的, 但在最后链接的时候失败了. 通过查询相关的资料得知, filesystem 相关的函数是定义在 <filesystem.h> 头文件中的, 这个头文件在 Xocde 11.x 版本有定义, 但是系统的支持应该是在 10.15 的版本才能支持1. 而我的 Xocde 版本确实是 11.3.1, 所以在编译时没出错, 但在链接的阶段失败了 .
# 查看当前的 xocde 版本
➜ xcodebuild -version# output
Xcode 11.3.1
Build version 11C505
尝试方案
基于其它版本的 folly 编译
既然 2022.12.12.00 版本编译安装失败, 那就尝试指定其它的版本编译, 可以通过 https://formulae.brew.sh/ 找到 folly 其它版本的 formula 文件. 具体步骤如下:
把指定版本 watchman.rb
下载后, 通过 brew 指定 rb 文件编译.
brew install -s -v -d watchman.rb
但是不幸的是, 还是编译错误. 换了多个版本折腾了半天, 还是会出现各种各样的编译错误, 没法了, 这条路是行不通了.
还原版本也不容易
既然无法成功更新 watchman 版本, 那打算接着使用原始的版本吧, 但问题又是一堆一堆的, 不让人安心了.
但当我执行 watchman 命令, 系统居然提示找不到这个命令了. 查看 /usr/local/bin/
目录, 确实没有 watchman 的链接文件了, 应该是执行 brew upgrade 时, 会取消掉原来版本的链接.
那就通过 brew link
重新链接吧.
brew link watchman
重新链接后命令是回来了, 但是执行后系统会提示如下错误:
➜ Cellar watchman -h# output
dyld: Library not loaded: /usr/local/opt/glog/lib/libglog.0.dylibReferenced from: /usr/local/bin/watchmanReason: image not found
[1] 11397 abort watchman -h
应该是之前更新依赖时, 把依赖库的版本升级了, 而原来版本的 watchman 无法找到老版本的依赖库了. 但当时更新了那么多的依赖库, 谁也不知道哪些库会不兼容, 看来只能走一步算一步, 人肉把出错的依赖库链接一个一个还原了.
# 查询链接的版本
➜ ls -l /usr/local/opt/ | grep glog
lrwxr-xr-x 20 guoxiangxun 19 Dec 16:13 glog -> ../Cellar/glog/0.6.0# 删除连接版本
➜ cd /usr/local/opt
➜ rm glog# 重新连接版本
➜ ln -s ../Cellar/glog/0.5.0 glog
其它还包含依赖库 llvm, fmt, icu4c, boost 等, 全部都要重新连接到原始版本. 如:
ln -s ../Cellar/llvm/13.0.1_1 llvm
ln -s ../Cellar/fmt/8.1.1_1 fmt
ln -s ../Cellar/icu4c/70.1 icu4c
ln -s ../Cellar/boost/1.78.0_1 boost
最终 watchman 版本终于还原成功, 能正常执行了. 但问题应该还没有结束, 后面看其它软件有哪些升级的依赖还需要还原吧, 因为 watchman 依赖库太多了. 可以通过 brew deps
看看, 具体的就不列出来了.
➜ brew deps --tree --installed watchman# output
watchman
├── boost
│ ├── icu4c
│ ├── xz
│ └── zstd
│ ├── lz4
│ └── xz
├── edencommon
│ ├── folly
│ │ ├── boost
│ │ │ ├── icu4c
│ │ │ ├── xz
│ │ │ └── zstd
│ │ │ ├── lz4
│ │ │ └── xz
│ │ ├── double-conversion
│ │ ├── fmt... more and more
... more and more
总结
针对系统不维护的系统版本, 尽量还是不要通过 brew upgrade 升级吧, 花费的编译时间长不说, 而且编译问题也是一堆一堆的, 到最后还原版本也不容易, 最好的方式还是升级系统或者将就着使用吧.
实在要更新的话, 先要先看下要更新软件所依赖的库的数量再决定, 如果要更新的依赖库太多的话, 风险可能更大. 可以 upgrade 时加上-n
参数测试下, 更新时把相关的日志记录下来, 究竟更新了哪些库的哪些版本, 以便于搞不定时还原.
References
https://stackoverflow.com/a/58668083/2538322 ↩︎
Osx10.14升级watchman踩坑记相关推荐
- 服务器重新部署踩坑记
服务器重新部署踩坑记 Intro 之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除 ...
- 安装sql server踩坑记【sql2000程序安装配置服务器失败】
安装sql server踩坑记 安装程序配置服务器失败.参考服务器错误日志和 C:\WINDOWS\sqlstp.log 了解更多信息. 在C:\Program Files\Microsoft SQL ...
- android 重新编译内核,[原创]华为内核重新编译踩坑记
华为内核重新编译踩坑记 前几天有朋友找我帮他跟一个加密,由于js太乱了,想从app入手,于是打算用frida脱壳,结果发现报错 Failed to attach: remote_write PTRAC ...
- 口罩、安全帽识别比赛踩坑记(二) 比赛流程及 SSD / YOLO V3 两版本实现
本篇文章主要对比赛流程中的各个环节进行展开说明,并对笔者践行过的代码及更改的地方进行记录.如哪里有侵权请联系笔者进行删除.另外在这里对比赛举办方表示感谢 ~ ~ 其中开源代码会在整理后放在github ...
- Go 语言踩坑记——panic 与 recover
题记 Go 语言自发布以来,一直以高性能.高并发著称.因为标准库提供了 http 包,即使刚学不久的程序员,也能轻松写出 http 服务程序. 不过,任何事情都有两面性.一门语言,有它值得骄傲的优点, ...
- 口罩、安全帽识别比赛踩坑记(一) 经验漫谈及随想
前言 因为疫情迎来的史无前例大假期,从开始理直气壮的天天划手机,到中间百无聊赖的躺尸,再到之后实在憋得慌,就想找点什么事搞一搞.恰好这时,一直关注的极视角联合 Intel 公司举办了一个对口罩和安全帽 ...
- linux mint 无法联网_linux mint踩坑记
linux mint踩坑记 linux 简介 1.linux mint 是基于debian的一个发行版,以友好的界面素称,开始菜单很像windows,风格以清新为主! 2.linux mint 分为两 ...
- python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django
<>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...
- 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题
❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...
最新文章
- SpringMVC+thymeleaf
- 第一次调研快速入门查找期刊及分级?
- android sdk 更新用的HOSTS
- AI领域首个iF用户体验大奖——第四范式斩获2项德国iF设计奖
- PHP操作redis
- (引)ajax 经验-保留自己使用
- 呐,你要的新年攻略和文章汇总
- 在线短视频缩略图剪切工具
- 物理用不用计算机,计算物理学到底是干什么的?
- 涡扇发动机的预测性维护
- 产品开发之小步快跑,快速迭代
- MySQL中的any_value()函数
- Pytorch统计模型参数量和计算量
- 前端转换为pdf的方法之一
- 【ITPM】TW1:ISchool 项目前期分析说明书
- crash工具分析sysdump使用
- Php 股票系统,利用PHP命令行模式采集股票趋势信息
- java 给word加水印,Java 实现在线给word 文档添加水印
- 手机设备端口9006刷回9008救砖步骤
- matlab costas环,基于Matlab的Costas环仿真设计
热门文章
- Visual Studio 2019 Failed to load package MonoAndroidDesignerPackage
- 无码建站WebFlow初体验
- 算法重要,但并非全部,并非所有人的选择
- html背景看不见,html不显示图片-为什么在html中不显示背景图片 – 手机爱问
- mediaRecorder录制视频与播放
- JSP 与 HTML 的关系
- [源码和文档分享]基于Cocos2d-x实现的畜不及防鬼畜音乐节奏游戏
- 【Java】从网络获取北京时间
- python中的函数def
- windows系统“删库跑路“脚本bat