Top > Programming > Environment > VisualStudio > BuildEventCommand
Last-modified: Mon, 08 Oct 2012 10:52:33 JST
Counter:47593 Today:3 Yesterday:28 Online:4
このエントリーをはてなブックマークに追加

ビルド イベントのコマンド操作を利用する

About

 VisualStudioでビルドを実行する際、ビルドイベントの前後に"コマンド"を実行することができる。"コマンド"とはコマンドプロンプトで実行することができる操作のことで、バッチファイルを作ったりする人にとっては既知の通り。例えば「ビルド時に、必要なファイルを特定のパスに複製・移動する」ことや「ビルド前にソースコードを一度他の実行ファイルに引き渡す」こと、「ビルド後に特定のプログラムを走らせる」ことなどができる。いちいち別のフォルダのあのプログラムを起動して…なんてことをしなくて済む。

How to

ビルドイベントの設定箇所

0.png

 ビルドイベントの設定箇所は「プロジェクトのプロパティ>ビルドイベント」と進んだ所にある。普通はソリューションエクスプローラを右クリックしてプロジェクトのプロパティを開くことになる。

 コマンドラインによる処理を、ビルド前に実行する必要がある場合は「ビルド前に実行するコマンドライン()」、ビルド後に実行する必要がある場合は「ビルド後に実行するコマンドライン」にそれぞれ記述する。また「ビルド後イベントの実行」オプションについては、適切なモノを選択する。ビルドに失敗した場合は実行しない、というのが一般的で、ビルドに失敗したのに態々無駄な処理を走らせることはない。

コマンドの構文とマクロについて

1.png

  実際にコマンドを書く際には「コマンドプロンプトを使ってみよう!」などを参考にされたい。全て説明することはできない上、私も良く知らないので内容については余所様のWeb記事をよく読むこと。「copy/remove/rename」などのファイル操作系のコマンドや「for in do」など繰り返し構文を使うことができ、さらに「*(アスタリスク)」などによるワイルドカードも利用することができる。

 コマンド操作にはファイルパスがまず間違いなく必要になる。普通ならファイルパスを律儀に書いていかなければならない。所が実際には一々全てのファイルパスを書いていたらキリがないし、長いパスなら間違える可能性も出てくる。また別の環境でビルドしたりファイルを移動する度にパスを書き換えなければならない。そこで利用するのが「マクロ」である。マクロは、主要なファイルパスなどに置換される代替文字列、とでも覚えておく。例えば「$(SolutionDir)」と書けば、プロジェクトをビルドする際に、VS側で自動的に、その環境下でのファイル(ディレクトリ)パスに置換してくれる。マクロには沢山種類があるが、幸いなことに「マクロ」ボタンを押すと一覧が出てくるので適宜利用する。

簡単なサンプルビルドイベント

 ここではサンプルとして「ビルド後に、生成した実行ファイル(exe)を、ソリューションが置かれているディレクトリに、複製する」ビルドイベントを実行してみる。 あまり実用的では無いが、最も簡単だと思われる(配布するサンプルプログラムのビルドイベントには既に書かれています)。

copy $(TargetDir)$(TargetFileName) $(SolutionDir)

 複製処理(copy)を、ターゲットディレクトリ(TargetDir)の、ターゲットファイル(TargetFileName)に対し実行し、ソリューションディレクトリ(SolutionDir)に複製します。といった具合に処理が実行される。実際に実行してみると、ソリューションファイル(sln)が置かれたディレクトリに、実行ファイルが複製されていることが分かる。

良くあるエラー

コード 9009

 エラーで「9009」が見られることがちょくちょくあった。大抵ファイルの参照エラーで生じているらしい。注意したいのは、ファイルパスに「半角スペース」が含まれる場合、「""」で囲って指定する必要がある点である(無くても囲ってしまうのが無難か)。

  • Ex.
    • ×「C:\ProgramFiles\Sample Directory\Sample.txt」
    • ○「"C:\ProgramFiles\Sample Directory\Sample.txt"」

これで解決しない場合は、ファイルのアクセス権限や、ファイルが本当に存在しているかを確認する。

コード 1

「コマンド "xxx" はコード 1 で終了しました。」といった類のエラーが起きる場合は、実行するコマンド内容(外部起動する実行ファイルの結果等)の方にエラーが生じている可能性があるので注意する。

References