[解決済み] File.expand_path("../../Gemfile", __FILE__) これはどのように機能するのでしょうか?ファイルはどこにあるのでしょうか?
質問
ENV["BUNDLE_GEMFILE"] = File.expand_path("../../Gemfile", __FILE__)
私はいくつかのディレクトリから.rbファイルにアクセスしようとしているだけで、チュートリアルはこのコードを使うように言っていますが、どのようにgemファイルを見つけるのかがわかりません。
どのように解決するのですか?
File.expand_path('../../Gemfile', __FILE__)
は、現在のファイルからの相対パスがわかっているときに、そのファイルへの絶対パスを取得するための、やや醜いRubyのイディオムです。別の書き方はこうです。
File.expand_path('../Gemfile', File.dirname(__FILE__))
はどちらも醜いですが、最初の variant の方が短いです。しかし、最初のバリエーションは、コツをつかむまでは非常に直感的ではありません。なぜ余分な
..
? (が必要なのか(しかし、2つ目のバリエーションはそれがなぜ必要なのかについての手がかりを与えるかもしれません)。
このように
File.expand_path
は、第一引数の絶対パスと第二引数(デフォルトは現在の作業ディレクトリ)からの相対パスを返します。
__FILE__
はコードが存在するファイルへのパスです。この場合、第2引数はファイルへのパスであり
File.expand_path
はディレクトリを想定しているので、余計な
..
を追加しなければなりません。これがその方法です。
File.expand_path
は基本的にこのように実装されています (以下のコードでは
path
の値を持つことになります。
../../Gemfile
と
relative_to
の値を持つことになります。
/path/to/file.rb
):
def File.expand_path(path, relative_to=Dir.getwd)
# first the two arguments are concatenated, with the second argument first
absolute_path = File.join(relative_to, path)
while absolute_path.include?('..')
# remove the first occurrence of /<something>/..
absolute_path = absolute_path.sub(%r{/[^/]+/\.\.}, '')
end
absolute_path
end
(もう少しだけ、展開される
~
をホームディレクトリに展開するなど -- 上記のコードには他にもいくつか問題があると思われます)
上のコードの呼び出しをステップスルーする
absolute_path
は最初に値を取得します。
/path/to/file.rb/../../Gemfile
を取得し、ループ内の各ラウンドで最初の
..
はその前のパスコンポーネントと一緒に削除されます。最初の
/file.rb/..
が削除され、次のラウンドで
/to/..
が削除され、次のラウンドでは
/path/Gemfile
.
長い話を短くすると
File.expand_path('../../Gemfile', __FILE__)
は、現在のファイルからの相対パスがわかっているときに、 ファイルの絶対パスを取得するためのトリックです。このために
..
を追加することで、相対パス中のファイル名が
__FILE__
.
Ruby 2.0では
Kernel
という関数があります。
__dir__
として実装されている
File.dirname(File.realpath(__FILE__))
.
関連
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] mysql2 のインストールに失敗しました。gem ネイティブエクステンションのビルドに失敗しました
-
[解決済み] 実行時にメソッドが定義されている場所を見つけるには?
-
[解決済み】Ruby: Gemfileの「require: false」はどういう意味ですか?
-
[解決済み】RSpecで単一のテスト/仕様ファイルを実行するにはどうすればよいですか?
-
[解決済み】bundlerで1つだけgemをアップデートする。
-
[解決済み】Rubyでファイルの行を読み込む方法
-
[解決済み] Ruby: 文字列の最初の文字を取得する方法
-
[解決済み] RubyでCtrl-cをキャプチャする
-
[解決済み] Gemfile が古いバージョンの bundler を要求している場合、どのように `bundle install` するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Rubyの__FILE__の意味は何ですか?
-
[解決済み] Rubyの継承とミキシンの比較
-
[解決済み] Ruby: HTTP でファイルを multipart/form-data で投稿するには?
-
[解決済み] RubyでDateTimeの時間部分を設定する
-
[解決済み] Rubyで本当に安いコマンドラインオプションのパース
-
[解決済み] Ruby の文字列から最後の n 文字を抽出する。
-
[解決済み] Ruby で改行せずに印刷する方法
-
[解決済み] メソッドから2つ以上の値を返す
-
[解決済み] Rubyで、selectとmapを組み合わせたArrayメソッドはありますか?
-
[解決済み] ファイルに新しい行を追加しますか?