macOSをCatalinaにアップデートしたらdocker-syncが動かなくなって調べたこと


まえおき

Xcodeを過信してたらRubyから苦情もらった(docker-sync動かないorz) - https://qiita.com/CeMoReOn/items/9abb837727af5594fc0f

っていうタイムリーな記事があったので、これは rbenvとかhomebrew経由でRuby入れないとダメなのかなー・・・と思っていたけど、
Mac付属のRubyでも一応動いたのでメモっとく。

ちなみに、次のMacバージョンからそもそもRubyが付属しなくなるという噂 もあるので、この記事の賞味期限はきっとかなり短いだろう。

OSをアップデートした直後

$ docker-sync-stack start
-bash: /usr/local/bin/docker-sync-stack: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: bad interpreter: No such file or directory

前評判のとおり、こんなかんじのエラーは出る。

$ which ruby
/usr/bin/ruby
$ ls -l /usr/bin/ruby
-r-xr-xr-x  1 root  wheel  36624  9 30 05:28 /usr/bin/ruby

Rubyのバイナリ自体はある。

$ ls /System/Library/Frameworks/Ruby.framework/
Resources/ Ruby       Versions/ 
$ ls /System/Library/Frameworks/Ruby.framework/Versions/2.6/
Resources/      Ruby            _CodeSignature/ usr/

このあたりで、「あー、Ruby 2.3じゃなくなったのね」と察しがつく。

docker-syncを入れ直す

$ sudo gem uninstall docker-sync
$ sudo gem install docker-sync
$ docker-sync-stack start
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/include/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.

エラーの種類が変わった。

エラー文言でぐぐると

xcode-select --install とか xcodebuild ... みたいなコマンド叩くといいみたいなのが出てくるが、環境によっては多分それでは無理っぽい。(自分の場合はうまくいかなかった)

Xcode 11にする

これは実際に関係あるのかどうかわからないが、
とりあえず xcode-select --installxcodebuild ... を叩くだけではXcode11にはならない。

なので、App StoreからXcode 11を落としてくる。

ついでに、AppleのDeveloper向けサイトからコマンドラインツールも落としてくる。

11になったことを確認。

そもそものエラーの出どころを見てみる

mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/include/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.

これはそもそもdocker-syncに関係のないエラーだ。ということで、エラーの出どころを見てみる。

/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb
  topdir = File.dirname(File.dirname(__FILE__))
  path = File.expand_path($0)
  until (dir = File.dirname(path)) == path
    if File.identical?(dir, topdir)
      $extmk = true if %r"\A(?:ext|enc|tool|test)\z" =~ File.basename(path)
      break
    end
    path = dir
  end
  $extmk ||= false
  if not $extmk and File.exist?(($hdrdir = RbConfig::CONFIG["rubyhdrdir"]) + "/ruby/ruby.h")
    $topdir = $hdrdir
    $top_srcdir = $hdrdir
    $arch_hdrdir = RbConfig::CONFIG["rubyarchhdrdir"]
  elsif File.exist?(($hdrdir = ($top_srcdir ||= topdir) + "/include")  + "/ruby.h")
    $topdir ||= RbConfig::CONFIG["topdir"]
    $arch_hdrdir = "$(extout)/include/$(arch)"
  else
    abort <<MESSAGE
mkmf.rb can't find header files for ruby at #{$hdrdir}/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.
MESSAGE
  end

RbConfig::CONFIG["rubyarchhdrdir"] RbConfig::CONFIG["topdir"] あたりがキモのようだ。

このキーワードでぐぐると

こんなページが出てきた。

$ ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0
ruby            ruby.h          universal-darwin19

お、ちゃんと ruby.h あるじゃん?

ってことはいけるんじゃね?

あらためてdocker-syncしてみる

$ docker-sync start
          ok  Starting unison for sync panel-workspace-sync

あ、動いたw

まとめ

  • docker-syncをインストールしなおす
  • Xcode 11 + コマンドラインツール 11にする

で解決したのかなぁ・・・

(どこが解決ポイントだったのかは自分でもわかっていない)