Visual Studioビルド後のイベント-相対ディレクトリの場所にコピー


228

ビルドが成功したら、出力ディレクトリの内容を同じ「ベース」フォルダの下の別の場所にコピーしたいと思います。この親フォルダは相対的な部分であり、ソース管理設定に基づいて変化する可能性があります。

私が利用できるマクロ値のいくつかをリストしました...

$(SolutionDir)= D:\ GlobalDir \ Version \ AppName \ Solution1 \ build

$(ProjectDir)= D:\ GlobalDir \ Version \ AppName \ Solution1 \ Version \ ProjectA \

出力ディレクトリの内容を次のフォルダにコピーしたい:

D:\ GlobalDir \ Version \ AppName \ Solution2 \ Project \ Dependency

ベースの場所「D:\ GlobalDir \ Version \ AppName」は、上記のマクロのいずれかからフェッチする必要があります。ただし、どのマクロ値もリストしませんも親ロケーション。

ビルド後のコピーコマンドのベースの場所のみを抽出するにはどうすればよいですか?

回答:


188

TargetDirまたは他のマクロのいずれも適切な場所を指していない場合は、「..」ディレクトリを使用して、フォルダ階層を上に戻ります。

すなわち。$(SolutionDir)\..\..ベースディレクトリを取得するために使用します。


すべてのマクロのリストについては、ここを参照してください:

http://msdn.microsoft.com/en-us/library/c02as0cs.aspx


ありがとう!! 良いヒント
Merlyn007

293

以下は、プロジェクトのビルド後のイベントコマンドラインに入力するものです。

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

編集:または、ターゲット名がプロジェクト名と異なる場合。

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"

1
良いヒント。見積もりを忘れました。
Matt Montag

3
忘れてしまったのでうまくいきませんでした/Y。コマンド全体を表示していただきありがとうございます。
マーク

10
一つは使用することができるxcopyような、ソースフォルダの(木)構造を維持しながら、同様の結果を達成するために、ワイルドカードと適切なスイッチで:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Dr1Ku

4
ソース部分では$(ProjectName)ではなく$(TargetName)を使用することをお勧めします。
Alexander Schmidt

2
私の前への更新。コメント:copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\"、余分なバックスラッシュなし、$(SolutionDir)には末尾のバックスラッシュが含まれるため(少なくともVS2012では)
icy

40

あなたは試すことができます:

$(SolutionDir)..\..\

8
変数$(SolutionDir)にはすでにバックスラッシュが付いていることに注意してください。ソース:「ソリューションのディレクトリ(ドライブとパスで定義されています)、末尾にバックスラッシュ '\'が含まれています。」msdn.microsoft.com/en-us/library/42x5kfw4.aspx
スニッカー

10

これは関連していると思いますが、msbuildコマンドラインを使用して直接(バッチファイルから)ビルドする場合と、VS内からビルドする場合には問題がありました。

次のようなものを使用します:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>

(注:コピーを妨げる権限の問題を回避するために使用されるのstart XCOPYではなくXCOPY

マクロは、バッチファイルからmsbuildを実行$(SolutionDir)した..\ときに評価され、XCOPYコマンドが失敗しました。それ以外の場合は、Visual Studio内からビルドすると正常に機能しました。確認済み/verbosity:diagnostic評価された出力をためにすることをました。

$(ProjectDir)..\代わりにマクロを使用すると、同じことになりますが、両方のビルドシナリオで完全に機能し、フルパスを保持しました。


1
私がクレジットを与えるのを忘れた場合に備えて、同じハックへのクロスリンク...
drzaus

Start私のために働いた(xcopy共有フォルダで)。
AgentFire

4

msbuildを直接使用しても意味がありませんか?すべてのビルドでこれを行っている場合は、最後にmsbuildタスクを追加できますか?Visual Studio IDEに表示されていない別のマクロ値が見つからないかどうかを確認したい場合は、msbuildオプションを診断に切り替えると、使用できるすべての変数が表示されます。現在の価値だけでなく。

Visual Studioでこれをオンにするには、ツール/オプションに移動し、ツリービューを下にスクロールして[プロジェクトとソリューション]というセクションまで展開し、それを展開して[ビルドと実行]をクリックします。右側にあるドロップダウンで、ビルド出力の詳細度を指定しますを診断に設定すると、使用できる他のマクロ値が表示されます。

あなたがどのレベルになりたいのか、そしてあなたのビルドをどれほど複雑にしたいのか私にはよくわからないので、これはあなたにいくつかのアイデアを与えるかもしれません。私は最近ビルドスクリプトを実行しており、ビルドの一部としてSQLコードも実行します。さらにヘルプまたはサンプルビルドスクリプトが必要な場合はお知らせください。ただし、ビルドの最後に実行したい小さなプロセスの場合、おそらく完全なmsbuildスクリプトを実行するのは少々やりすぎです。

Rihanのお役に立てば幸い


thx Rihan、しかしどうやらVS 2003はこれをサポートしていないようです!もちろん、ビルド後のイベントにはかなり満足しています;-)
プリーツ

vs2003であることに気づかなかったため、vs2003がmsbuild時代の前であったことを思い出すと、msbuildを可能な解決策として使用していますか?ご回答ありがとうございます。VS 2003で幸運を祈り、VS2005に移行した後、振り返ることはありませんでした
Rihan Meij
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.