Help us understand the problem. What is going on with this article?

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にはならない。

e9070a00-c7ec-49d4-a082-c59e7128ec69.jpg

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

image.png

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

image.png

11になったことを確認。

image.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

あ、動いたw

まとめ

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした