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

## まえおき

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

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

ちなみに、[次のMacバージョンからそもそもRubyが付属しなくなるという噂](https://applech2.com/archives/20190606-apple-deprecations-python-ruby-perl.html) もあるので、この記事の賞味期限はきっとかなり短いだろう。

## 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 --install` → `xcodebuild ...` を叩くだけではXcode11にはならない。

![e9070a00-c7ec-49d4-a082-c59e7128ec69.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/ecf7194d-bfb8-baed-59ef-96764926595a.jpeg)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/733155e2-40e3-836c-c132-03ee1622821e.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/55a5b8e0-b28e-2bde-e84a-b8eab68862b9.png)


11になったことを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/25505a9b-89bd-cb4e-f58e-f56e139fe107.png)

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

```
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"]` あたりがキモのようだ。

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

https://www.programqa.com/question/20559255/

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

```
$ 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
```

あ、動いたｗ

## まとめ

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

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

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