포스트 빌드가 코드 1로 종료되었습니다.


108

빌드 후 이벤트가있는 프로젝트가 있습니다.

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

내 컴퓨터에서 매번 잘 작동합니다. 항상 "코드 1로 종료"오류가 발생하는 새 개발자가 있습니다. 나는 그녀에게 DOS 프롬프트에서 동일한 명령을 실행하게했고 잘 작동했습니다. 원인은 무엇입니까? 실제 오류에 도달 할 수있는 방법이 있습니까?

우리는 둘 다 Visual Studio 2008을 사용하고 있습니다.


제 경우에는 Tim Scott이이 페이지의 끝 부분에서 제공하는 답변 (처음에는 간과)이 문제를 해결합니다.
유 양 지앤

답변:


115

경로의 폴더 이름 중 하나에 공백이 있었고 그 주위에 따옴표가 없었습니다.


12
경로 이름에 따옴표를 붙이는 것이 좋습니다. 공간이 포함 된 경로에서 작동하지 않는 것이 더 좋습니다. :-)
Asher

4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)"이 명령은 나를 위해 작동하지 않으며 종료시 종료 0을 쓰면 정상적으로 작동합니다. 이유를 말해 줄 수 있나요?
Rikin Patel

59

"핑"이있는 사람이 저를 도왔습니다 ... 그러나 조금 더 잘 설명 될 수 있습니다 ...

저에게 해결책은 다음과 같습니다.

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

이에:

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

그것이 당신을 위해 작동하기를 바랍니다. :-)


48

이것은 꽤 활발한 질문이기 때문에 미래의 방문객을 위해 이것을 추가했습니다.

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
내가 찾던 바로 그것. 감사!!
Ricky

8 년 전의 답변을 부풀려서 박쥐 파일이 아닌 한 줄짜리를 원하면 빌드 후 이벤트 문자열 끝에 "& exit 0"을 추가 할 수 있습니다.
Eric Wu

46

코드 1의 이유는 대상 폴더가 읽기 전용 이었기 때문입니다. 이것이 누군가를 돕기를 바랍니다! 한 디렉토리에서 다른 디렉토리로 복사하는 포스트 빌드 이벤트가 있었고 대상은 읽기 전용이었습니다. 그래서 방금 디렉토리와 모든 하위 디렉토리에서 읽기 전용 속성을 선택 취소했습니다! 안전한 디렉토리인지 확인하십시오!


한 시간을 절약했습니다. 감사합니다! 인터넷에서 일부 코드를 다운로드하고 Windows 7은 폴더를 자동으로 읽기 전용으로 설정합니다.
Johan Petersson 2011 년

1
나는 또한 xcopy를 / y 플래그와 함께 사용했습니다. 모든 명령 microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Johan Petersson 2011 년


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

감사. 대상이있는 사용자 지정 msbuild 파일이 있는지 아니면 Visual Studio에서 만든 파일인지 확실하지 않았습니다. 참고 : 제 경우에는 문제가 빌드 순서와 관련이 있다는 것을 알았습니다. 릴리스, 솔루션 구성에서 빌드 종속성을 설정하는 것을 잊었으므로 복사가 실행될 때 입력 파일을 아직 사용할 수 없도록 프로젝트가 다른 순서로 서버에 빌드되었습니다. .dll이 나를 위해 수정해야하는 다른 프로젝트 전에 생성되었는지 확인합니다. 그것은 그것을 일으킨 솔루션 구성의 매우 미묘한 문제였습니다.
shawn1874

처음에는 각 구성에 대한 빌드 순서가 분명하지 않았습니다. 나는 그것이 더 많은 솔루션 설정이라고 생각했지만 분명히 모든 구성에서 빌드 순서를 업데이트해야합니다.
shawn1874

3

Visual Studio를 관리자로 실행하여 코드 1을 수정할 수있었습니다. 분명히 그것은 Admin없이 셸 명령을 실행할 수있는 액세스 권한이 없었습니다.



2

저에게는 파일을 복사하는 프로그램이 당시 실행되고 있지 않은지 확인해야했습니다. 구문에 오류가 없습니다. 이것이 누군가를 돕기를 바랍니다.


2

방금 같은 오류가 발생했습니다. 이스케이프해야하는 대상 경로에 %가 있습니다.

c:\projects\%NotAnEnvironmentVariable%

필요했다

c:\projects\%%NotAnEnvironmentVariable%%

2

좋아, 이것은 많은 솔루션의 문제이므로 사람들에게 더 많은 힌트를 제공하기 위해 내 게시물을 게시했습니다. 내 상황은 경로의 폴더를 다시 확인하고 모든 폴더가 컴퓨터에 있는지 확인하는 것입니다. 예 : "$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb"이지만 "Bin"은 partBin 폴더에 없습니다.


1
BTW, \ after $(SolutionDir)는 중복됩니다.
Diablo

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을 대체 위치에 복사하려고했습니다.

Rebuild를 수행 할 때이 오류로 인해 실패했습니다.

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>

이제 빌드 후 이벤트 명령 줄이 두 번 실행되므로 파일이 두 번 복사된다는 사소한 결함과 함께 작동합니다.


0

제 경우 cd에는 bat 파일을 호출하기 전에 (디렉토리를 변경)해야했습니다. 왜냐하면 bat 파일 내부에는 상대 경로를 지정하는 복사 작업이 있었기 때문입니다.

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.