稲枝の押入れ

いなえが適当なことを書いては、しまっておく場所

VisualStudioでプロジェクトのファイル名等を変える



!!!!注意!!!!

この記事は僕が自己の備忘録も兼ねて書いたものです。自分はプロでもなんでもないのでおそらく間違いもあると思います。 そのため、この記事に基づいてリネームをしようという場合、必ずソリューションフォルダをバックアップしておいてください。 また、ここに書いてあることを元に何かをして何かが起きても僕は一切の責任を取りません。誤りは無いように努力してはいますが、過信せず自分でも調べたり考えたりしながらお読みください。 また、Gitなどのバージョン管理を使っている方はリネームでフォルダの名前を変えたりもするのでで少し面倒な事になるかもしれませんが、そこも自己責任でお願いします。まあ手動で直せる範囲だとは思いますが。 また、間違った点については指摘をくださると、僕も勉強になるので助かります。



前提

出展

この記事はいなえがQiitaに上げた記事があまりにもわかりにくかった為、加筆修正を加えて再編成したものです。

例を持ち出す際に想定されるファイル構成

※拡張子の書いていないものはフォルダ

  • Project
    • RPG(ソリューションフォルダ)
      • RPG.sln
      • RPG.sdf
      • RPG.suo
      • RPG(プロジェクトフォルダ)
        • RPG.opensdf
        • RPG.sdf
        • RPG.vcxproj
        • RPG.vcxproj.filters
        • RPG.vcxproj.user
        • RPG.suo
        • (その他略)
      • (その他略)
    • (その他略)

そもそも何をしたいのか

目的

あるソリューションにおいて、

  1. ソリューション名とプロジェクト名
  2. フォルダ名とファイル名

のそれぞれを新しいものに変更することを目指します。

理由

現行の名前と以前の名前が混在していると統一感がなく混乱を招き得るので。

やり方

簡潔なまとめ

以下長々と色々書いていくのですが、自分で読んでも読むのが辛い駄文ゆえ、簡潔に手順をまとめておこうと思います。

  1. VisualStudioのソリューションエクスプローラーでソリューション名とプロジェクト名を変更する。
  2. 保存してVisualStudioを落とす
  3. .slnファイル(ソリューションファイル)をテキストエディタで開いて、プロジェクトフォルダと.vcxprojファイルへの関連付けを変更する
  4. ソリューションフォルダやプロジェクトフォルダをはじめ、拡張子が
    • .vcxproj.filters
    • .suo
    • .sdf
    • .opensdf
    • .vcxproj.user などのファイルを含め、すべてのファイル名を変更する。

ここでの「変更する」とは「現行の名前から新しい名前に書き換える」ということです。

ソリューション名とプロジェクト名の変更

VisualStudio(以下VS)ではソリューション名やプロジェクト名を変更する際、ソリュションエクスプローラで名前の変更をすれば簡単にそれらの名前を変更することが出来ます。ソリューション名とプロジェクト名の変更についてはこれで終了です。

ここで注意したいのは、ソリューションエクスプローラソリューションの名前を変更すると、拡張子が".sln"のファイル(ソリューションファイル)の名前が変更されることです。これとは反対に、プロジェクトの名前を変更しても、.vcxprojファイルの中に記されたプロジェクトファイルへの関連付けが変わるのみ*1で、ソリューションファイルの名前以外、どのファイル・フォルダの名前も変わりません。

フォルダ名とファイル名

上記変更はあくまでVS上で扱うソリューション名やプロジェクト名の変更でしかなく、(ソリューションファイルの変更を除き)それらのあるフォルダやファイルの名前は変更されません。 それが何か悪いの?という話になるのですが、次の場合を見てみてください。

例えば仮にRPGゲームを作ろう!!とC:\Users\you\Documents\Visual Studio 2015\Projects\RPGというソリューションを作り、開発を始めるとします。具体的にはその中のRPGプロジェクトを進めていくことになるのでしょうが、開発が進むに連れてタイトルが決まったりすると思います。ここでは「おさげ少女と勇者の大冒険」という名前に決まったとしましょう。そこで、このタイトルに合わせてせっかくだからソリューション名やプロジェクト名も「OsageRPG」に変えてしまおう!となったとします。

VS上でソリューション名やプロジェクト名を変えても、ファイル名の変更は"RPG.sln"が"OsageRPG.sln"に変わるだけで(隠しファイルの中などどうも実は一部変わっているっぽいが)その他には変化はありません。

そうすると、VS上はプロジェクト名やソリューション名は"OsageRPG"になっているのに、ディレクトリ上は殆どがRPGの名前のままで(しかもソリューションファイル名だけ"OsageRPG.sln"!!)統一性がなく、不格好なだけでなく混乱の元になりかねません。

※此処から先ではとりあえずVS上でソリューション名やプロジェクト名をVSから変更していない状態(=ソリューションファイル名が"RPG.sln"のままの状態)であるとして話を進めます

じゃあ直接エクスプローラーやらでフォルダ名やファイル名を変えてやればいいじゃないか

と思うでしょうがそう上手くは行きません。Project直下のRPGディレクトリに関しては問題無いでしょうが、"Project\RPG\RPG"(つまりはソリューションフォルダ直下のプロジェクトフォルダ)の名称をエクスプローラーで直接"Project\RPG\OsageRPG"変えてやったとしましょう。すると、フォルダ名を覚えている"RPG.sln"が「"Project\RPG\RPG"を探してるんだけど無いな。このソリューションおかしいぞ?」と"Project\RPG\OsageRPG"を見つけ出せずエラーを出します。

これをなんとかして解決して、このソリューションフォルダの中のファイル名の"RPG"となっている部分を"OsageRPG"何とか変更できないか、というのが今回の一番大事なお話です。

早い話の結論

グーグル先生は偉大

こういうことはやはり他の誰かもしたがっているもので、当然情報が転がっていました。

まず"RPG.sln"が探そうとするプロジェクトファイルを"Project\RPG\RPG"ではなく"Project\RPG\OsageRPG"に書き換えてやれば、エクスプローラーでプロジェクトフォルダの名前を変えてやっても問題なさそうです。そこで、RPG.slnテキストエディタで開きます。

すると、

Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RPG", "RPG\RPG.vcxproj", "{BE0A076E-539C-40BE-977E-7125AEEECEE7}" EndProject

と書いてある部分があると思います。

これを

Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OsageRPG", "OsageRPG\RPG.vcxproj", "{BE0A076E-539C-40BE-977E-7125AEEECEE7}" EndProject

と書き換えてやればプロジェクトフォルダの名前をエクスプローラーで"OsageRPG"に変更しても"RPG.sln"がちゃんと見つけてくれるようになります。(実は一つ目の" "内に書かれている名前はどうもVSが内部的に使っている名前のようなので、変えなくても見つけてはくれるみたいです。気になるので変更しましたが。)

でもまだ前の名前のままのところもあるよね?

気になりません?

フォルダ名のみを変えたいという人は上の部分までで終わりです。でもきっと、「まだ"OsageRPG"になってないところがあるじゃないか!!」と気になってしまう人もいると思います。例えば"Project\RPG\OsageRPG"直下にある"RPG.vcxproj"や"RPG.vcxproj.filters"など…

ではこいつらもおさげにしてやりましょう!!("OsageRPG"にリネームしよう、の意)

おさげだ!

VS上で既にソリューション名を"OsageRPG"にしている場合、.slnファイルは既におさげになっているでしょう。よってその他の、さっき例に上がった、"Project\RPG\OsageRPG"直下にある"RPG.vcxproj"等をリネームしていきましょう。

どうせこうするんでしょ?

お察しの方も多いかと思いますが、こいつも単に"OsageRPG.vcxproj"などとエクスプローラーでリネームしてしまうと、エラーが出ます。ではどうすればいいのか?これも気付いている方もいらっしゃるかと思いますが、もう一度"OsageRPG.sln"をテキストエディタで書き換えます。

ここまでで

Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OsageRPG", "OsageRPG\RPG.vcxproj", "{BE0A076E-539C-40BE-977E-7125AEEECEE7}" EndProject

上記の様になっているかと思いますが、これを

Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OsageRPG", "OsageRPG\OsageRPG.vcxproj", "{BE0A076E-539C-40BE-977E-7125AEEECEE7}" EndProject

のように書き換えます。その後、"Project\RPG\OsageRPG"直下にある"RPG.vcxproj"を"OsageRPG.vcxproj"にエクスプローラーでリネームすればOKです。

やったぜ!!

と言いたいところですが、これでVSを起動すると、VS上でソースコードをフォルダ分け等をして整理して管理していた情報等は失われソースコードが整理もされずにプロジェクト内に入った状態になります。これをもう一度フォルダ分けしていったりするのは、正直面倒ですよね…

しかし大丈夫

"Project\RPG\OsageRPG"直下にある"RPG.vcxproj.filters"がこのフォルダ分けなどの情報を持っているのでこいつを"OsageRPG.vcxproj.filters"とリネームしてやればVS上では今までどおりの状態に戻ります。

仕上げ

残党狩り

さて、大体のリネームは終わりましたが、一部まだおさげになっていないファイルたちがいると思います。そいつらもおさげにしてやりましょう。

ソリューションフォルダ

Projectフォルダ直下のソリューションフォルダは普通にリネームしても構いません。ここまで"RPG"のままにしていたのは説明で混乱を避けるためでした。

ソリューションフォルダ直下

おそらく.suo.sdfという拡張子のファイルが未だにリネームがされていないと思います。

.suoは「ソリューションユーザーオプション」の略で、VSで行ったブレークポイントなどのユーザーレベルのカスタマイズ情報を持っています

.sdfインテリセンス用のキャッシュDBファイルです。おそらく「ソリューションデータベースファイル」とかその辺の略じゃないでしょうか。
.sdfは放っておいて開発していても自動で何処かのタイミングでリネーム後の名前のものが生成されると思いますが、何にしてもどちらもエクスプローラーでリネームして構いません。

プロジェクトフォルダ直下

.opensdfがリネームされていないかと思いますがこれもリネームして構いません。
.vcxproj.userもリネームされていないかと思いますが、これはデバッグと配置の設定などのユーザー固有のプロパティが格納されたもので、特定のユーザーのすべてのプロジェクトに適用されます。これもリネームして構いません。

おしまい!

おそらくこれですべてのリネームが完了したでしょう。お疲れ様でした。.exe等は残ってるかもしれませんがその辺りは当然わかると思いますので自分でお願いします。

余談

リネームソフト

ここまで手動でのリネームの仕方を書いておいてなんですが、名前を指定したら自動でリネームしてくれるVisual Studio Project Renamerというソフトが既にあるそうです。 僕は使ったことがないのでよくわかりませんが、おそらくこのソフトを使ったほうが楽でしょう。使ってみて良かったら教えて下さい。

namespaceは変更されていない?

.vcxprojファイルをテキストエディタで開いてみると<RootNamespace>タグで囲まれた部分が旧名称のままになっています。ここを手動で書き換えて良いのかは調べてもよくわからなかったのですが、気になる人は試してみても良いかもしれません。名前からするにrootnamespaceの設定だろうので問題は無いとは思うのですが…

参考文献

http://d.hatena.ne.jp/oira3ryu/20110828/1314518629

https://blogs.msdn.microsoft.com/vcblog/2010/03/09/intellisensebrowsing-options-in-vc-2010/

https://msdn.microsoft.com/ja-jp/library/xhkhh4zs.aspx

https://msdn.microsoft.com/ja-jp/library/ee862524.aspx

http://stackoverflow.com/questions/12188975/how-to-rename-the-name-of-project-in-vs2010

*1:.vcxprojファイル内のタグで囲まれた部分が変わる