私はこのトピックに何度か混乱し、噛み付いてきました。多くのベスト プラクティスの記事と定義を調べましたが、パスが正確に定義されていないように思われ、絶対パスと相対パスはコンテキストによって大きく異なるようです。
質問の短いバージョン: コード内の絶対パスを常に持ち歩く (そして変換する) ? ただし、常に相対的なものとして記述してください。
愛好家として、私はバックエンドとフロントエンドを同時に作業しているため、常にコンテキストを切り替えており、パスが関係している場合に一貫性を保ち、移植可能なコードを作成するためのルールを考え出していません。
本質的に、パスの種類があるようです。絶対パスと相対パス。しかし、私は常にAbsolute Relative Pathと呼ばれる 3 番目のタイプに出くわします。私にとっての課題は、どれを保存する必要があり、どのような合併症が発生する可能性があるかを知ることです.
これは絶対パスです:
/home/me/css/style.css
しかし、Windows ではありません。上記はWindowsで何をしますか?それはこれでなければなりません:
C:/home/me/css/style.css
Linux で機能する絶対パスが、Windows を使用して参照するものは、まったく別のものです。現在のパーティションに対して相対的になります。
/home/me/css/style.css
になる
C:/home/me/css/style.css
この場合は正しいですが、実際のアプリケーションが別のパーティションで実行されている場合は正しくない可能性があります。したがって、移植性が必要な場合、「Unix スタイル」の絶対パスを使用するのは問題があります。
これはディレクトリへの絶対パスです:
/home/me/css/
ただし、これはディレクトリへの絶対パスでもあります。
/home/me/css
したがって、別のスラッシュを追加することは、純粋に追加情報をライターに伝えることですよね?
これは相対パスです:
css/style.css
そしてディレクトリに:
css/
HTML ドキュメントで使用する場合、これは絶対相対パスです。
<a href="/css/style.css">Link</a>
アドレスが現在指している場所に関係なく、最上位の css ディレクトリを参照しますが、Web サーバーが配布しているディレクトリも参照します。そのため、絶対的に使用されますが、実際のファイルシステムに関しては相対的です。または、多くの場合、現在の作業ディレクトリに移動します。純粋な相対パスについても同じことが言えます。したがって、そのようなパスを作成する場合、絶対パスのように見えても、実際にはそうではないことに注意する必要があります。紛らわしい。
したがって、アプリケーション自体が別のディレクトリに移動された場合、解決策を考え出す必要があります。ここで、相対パスを保存するのは悪い考えではないかと思います。git 経由でディレクトリにダウンロードされる blogger という静的なブログ ジェネレーターを作成するとします。
/home/me/blogger
アプリケーション内のすべてのパスは相対パスであるためcreate_dir('output')
、疑似コードで に似たものを呼び出します。ここで、アプリケーションを別の場所に移動して、ユーザーが出力ディレクトリを自分で指定できるようにすることをお勧めします。突然、すべてのパス定義が壊れます。それらは になりcreate_dir(absolute($output_dir) + 'output')
ます。
この種の計算は、ある時点で非常に長く複雑になると思います。特に、テンプレートなどのように、アプリケーションに関連するファイルやディレクトリがまだいくつかある場合。しかし、将来的には移動する可能性もあるので、 のようなコードを書いていることに気づきますcopy_dir(cwd() + 'templates', absolute($output_dir) + 'output')
。
ただし、特に UNIX 系のシステムでは、現在の作業ディレクトリが必ずしもアプリケーションが存在する場所であるとは限りません。また、絶対パスがアプリケーション ディレクトリへの絶対パスか、現在のディレクトリへの絶対パスかをアプリケーションが認識していない場合、absolute はどのようにして絶対パスを生成するのでしょうか? 後者を想定する必要があるため、呼び出しabsolute()
は良い考えではなく、むしろcwd() + $output_dir
. ありがたいことcwd()
に、通常はすでに絶対パスを返します。これは、ユーザーが指定したパスが実際には相対パスである場合にのみ実行できますが、絶対パスの場合は実行できません。ありがたいことに、標準ライブラリにはこれに対処する方法がありますが、素朴なアプローチは破綻し、「C:/C:/css」のようなものになってしまいます。
ユーザーが使用できる絶対パスを提供しないと仮定します。
copy_dir(absolute(app_dir()) + 'output', cwd() + $output_dir)
それから私は自分自身に言います、ええと、これらのファイルで作業するたびにこれを行う必要があるので、一度実行して$abs_output_dir
代わりに持ち歩いてみませんか? 突然、絶対相対パスを HTML ドキュメントに出力しなければならないという問題に遭遇しました。$abs_output_dir
ユーザーが指定した相対パスになるように絶対部分を切り取る必要があるため、使用できません$output_dir
。この時点で、私の心は通常壊れてしまい、すべてのパスをハードコードするか、持ち歩き、すべてを最新の状態に保とうとし$output_dir
$abs_output_dir
ます$rel_abs_output_dir
。$abs_app_dir
そのため、相対パスまたは絶対相対パスをファイルに出力しなければならない場合を除いて、絶対パスのみを持ち歩くという考えは良い考えのようです。それはプログラマーが通常行う方法ですか?