業務でVisual Studioで開発を行っています。
外部から受領する必要なDLLが更新される度に、必要なフォルダにコピーをしています。
しかし……
毎度毎度、自力で色々コピーするのが馬鹿らしいので、ビルド後に自動実行するようにしました。
ビルド後イベントに、robocopyを設定!
「これでOK!」と思ったのも束の間、実行してみるとrobocopyでエラーが起きているではありませんか……
なんということでしょう……
今回はこのエラーを解決してみました。
組み込んだコマンド
このようなコマンドを、ビルド後イベントに仕込みました。
ROBOCOPY "$(ProjectDir)BIN\$(Configuration)" "$(SolutionDir)$(Configuration)" *.dll
ちなみにビルド後に実行するコマンドは、下記から設定可能です。
- プロジェクト→プロパティ を選択
- 構成プロパティ→ビルドイベント→ビルド後イベント を選択
- コマンドライン を入力
発生したエラー
このようなエラーが発生しました。
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: コマンド "ROBOCOPY C:\work\app\BIN\Debug C:\work\app\Debug *.dll 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: :VCEnd" はコード 1 で終了しました。
なぜかコピーされなかったときは発生しない……
修正(追加)したコマンド
robocopy実行後に、戻り値をチェックするif文を追加しました。
ROBOCOPY "$(ProjectDir)BIN\$(Configuration)" "$(SolutionDir)$(Configuration)" *.dll IF %ERRORLEVEL% LSS 8 EXIT 0
コチラを参考にしました。
ありがとうございます。
どうやら、robocopyの戻り値と、Visual Studioが「正常」と判断する戻り値が違うために起きている問題のようです。
robocopyの戻り値
robocopyの戻り値について、コチラに記載されたものを、見やすく一覧化しました。
16進 | 10進 | セットされている場合の意味 |
---|---|---|
0x10 | 16 | 重大なエラー。Robocopyは,ファイルをひとつもコピーしませんでした。これは,使用法の間違いか転送元または転送先ディレクトリへのアクセス権が不十分なために発生するエラーです。 |
0x08 | 8 | いくつかのファイルまたはディレクトリがコピーできませんでした(コピーエラーが発生し,リトライ上限を上回りました)。以降のエラーをチェックしてください。 |
0x04 | 4 | いくつかMismatchedファイルまたはディレクトリがみつかりました。ログを調べてください。多分掃除が必要です。 |
0x02 | 2 | いくつかのExtraファイルまたはディレクトリがみつかりました。出力ログを調べてください。掃除が必要かもしれません。 |
0x01 | 1 | 一つ以上のファイルが,うまくコピーされました(つまり新しいファイルは転送先に届きました)。 |
0x00 | 0 | エラーは発生せず,コピーもされませんでした。転送元と転送先ディレクトリツリーは,完全に同期しています。 |
8より小さい値であれば、特に問題なさそうなので
IF %ERRORLEVEL% LSS 8
としてあったと思われます。
なのでそのまま追加しました。
0は「エラーなし、コピーなし」の状態だったので、コピーされなかったときは発生しなかったんですね。
なるほど。
あとがき
思わぬところでエラー扱いされたため焦りましたが、別にエラーだった訳ではないので良かったです(笑)
このようなコマンド毎のエラー解釈には注意が必要かもしれませんが、設定すると作業が楽できます。
是非ご活用を!