クライアントのソリューションのいくつかのプロジェクトには、ビルド後イベントがあります。xcopy
特定のフォルダーへのビルド出力。これは、ローカルでビルドするときに正常に機能します。ただし、TeamCityでは、I ときどき get
xcopy [...]はコード2で終了しました
通常のcopy
を使用すると、コード1で終了します。コピーされる特定のファイルは同じではありませんが、ファイルのロックに関係していると思われます。私が使う /y
ファイルの上書きに関するプロンプトを表示しません。
TeamCityではこれが失敗するのに、ローカルでは失敗するのはなぜですか?
/Y
スイッチにxcopyを指定しても、コピーするファイルがファイルかディレクトリかをxcopyが認識しないと、エラーが発生します。このエラーは、「コード2で終了」と表示されます。コマンドプロンプトで同じxcopyを実行すると、xcopyがファイルまたはディレクトリの応答を要求していることがわかります。
自動ビルドでこの問題を解決するには、事前定義された応答をパイプでエコーします。
コピーしているものがファイルだと言うには、F
にエコーします:
echo F|xcopy /y ...
コピーしているのはディレクトリだと言うには、D
にエコーします:
echo D|xcopy /y ...
Xcopyの代わりにcopyコマンドを使用するだけで、上記の問題を解決できる場合があります。
copy /y ...
ただし、最終ファイル宛先に至るまで存在しないディレクトリがある場合、「コード1で終了」が発生します。
要確認:/C
スイッチとxcopyは注意して使用してください。
パスの最後に\を追加することでエラーコード2を修正しました。これがないと、xcopyはフォルダーではなくファイルであると見なします。
ビルド後イベントでxcopyを使用している場合は、/ Cに加えて/ Yスイッチを使用します。
/C Continues copying even if errors occur.
/Y Suppresses prompting to confirm you want to overwrite an existing file.
この問題に対する私の修正は、ターゲットbinフォルダーに移動し、適切なサブフォルダーがそこに存在することを確認することでした。そのサブフォルダーが手動で作成されると、ビルドプロセスは正常に完了しました。
おそらく、TeamCityをgitで使用しています。はいの場合、コピーするfoldersがgitリポジトリに存在することを確認します。通常、git aviodは空のプロジェクトフォルダーをリポジトリに追加するため、xcopy
はそれを見つけられず、エラーを生成します。
空のフォルダーに空のテキストファイルを追加してコミットし、フォルダーがリポジトリに表示されるのを確認できます。
copy
が修正してくれました。 xcopy with /c /y
動作しませんでした。出口4を取得していたので、xcopy
を使用しましたが、($TargetPath)
。
私のスクリプト:
if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"