こんにちわlisです!
Visual Studioでビルド後に「必要なファイルをコピーし忘れた……」なんて時ありませんか?
今回は、ビルド時に必要なファイルを自動コピーする設定についてです!
設定する項目
下記を選択していき、設定を開きます。
メニュー→プロジェクト→プロパティを開きます。
構成プロパティ→ビルド イベント→ビルド後のイベントを選択。
ちなみに
- ビルド前のイベント
- リンク前のイベント
- ビルド後のイベント
はそれぞれ書いてあるとおりのタイミングで実行されます。
どれでも問題ないですが
「コピーが長くてビルド結果見るまで時間かかる……」
とかなるとウザイので、ビルド後がおすすめです。
設定ー!……する前に構成変更
さて設定!と行きたいところですが、先に「構成」を変更しておきます。
Visual StudioはデフォルトだとDebug/Releaseの2種類の構成があると思います。
どちらも同じ動作をさせたい場合は、構成を「すべての構成」に変更しておきましょう。
この「構成」というところで選択されているものだけ設定が適用されます。
- DebugもReleaseも設定したい: すべての構成
- Debugのみ設定したい: Debug
- Releaseのみ設定したい: Release
と変更してあげましょう。
とはいえ、もし
「両方やりたかったのにDebugで設定しちゃった!」
となっても、ReleaseにDebugで設定した内容をコピペすればOKです。
今回設定する箇所は少ないので、順番に設定していってもコストは低いです。
編集する箇所
ここで編集するのが
- コマンドライン
- 説明
の2つです。
「説明」について
まずは「説明」についてです。
その名の通り、任意の説明を入力します。
今回は必要なファイルがない場合、exeのあるフォルダにコピーしたいので
必要ファイルが存在しない場合コピー
のように記入しました。
わかれば何でもいいし、不親切ではありますが書かなくても大丈夫です。
「コマンドライン」について
コマンドラインにはビルド完了後に実行したいコマンドを記述します。
今回の場合「robocopy」でコピーするコマンドを入力します。
プルダウンメニューから「<編集...>」を選択して、コマンドを入力していきます。
編集を開かずに直接書いてもいいのですが、見づらいので編集を開くことをおすすめします。
robocopyでファイルをコピー
robocopyはざっくりいうと、高機能なcopyコマンドです。
例えば
robocopy <コピー元フォルダ> <コピー先フォルダ> *.dll /xo /E /COPY:DT
のように書けば、コピー元フォルダからコピー先フォルダへ、更新されているDLLファイルをすべてコピーしてくれます。
後ろに付けているオプションは下記の通りです。
オプション | 意味合い |
---|---|
/xo | コピー元が新しかったらコピー |
/E | サブフォルダがある場合コピー |
/COPY:DT | ファイルデータ/タイムスタンプをコピー |
マクロで汎用的なコマンドにする
さてrobocopyコマンドを書くにしても
robocopy "c:\work\sample-project\resource" "c:\work\sample-project\Debug" *.csv /xo /E /COPY:DT
のように書くと、フォルダを移動したり、Git等で他の人が異なるパスにクローンしたらアウトですね。
マクロと言う機能を使って、この辺を汎用的に仕立てましょう。
マクロはVisual Studio内で管理されている値を書くことで、コマンドで利用することができる仕組みです。
例えば「$(ProjectDir)」と入力すると、コマンド実行時には「プロジェクトフォルダ」の文字列として組み込まれて実行されます。;
編集画面右下のマクロボタンを押します。
するとマクロ一覧が表示されます。
ここで使いたいマクロを探して、挿入ボタンを押せば、コマンドのエディタに挿入してくれます。
今回の例の場合、こんな感じにします。
before
robocopy "c:\work\sample-project\resource" "c:\work\sample-project\Debug" *.csv /xo /E /COPY:DT
after
robocopy "$(ProjectDir)\resource" "$(OutDir)" *.csv /xo /E /COPY:DT
このようにすることで、フォルダパスの変更に耐えられるだけでなく、Debug/Releaseどちらの構成でも対応した出力フォルダを指定してくれます。
エラーは無視する……
最後にrobocopyを実行してもらったあとに、このようなエラーが出力される場合があります。
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: コマンド "robocopy "D:\xxxxx" "D:\xxxxx\Debug\" *.dll /xo /E /COPY:DT
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073:
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: :VCEnd" はコード 16 で終了しました。
調べたところ、robocopy実行時のパスが長いと出てしまうらしいです。
しかしファイルのコピー自体は成功します。
なのでちょっと気持ち悪いですが、無視してもOKそうです。
参考
コチラを参考にしました。ありがとうございました!
あとがき
Visual Studioビルド時に必要ファイルを自動コピーする設定でした!
最近Pythonばかりイジっていたので久々のVisual Studioでした。
さすがに久しぶりに使うと、ちょいちょい忘れている箇所がありますね……
コピーだけでなく、色々使いようはあると思うので、よければ参考にしてみてください!