bar_1

contents_map

2014年5月19日月曜日

brew のバージョンに関する部分のソースを読んでみた

前回の記事 を書くにあたって CLT のバージョンの調べ方について調査し、パッケージ管理ツールのひとつである Homebrew による CLT バージョンの取得方法について、github のソースを探索したときのログです。
String#[/re/], extend を使ったモジュールのメソッド定義、定数のエイリアスといった、ちょっとおもしろい記述方法を見つけました。



解析ログ


brew --config コマンドがどのように CLT のバージョンを調べているのか、調査する。
(CLT には、standalone と Xcode のふたつのバージョンがある。?)
そこで com.apple.pkg.DeveloperToolsCLI で検索すると、下記が見つかる:
GitHub にある Homebrew のコードからだと、Library/Homebrew/os/mac/xcode.rb あたりかな:
      def detect_version
[MAVERICKS_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID].find do |id|
version = MacOS.pkgutil_info(id)[/version: (.+)$/, 1]
return version if version
end
end
パッケージ ID を幾つか指定して調べてるわけか。
モジュール・メソッドの (Mac|MacOS).pkgutil_info は、Library/Homebrew/os/mac.rb の l. 238 にある:
    def pkgutil_info(id)
(@pkginfo ||= {}).fetch(id) do |key|
@pkginfo[key] = `/usr/sbin/pkgutil --pkg-info "#{key}" 2>/dev/null`.strip
end
end
ふむ。というか、String#[/re/] なんてメソッドがあるんだねぇ……。 String#slice とか String#scan と似たようなもんか。
あと、Homebrew のソース見てて思ったことは:
>> module Foo
>>   extend self
>>   def bar; puts "yada"; end
>> end
=> nil
>> Foo.bar
yada
=> nil
>> Foo.singleton_methods
=> [:bar]
>> Foo.instance_methods
=> [:bar]
こんな書き方ができるわけ。へー。いままで、def self.bar とか、もっとまわりくどい書き方してました。そうすると、module_function って、要らなくないかw?
この定数の定義の仕方もおもしろい:
>> module Foo
>>   module Bar
>>     extend self
>>     ::FooBar = self
>>     def gar; puts "garrr"; end
>>   end
>> end
=> nil
>> Foo::Bar.gar
garrr
=> nil
>> FooBar.gar
garrr
=> nil
Foo::Bar の階層化された定数のエイリアスを作れるわけだね。ということは、当然こういう書き方も……
>> G=Foo::Bar
=> Foo::Bar
>> G.gar
garrr
=> nil
おお。できた。

0 件のコメント:

コメントを投稿

何かありましたら、どうぞ: