essay | tech | year-summary | about
日期:2021-01-31T00:00:00Z
开始使用M1的新苹果本有一段时间了,原本想着可以为open source做点贡献。
就好像曾经为字幕组做贡献一样。(当然,我做的字幕组是合法的无偿字幕组)
不过看起来并不是一帆风顺,M1本身在系统层面上(目前系统版本是11.2.1)仍旧是死机频繁发生(相对比之前的macbook),
并不是一个稳定的系统。开源方面对M1的对应从2020年夏天苹果开始announce起,就一直在为M1的ARM CPU做着工作。
下面这个列表就是homebrew对于M1 ARM CPU对应的列表,这个列表在实时的更新。
https://github.com/Homebrew/brew/issues/7857
当然很多很基础的工作还没有完成。比如由于M1对应的GCC默认是CLANG,导致NEOVIM无法在M1上面进行编译。
(https://github.com/Homebrew/brew/issues/7857#issuecomment-687068494)
当然语言的编译器方面的支持一直都走在了前面,譬如nodejs的v8(仅支持ver15以后)
https://www.reddit.com/r/apple/comments/jyfg4m/nodejs_running_native_on_apple_silicon_m1_mac_mini/
https://github.com/nodejs/node/blob/master/BUILDING.md#platform-list
https://github.com/nodejs/build/issues/2474
https://github.com/nodejs/build/issues/2474#issuecomment-753786552
由于苹果的bug频出,我目前体验到的就是firefox和苹果底层的不兼容,经常会内存溢出,而导致系统重启。
众所周知firefox用rust来写,只有内存占用过度,很难出现内存溢出的情况。所以这个锅,firefox也真的很难背。
而bug频出的结果就是更新频繁,每次更新都要动辄好几个G,而比较让人抓狂的一点就是,每次更新之后,可能由于是较大更新的缘故,
每次git都会挂掉 = =|||
然后我就要敲下面重新安装cli版本的xcode来解决问题。
xcode-select --install
不得不说整个ruby社区都非常的活跃。
在mac框架下,homebrew俨然成为了标配。虽然有macport这个竞争者的存在,但是macport在M1上面连安装都办不到,它还要许多的sudo权限,最后删除的时候也是费尽周折还要按照官网上面的方式去手动删除。
不得不让我想起了我曾经用过的一个国产开源mail系统,仅限ubuntu才能安装,手动编译安装完之后没办法卸载。我去github找他的源代码,上面有个issue里面有人提问如何删除,可以提供脚本吗?
原作者回道:这个装的东西比较多,还是不要删了吧。
我只好把整个系统都卸载掉才做到了完美卸载。
我这个blog使用jekyll写的,所以我要先在M1上面把jekyll的环境配置好。
先用gem来装一下bundler和jekyll
gem install bundler jekyll
然后敲一下jekyll好了
$ jekyll
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': dlopen(/Library/Ruby/Gems/2.6.0/gems/ffi-1.14.2/lib/ffi_c.bundle, 0x0009): missing compatible arch in /Library/Ruby/Gems/2.6.0/gems/ffi-1.14.2/lib/ffi_c.bundle - /Library/Ruby/Gems/2.6.0/gems/ffi-1.14.2/lib/ffi_c.bundle (LoadError)
似乎跑不起来,我gem重装一下看看。
$ gem update
Parsing documentation for libxml-ruby-3.2.1
Before reporting this, could you check that the file you're documenting
has proper syntax:
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -c ext/libxml/extconf.rb
RDoc is not a full Ruby parser and will fail when fed invalid ruby programs.
The internal error was:
(NoMethodError) undefined method `[]' for nil:NilClass
ERROR: While executing gem ... (NoMethodError)
undefined method `[]' for nil:NilClass
怎么gem也好像坏了,感觉是M1原生的ruby的哪里起了冲突。我用brew装一下好了
$ brew update
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': dlopen(/Library/Ruby/Gems/2.6.0/gems/date-3.1.1/lib/date_core.bundle, 0x0009): missing compatible arch in /Library/Ruby/Gems/2.6.0/gems/date-3.1.1/lib/date_core.bundle - /Library/Ruby/Gems/2.6.0/gems/date-3.1.1/lib/date_core.bundle (LoadError)
Failed during: /opt/homebrew/bin/brew update --force --quiet
算了我试试ruby好了,结果ruby也坏了(编译器是好的)
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.arm64e-darwin20]
$ irb -v
1: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/specification.rb:1449:in `block in activate_dependencies'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/dependency.rb:313:in `to_specs': Could not find 'io-console' (~> 0.5) - did find: [io-console-0.4.7] (Gem::MissingSpecVersionError)
Checked in 'GEM_PATH=/Users/candy/.gem/ruby/2.6.0:/Library/Ruby/Gems/2.6.0:/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/gems/2.6.0', execute `gem env` for more information
我方了,在网上随便查了下,看到有这样的解决方案,的确是我预估的一样,起了冲突
删掉几个gem装的包就可以了
https://github.com/Homebrew/discussions/discussions/716
$ sudo /usr/bin/gem uninstall date etc io-console bigdecimal
果然brew就被修好了
$ brew
Example usage:
brew search [TEXT|/REGEX/]
brew info [FORMULA...]
brew install FORMULA...
brew update
brew upgrade [FORMULA...]
brew uninstall FORMULA...
brew list [FORMULA...]
那这样的话,只好把ruby升级,然后完全用新的ruby来做了。
先看看homebrew支不支持新的ruby,支持的话就不用从源代码来编译了。
https://github.com/Homebrew/brew/issues/7857
看起来是支持的,而且是Tier1的支持。
那就简单了
$ brew install ruby
安装成功后会给出提示信息,所以在.zshrc里面,过一下环境变量,让新的ruby优先于原本的ruby
export PATH=/opt/homebrew/opt/ruby/bin:$PATH:/opt/homebrew/bin
确认一下jekyll的位置,所有的东西都重装
$ which gem
/opt/homebrew/opt/ruby/bin/gem
$ which jekyll
/usr/local/bin/jekyll
$ sudo /usr/bin/gem uninstall bundler jekyll
Removing jekyll
Successfully uninstalled jekyll-4.2.0
Successfully uninstalled bundler-2.2.9
$ gem install bundler jekyll
jekyll和bundler装好了,问题是jekyll又找不到了,醉了
$ jekyll
zsh: command not found: jekyll
看看bundler在哪里
$ which bundler
/opt/homebrew/opt/ruby/bin/bundler
bundler就没问题
只好用搜索大法查找一下了
$ tree /opt/homebrew | grep jekyll
│ │ │ ├── jekyll
$ find /opt/homebrew -name "jekyll"
/opt/homebrew/lib/ruby/gems/3.0.0/bin/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/doc/jekyll-4.2.0/ri/lib/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/gems/jekyll-watch-2.2.1/lib/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/gems/jekyll-sass-converter-2.1.0/lib/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/gems/jekyll-4.2.0/rubocop/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/gems/jekyll-4.2.0/lib/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/gems/jekyll-4.2.0/exe/jekyll
再把.zshrc里面的环境变量改一下
export PATH=/opt/homebrew/lib/ruby/gems/3.0.0/bin:/opt/homebrew/opt/ruby/bin:$PATH:/opt/homebrew/bin
大功告成。最后把Gemfile.lock删掉,因为里面有些旧的版本号是不支持M1的,然后
$ bundler install
用了brew的ruby就是很舒服,安装gem不用再一直使用sudu权限了。也不知道gem是怎么配置的,如何就自己找了个对的位置。