ビルド後はコード1で終了しました


107

ビルド後のイベントを含むプロジェクトがあります。

copy $(ProjectDir)DbVerse\Lunaverse.DbVerse.*.exe  $(TargetDir)

私のマシンでは毎回問題なく動作します。「exited with code 1」エラーが常に発生する新しい開発者がいます。私は彼女にDOSプロンプトで同じコマンドを実行させましたが、うまくいきました。何が原因でしょうか?実際のエラーに到達する方法はありますか?

どちらもVisual Studio 2008を使用しています。


私の場合、このページの終わり近くにあるTim Scottの回答(最初は見落としている)で問題が解決します。
yu yang

回答:


115

パスのフォルダー名の1つにスペースがあり、引用符がありませんでした。


12
パス名に引用符を付けることは良い習慣です。スペースを含むパスで機能しないことはイベントの改善につながります:-)
Asher、

4
/ y "$(TargetDir)Dotfuscated \" "$(TargetDir)"このコマンドは機能しません。最後にexit 0を書き込んだ場合、問題なく機能します。理由を教えてもらえますか?
Rikin Patel、

59

「Pings」が付いているものは私を助けました...しかし、少し良く説明されるかもしれません...

私にとっての解決策は変更することでした:

copy $(TargetDir)$(TargetName).* $(SolutionDir)bin

これに:

copy "$(TargetDir)$(TargetName).*" "$(SolutionDir)bin"

それがあなたのために働くことを願っています。:-)


47

これは非常に活発な質問なので、将来の訪問者のために追加しました。

ROBOCOPYは8未満の「成功コード」で終了します。参照:http : //support.microsoft.com/kb/954404

この意味は:

robocopy exit code 0 = no files copied
robocopy exit code 1 = files copied
When the result is 1, this becomes an error exit code in visual studio.

だから私はこれをバッチファイルの最後に追加することでこれを簡単に解決しました

exit 0

この方法でROBOCOPYエラーを処理することを提案する

rem each robocopy statement and then underneath have the error check.
if %ERRORLEVEL% GEQ 8 goto failed

rem end of batch file
GOTO success

:failed
rem do not pause as it will pause msbuild.
exit 1

:success
exit 0    

ファイルがコピーされないときに混乱が生じます。VSでエラーは発生しません。次に、変更があると、ファイルはコピーされますが、VSエラーが発生しますが、開発者が望んだすべてが行われました。

追加のヒント:スクリプトで一時停止を使用しないでください。一時停止はVSビルドで無期限の一時停止になります。スクリプトの開発中は、などを使用しますtimeout 10。あなたはこれに気づいて、ぶら下がっているビルドではなくコメントアウトします。


4
まさに私が探していたもの。ありがとう!!
リッキー

8年前の回答をぶつけて、batファイルではなくワンライナーが必要な場合は、ビルド後のイベント文字列の最後に「&exit 0」を追加できます。
Eric Wu

46

コード1の理由は、ターゲットフォルダーが読み取り専用であったためです。これが誰かを助けることを願っています!あるビルドから別のディレクトリーへのコピーを行うビルド後のイベントがあり、宛先は読み取り専用でした。だから私は行って、ディレクトリとそのすべてのサブディレクトリの読み取り専用属性のチェックを外しました!安全なディレクトリであることを確認してください!


おかげで1時間節約できました。インターネットからいくつかのコードをダウンロードすると、Windows 7はフォルダーを自動的に読み取り専用に設定します。
Johan Petersson、2011年

1
代わりにxcopyを/ yフラグと共に使用しました。すべてのコマンドのmicrosoft.com/resources/documentation/windows/xp/all/proddocs/...
ヨハン・ピーターソン


8

ビルド後に、OSで保護された「.. \ Common7 \ IDE \ PrivateAssemblies」にビルド後のコピーを取得するために、VSを管理者として実行する必要がありました。


5

「を使用する人のために、コピーに」コマンドをビルドイベントビルド前のイベントコマンドラインまたは/およびビルド後に実行するコマンドラインから)プロジェクト- >プロパティ:あなたは、「コピー」コマンドのパラメータは、ここでは次のようになりますcopy "source of files" "destination for files"。引用符を使用することを忘れないでください(アドレスの文字列のスペースに関する問題を回避するため)。


4

同様の問題がありましたが、特にJenkinsビルド環境で発生しました。この問題を修正するために、私はビルド後のイベントでコピーコマンドを使用する方法から、コピーターゲットを使用する方法に切り替えました。

私はこれを変更しました:

   <PropertyGroup>
      <PostBuildEvent>copy $(ProjectDir)bin\BLAH.Common.xml $(ProjectDir)App_Data\BLAH.Common.xml</PostBuildEvent>
   </PropertyGroup>

これに:

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(ProjectDir)bin\BLAH.Common.xml" DestinationFolder="$(ProjectDir)App_Data\" />
  </Target>

そして、それは今うまく動作します。

私が得ていた特定のエラーは:

(PostBuildEvent target) -> 
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "copy <http://1.2.3.4/job/BLAHv2/ws/Api/bin/BLAH.Common.xml> <http://1.2.3.4/job/BLAHv2/ws/Api/App_Data/BLAH.Common.xml"> exited with code 1. [<http://1.2.3.4/job/BLAHv2/ws/Api/Api.csproj]>

どのようにしてその変更を行いましたか?手動で編集しましたか?ターゲットをどのように実行しますか?これは、msbuildコマンドラインで指定する必要があるもののようです。msbuildで作成されたすべてのフォルダーが常に読み取り専用であるため、私のjenkins環境でまったく同じ問題が発生します。私のマシンではうまくコピーするがサーバーではコピーしない理由は私を超えています。
shawn1874

Notepad ++を使用してcsprojファイルを編集しました。「AfterBuild」フックは標準のフックであるため、存在する場合は、ビルドプロセスの後に自動的に呼び出されます。
TechSavvySam 2018年

ありがとう。ターゲットを含むカスタムmsbuildファイルがあるのか​​、それがVisual Studioで作成されたファイルだけなのかはわかりませんでした。参考:私の場合、問題はビルドの順序に関係していることがわかりました。リリース、ソリューション構成でビルドの依存関係を設定するのを忘れたので、コピーが実行されたときに入力ファイルがまだ利用できないように、プロジェクトは異なる順序でサーバー上でビルドされていました。それを必要とする他のプロジェクトの前に.dllが作成されたことを確認して、それを修正しました。それは、それを引き起こしたソリューション構成の非常に微妙な問題でした。
shawn1874

ビルドの順序が構成ごとであることは、最初は明らかではありませんでした。これは解決策の設定の方がいいと思いましたが、明らかにすべての構成でビルド順序を更新する必要があります。
shawn1874 2018年

3

Visual Studioを管理者として実行することで、コード1を修正できました。どうやら、管理者なしでシェルコマンドを実行するためのアクセス権を持っていなかったようです。



2

私にとっては、ファイルをコピーした先のプログラムがその時点で実行されていないことを確認する必要がありました。構文にエラーはありませんでした。これが誰かを助けることを願っています。


2

同じエラーが発生しました。エスケープする必要がある宛先パスに%がありました

c:\projects\%NotAnEnvironmentVariable%

である必要があった

c:\projects\%%NotAnEnvironmentVariable%%

2

わかりました、これは多くのソリューションの問題なので、私は人々にもっとヒントを与えるために私のものを投稿します。私の状況は、パス内のフォルダを再確認し、すべてがマシンに存在することを確認することです。たとえば、 "$(SolutionDir)\ p​​artBin \ Bin \ $(ProjectName).pdb"ですが、 "Bin"はpartBinフォルダにありません。


1
ところで、\ $(SolutionDir)は冗長です。
ディアブロ

2

プロジェクトのビルドイベント(ビルド前のイベントコマンドラインまたはビルド後のイベントコマンドライン)で「コピー」コマンドを使用する場合、プロジェクト->プロパティ:ターゲットフォルダーが存在する必要があります。


0

非常に多くのソリューション...

私の場合、非ユニコード(Western、Windows)エンコーディングでbatファイルを保存する必要がありました。デフォルトでは、ファイルをVisual Studioに追加したとき(おそらく、VSの外部で実行する必要があったはずです)、UTF-8エンコーディングで追加されました。


0

同じ問題があり、プロジェクトの名前を変更したことが原因であることがわかりました。プロジェクトのプロパティを調べ、アセンブリ名とルートネームスペースをプロジェクト名に変更しました。


0

さらに別の答え...

私の場合、.Net Standard 1.3と.Net Framework 2.0の両方を対象とするVisual Studio 2017プロジェクトがありました。これは、次のように.csprojファイルで指定されています。

<TargetFrameworks>netstandard1.3;net20</TargetFrameworks>

また、次のようなビルド後のイベントコマンドラインも使用しました。

copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"

つまり、ビルドによって生成された.Net Framework .dllを別の場所にコピーしようとしていました。

私が再構築を行ったとき、これはこのエラーで失敗しました:

MSB3073 The command "copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"" exited with code 1.

苛立ちの末、私は最終的に、Rebuildがすべての出力ファイルを削除し、次に.Net Standard 1.3のビルドを実行してから、ビルド後のイベントコマンドラインを実行しようとしたが、ファイルがコピーされるため失敗したことを最終的に判断しました。まだ建てられていません。

したがって、解決策は、ビルドの順序を変更することでした。つまり、最初に.Net Framework 2.0をビルドし、次に.Net Standard 1.3をビルドします。

<TargetFrameworks>net20;netstandard1.3</TargetFrameworks>

これが機能するようになりましたが、ビルド後のイベントコマンドラインが2回実行されているため、ファイルが2回コピーされるという小さな不具合があります。


0

私の場合、私はしなければなりませんでした cd、batファイル内には相対パスを指定するコピー操作があったため、batファイルを呼び出す前(ディレクトリを変更する)必要がありました。

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.