私は、ソリューションをビルドして生成されたDLLをbinフォルダーから別のフォルダーにコピーすることを要求するプロジェクトに取り組んでいます。これらは両方とも、私のマシンのCドライブにあります。これを実現するためにxcopyを使用するバッチファイルを作成しました。これは次のとおりです。
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.dll" "C:\inetpub\wwwroot\AppServer\bin\"
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.pdb" "C:\inetpub\wwwroot\AppServer\bin\"
今、私はこのファイルの多数の反復を試しました。
C:\Users\scogan\Desktop\CopyFiles.bat
したがって、ビルド後のイベントコマンドラインは次のようになります。
call C:\Users\scogan\Desktop\CopyFiles.bat
デスクトップ上のフォルダーにある2つのテキストファイルを使用して、このバッチファイルを単独で実行しましたが、正常に動作します。また、自分でコピーする必要のあるファイルをそのまま使用して実行しましたが、これも正常に機能します。ただし、これをビルド後イベントとして実行しようとすると、次の出力が表示されます。
1> Organizr -> C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Client\bin\Debug\Organizr.exe
1> File not found - Organizr.Services.dll
1> 0 File(s) copied
1> 0 File(s) copied
1> File not found - Organizr.Services.pdb
1>c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "call C:\Users\scogan\Desktop\CopyFiles.bat" exited with code 4.
調査を行った結果、エラーコード4は「初期化エラーが発生しました。十分なメモリまたはディスク容量がないか、コマンドラインに無効なドライブ名または無効な構文を入力しました」ということがわかりました。
また、MSB3073についても調べましたが、実際に役立つものはあまり見つかりませんでした。だから、私の質問は私が間違っているのですか?絶対パスはそれを台無しにしていますか?ここで助けていただければ幸いです。
さまざまなプロジェクトプロパティをいじってみたところ、プロジェクトのビルド順序が問題であることがわかりました。コピーしたいファイルを生成したプロジェクトはビルドされましたsecondですが、ポストビルドイベントとしてバッチファイルを実行していたプロジェクトはビルドされましたfirst代わりに2番目のプロジェクトにビルドイベントを添付しましたが、正常に機能します。皆さん、どうもありがとう。
ビルド後のイベントよりも、AfterBuildターゲットのMsBuildの「コピー」タスクを優先します。
このターゲットをプロジェクトファイルに追加し、PostBuildEventを削除します。
<Target Name="AfterBuild">
<Copy SourceFiles="C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.*"
DestinationFolder="C:\inetpub\wwwroot\AppServer\bin\"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
</Target>
価値のあることですが、私の場合の問題は、copy
コマンドでディレクトリ区切り文字として '/'を使用したことが原因です。バックスラッシュを使用する必要があります。
私の場合、プロジェクトをビルドして作成したdllはバックグラウンドでまだ使用されていました。アプリケーションを強制終了した後、xcopyは正常に機能しました。
これは遅すぎますが、後でそれを見る人々のために私の経験を投稿します。-MS VS 2010でも同じ問題がありました。スペースを含むビルドコピーコマンドの引数をポストするために引用符を付けることで解決しました!!!
[プロジェクトプロパティ]-> [構成プロパティ]-> [ビルドイベント]-> [ビルド後イベント]-> [コマンドラインの変更]
copy $(ProjectDir)a\b\c $(OutputPath)
に
コピー "$(ProjectDir)a\b\c" "$(OutputPath)"
指定されたエラーは、ビルド後のイベントに関連しています。どういうわけかVSツールは、ファイルを宛先フォルダーにコピーできません。それには多くの理由があります。正確なエラーの原因を確認するには、[ツール]> [オプション]> [プロジェクトとソリューション]> [ビルドして実行]に移動し、「MsBuildプロジェクトビルド出力詳細」を「診断 "。実際の問題を検出するのに十分な情報が得られます。
正しいプロジェクトにアフタービルドを入れても問題が解決しない場合は、xcopyではなく「copy」を使用してください。これは私のために働いた。
コピーコマンドで何らかの問題が発生した場合、コピーコマンドを実行する前に行うべきことを次に示します。
インポートされたプロジェクトのビルド後イベント(プロパティダイアログのビルドイベントの下)には、定義されていない環境変数がありました。Control Panel\All Control Panel Items\System\Advanced system settings
で適切な 環境変数を追加し、VS2017を再起動するだけで を実行するとエラーが解決しました。
また、 @Seans および複数のプロジェクトの競合/競合に関するその他の回答から、出力フォルダーに一時フォルダーを作成します。
優先出力を生成するプロジェクトを選択します。
ビルド(再構築/クリーンなし)は迅速なソリューションです。
私は次のことを行ってそれを解決しました:Visual Studioでは、プロジェクト->プロジェクトの依存関係に行きました
XXX.Testソリューションを選択し、XXX.Testソリューションのビルド後イベントがこのエラーを生成しないようにすることもXXXソリューションに依存することを伝えました(コード4で終了)。
よろしく、
テストプロジェクトでも同じ問題が発生しました。ビルド後のイベントが機能しなかった理由がわかりました。これは、$(ProjectName).exeコマンドを実行する前にファイルをコピーしており、これらのファイルの一部がテストプロジェクト自体に必要だったためです。したがって、最初のコマンドとして$(ProjectName).exeを移動するだけで問題が修正されます。
複数のプロジェクトを並行してビルドしていて、1つ以上のプロジェクトが同じファイルをコピーしようとすると、偶発的なエラーが発生する競合状態が発生するときに問題が発生することがわかりました。それを解決する方法は?
上記のように変更するだけで一部の人々の問題を解決できるため、多くのオプションがあります。より堅牢なソリューションは...
a。コピーされるファイルを制限します。つまり、xcopy $(TargetDir)。」の代わりに...代わりにxcopy "$(TargetDir)$(TargetName)。*を実行します。 「...
b。エラーをキャッチして再試行します
:loop
xcopy /Y /R /S /J /Q "$(TargetDir)$(TargetName).*" "somewhere"
if ErrorLevel 1 goto loop
c。 xcopyではなくユーザーrobocopy
d。おそらくビルド時間を増やすので、これをしたくないでしょうが、並列プロジェクトビルドの最大数を1に減らすことができます...