File.realpath (㨠File.realdirpath) ã‚’æä¾›ã™ã‚‹ã®ã¯ã©ã†ã§ã—ょã†ã‹ã€‚
require_relative を呼ã³å‡ºã—ãŸãƒ•ァイルをシンボリックリンクを通ã—ã¦
指定ã—ãŸã¨ãã€å®Ÿä½“ã®ãƒ•ァイルã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã§ãªã„ライブラリを
ãƒãƒ¼ãƒ‰ã—ã¦ã—ã¾ã†ã“ã¨ãŒã‚りã¾ã™ã€‚
% ls -l a b
a:
total 8
-rw-r–r-- 1 akr akr 13 Jan 12 01:08 lib.rb
-rw-r–r-- 1 akr akr 23 Jan 12 01:08 tst.rb
b:
total 4
-rw-r–r-- 1 akr akr 13 Jan 12 01:08 lib.rb
lrwxrwxrwx 1 akr akr 11 Jan 12 01:08 tst.rb -> …/a/tst.rb
% cat a/tst.rb
require_relative “lib”
% cat a/lib.rb
p “a/lib.rb”
% cat b/lib.rb
p “b/lib.rb”
% ./ruby a/tst.rb
“a/lib.rb”
% ./ruby b/tst.rb
“b/lib.rb”
ã¤ã¾ã‚Šã€a/tst.rb 㯠a/lib.rb ã‚’ãƒãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ã‚’期待ã—ã¦
require_relative を使ã£ã¦ã„ã‚‹ã®ã«
b/tst.rb ã¨ã„ã†ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯çµŒç”±ã§å®Ÿè¡Œã—ãŸæ™‚ã¯ã€b/lib.rb ã‚’
ãƒãƒ¼ãƒ‰ã—ã¦ã—ã¾ã„ã¾ã™ã€‚
ã“れを防ãã«ã¯ require_relative 内ã§å‘¼ã³å‡ºã—ãŸãƒ•ァイルã®ãƒ‘スåã®
シンボリックリンクを解決ã™ã‚Œã°ã„ã„ã®ã§ã™ãŒã€
ã“れを行ã†ãƒ¡ã‚½ãƒƒãƒ‰ã¯çµ„ã¿è¾¼ã¿ã«ã¯ã‚りã¾ã›ã‚“。
ãã“ã§ã€pathname.rb ã® Pathname#realpath ã‚’ C ã§æ›¸ãç›´ã—ã¦
File.realpath を実装ã—ã¦ã¿ã¾ã—ãŸã€‚
(ä»–ã® File ã®ãƒ‘スåã‚’æ“作ã™ã‚‹ã‚¯ãƒ©ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰åŒæ§˜ã€
æ–‡å—列をå—ã‘å–ã£ã¦æ–‡å—列を返ã—ã¾ã™ã€‚)
(ãªãŠ C ã® realpath ã¯ãƒãƒƒãƒ•ã‚¡ã®å¤§ãã•を指定ã§ããªã„å±é™ºãªé–¢æ•°ãªã®ã§ç¦æ¢ã§ã™)
ã¾ãŸã€Pathname#realpath ã¨å®Ÿè£…ãŒå…±æœ‰ã•れã¦ã„ã‚‹ Pathname#realdirpath ã‚‚
File.realdirpath ã¨ã—ã¦æä¾›ã—ã¦ã‚りã¾ã™ã€‚
ã§ã€require_relative ã§ File.realpath を使ã£ã¦ã€b/tst.rb を実行ã—ãŸå ´åˆã§ã‚‚
a/lib.rb ã‚’ãƒãƒ¼ãƒ‰ã™ã‚‹ã‚ˆã†ã«
ã—ã¦ã¿ã¾ã—ãŸã€‚
% ./ruby a/tst.rb
“a/lib.rb”
% ./ruby b/tst.rb
“a/lib.rb”
ã©ã†ã§ã—ょã†?