2013-09-24 12 views
6

スクリプトがディレクトリにアクセスする必要があるとしましょう。たとえば、「任意」のOSで/some/where/abcと入力します。 Rubyでパスを構築するためのカップルのオプションがあります。Rubyで移植可能な絶対パスを構築するには?

  • File.join('', 'some', 'where', 'abc')
  • File.absolute_path("some#{File::SEPARATOR}where#{File::SEPARATOR}abc", File::SEPARATOR)
  • 標準APIでPathname

私は最初のソリューションは、十分に明確ますが、慣用的であると考えています。私の経験では、いくつかのコードレビューは、絶対パスを構築するためのより良い方法は、より良い手段が「ないルビー、そこです

質問

...それが何をするかを説明するコメントを求めます仕事と話すこと自体 "?

+2

コードレビューでドキュメントをリンクするだけです。明示的に "File :: SEPARATORを使用して文字列を結合することによって形成された新しい文字列を返します。 'File#join'は移植可能なパスを生成する通常の方法です。 –

+1

「任意のOS」が意味することに応じて、文字列リテラルとしての「tmp/abc /」はLinux、Mac、Windows上の有効なパスです。 –

+0

ドキュメント、またはコメントとしての意図したパスだけがうまく機能します。 Rubyで隠された、または忘れられた呪文を見つけようとするだけです。 –

答えて

3

私がコードレビューをしていたら、/tmpは必ずしも一時的なディレクトリを作成するのに最適な場所ではなく、初期の'',引数は、 <nothing>/tmp/abc。したがって、私はこのコードをお勧めします:

File.join(Dir.tmpdir(), 'abc') 

を参照してください。

UPDATE

我々はtmpdir()を使用して関与しないより汎用的なソリューションに問題を展開すると、私は最初の''イディオムを使用してラウンドする方法を見ることができません(ハック?)。 Linuxではこれはあまり問題にはならないかもしれませんが、複数のドライブ文字を持つWindowsでは問題ありません。さらに、マウントポイントを反復するためのRuby APIまたはgemがないようです。

したがって、私の推薦はFile.join(ProjectConfig::MOUNT_POINT, 'some', 'where', 'abc')を使用し、その後、Linux用'/'、Windows用'z:/'、およびSambaの共有のためのsmb://domain;[email protected]/mountpointかもしれない設定オプションにマウントポイントの定義を委任することです。

+0

tmpdirの良いキャッチ。これはさらに移植性が高く、意図をよりよく反映します。 +1 –

+0

この提案をありがとう。私の特別な問題に対処するのに優れています。私はまだ質問に回答していません。誰かが一般的な問題の良いアイデアを持っているかどうかを見てみましょう( '/ tmp'が予期しない方法で問題を引き起こしていることを認識しました)。 –

+1

@エリック私はあなたが質問をreworded参照してください!私は思考と周りを見てきました。そして、私を最も不快なものにする一般的な解決策、すなわち先導的な解決策を見ることはできません。おそらく、マウントポイントを反復する一般的な方法はないでしょう。たとえば、Windowsの場合は 'c:/'を、Linuxの場合はSambaのマウントポイントなどです。マウントポイント定義を設定オプションに委任することは、 File.join(ProjectConfig :: MOUNT_POINT、 'foo'、 'bar') '? –

2

File#joinは、Rubyでポータブルパスを構築する標準的な方法です。私は誰がレビューをしているのだろうかと思っています。おそらくRubyはあなたの組織にとって新しいものです。

私は@ChrisHealdに同意します。これは、ドキュメントを参照することが、レビュー担当者にコードを説明する最も良い方法です。

+0

ありがとうございます。私は今までのすべてのコメントに同意しています。 File#joinは私の好みのアプローチですが、イディオムに依存しています。問題は実際には(もしあれば)この問題に対処するためのよりよい方法を「披露する」ことです。このレビューは何が起こるかを説明するための設定に過ぎません。 –

関連する問題