記事のサマリ
windowsで開発をやっている場合に、シンボリックリンクを利用したいことがあるかと思います。しかし、VCSにシンボリックリンクをコミットした場合、リンク自体をコミットすることができません。なので、シンボリックを作成するwindowsバッチをコミットしてなんとかしようという、代替案です。(あまり綺麗ではないかもしれません。。。)
シンボリックリンクとは
linux系のユーザの方は、シンボリックリンクという言葉を聞いたことがあったり、実際にバリバリつかっているよって方が多いものと思います。
ファイルやディレクトリの実体とは別に、同じ名前や違う名前でリンクを貼ることができ、あたかもそこにあるかのようにアクセスすることが可能です。
windowsでは、昔からショートカットという機能があり、似たように使えたのですが、ショートカットは単純に参照先の情報が書かれたファイルでしかないため、透過的に利用することはできませんでした。ところが、windowsでもvista以降ではシンボリックを作成することができるようになりました。この機能を利用することで、ある場所から別の場所にあるファイルやディレクトリを透過的にアクセスすることが可能になります。
詳しくは、以下wikipediaの記事がわかりやすかったです。
wikipedia:ソフトリンク
windowsにおけるシンボリックリンクの作り方は?
windowsでは、管理者権限で起動したコマンドプロンプト上からmklinkコマンドを実行することで、シンボリックリンクを作成することができます。
ファイル・ディレクトリでコマンドが若干異なるのですが、以下のようにシンボリックリンクを作成することができます。
mklink [link_name] [target_dir]
mklink /D [link_name] [target_dir]
ちなみに、target_dirは、相対パスでも絶対パスでも良いようです。さらに、大文字・小文字は区別されないようですね。(windows7で実験しています。)
もし、以下ののような、上位階層にjava・webappというディレクトリ。webapp配下にWEB-INFというディレクトリがあり、webappがカレントディレクトリであった場合の具体例を示します。
c\tmp┓
┣java
┃
┗webapp(カレントディレクトリ)
┃
┗WEB-INF
この場合
「link」という名前のシンボリックリンクをc:\tmp直下に作成し、「java」フォルダに向けて貼る場合
絶対パスで指定する場合
mklink /D c:\tmp\link c:\tmp\java
※「mklink /D c:\tmp\link c:\Tmp\JaVa」でも同じ結果になります
相対パスで作成する場合
mklink /D ..\link java
注:javaフォルダの指定が、..\javaになっていない点は要注意!!「mklink /D ..\link ..\java」としてしまうと、エラーにはならず、c:\javaへのシンボリックになってしまいます。
windowsのシンボリックリンクをsvnやgitにコミットできるか??
windows用のシンボリックリンクを、svnやgitにコミットしようとしてみましたが、うまくいきませんでした。。。
代替策
シンボリックリンクをコミットできなかったので、自分は、シンボリックリンクを作成するwindows用の.batファイルを作成してコミットするようにしています。(もっとよい案があれば教えてください。。。)
ただ、シンボリックリンクを作成するには.batファイルを管理者権限として実行する必要があります。しかし、管理者権限で実行しようとすると、カレントディレクトリが「C:\Windows\system32」になってしまうので、最初に、.batファイル自体のあるフォルダに移動するようにしています。
rem webappに置いてあるイメージ
cd /d %~dp0
mklink /D ..\link java
pause
もっといい方法があればよいのですが、とりあえずこれを叩いてもらうことでしのいでます。。。