왜 빌드 후 단계 (xcopy)가 TeamCity 빌드에서 코드 2와 함께 종료됩니까?


93

내 클라이언트 솔루션의 일부 프로젝트에는 빌드 후 이벤트 ( xcopy특정 폴더에 대한 빌드 출력)가 있습니다. 이것은 로컬에서 빌드 할 때 잘 작동합니다. 그러나 인 TeamCity에, 나는 가끔 얻을

xcopy [...] 코드 2로 종료되었습니다.

regular을 사용하면 copy코드 1로 종료됩니다. 복사되는 특정 파일이 동일하지 않더라도 파일 잠금과 관련이 있으므로 공유 대상 디렉토리에서 잠글 수 있습니다. 내가 사용하는 /y파일을 덮어 쓰기에없는 프롬프트.

TeamCity에서는 실패하지만 로컬에서는 실패하는 이유는 무엇입니까?


비슷한 문제가 있었지만 동시에 같은 파일을 동시에 복사하는 것과 관련이 있습니다. 파일이 두 번 복사되지 않았는지 다시 확인해 주시겠습니까?
Ignacio Soler Garcia

4
종료 코드 2는을 의미 The user pressed CTRL+C to terminate xcopy합니다. 헤헤.
Hans Passant 2011 년

@SoMoS 예, 복사되는 파일은 확실히 구별됩니다.
Tim Iles 2011 년

@HansPassant Teamcity가 나에게 CTRL + C를 눌러야하는 이유를 모르겠습니다! :(
Tim Iles 2011 년

5
그래, 나도. 다른 일반적인 규칙은 종료 코드가 마지막 Windows 오류 또는 예외와 동일하다는 것입니다. 오류 2는 "파일을 찾을 수 없음"을 의미합니다. 물론 훨씬 더 의미가 있습니다.
Hans Passant 2011 년

답변:


146

/Yxcopy와 함께 스위치 를 제공하더라도 xcopy가 복사하는 것이 파일인지 디렉토리인지 알지 못하면 오류가 계속 발생합니다. 이 오류는 "exited with code 2"로 나타납니다. 명령 프롬프트에서 동일한 xcopy를 실행하면 xcopy가 파일 또는 디렉터리의 응답을 요청하는 것을 볼 수 있습니다.

자동화 된 빌드로이 문제를 해결하려면 파이프를 사용하여 미리 정의 된 응답으로 에코 할 수 있습니다.

복사하는 것이 파일이라고 말하려면 echo in F:

echo F|xcopy /y ...

복사하는 것이 디렉토리라고 말하려면 echo in D:

echo D|xcopy /y ...

때때로 위의 문제는 xcopy 대신 복사 명령을 사용하여 해결할 수 있습니다.

copy /y ...

그러나 최종 파일 대상으로 이어지는 존재하지 않는 디렉토리가있는 경우 "exited with code 1"이 발생합니다.

기억하십시오 : /C스위치와 xcopy를주의해서 사용하십시오 .


@Metro Smurf에게 감사드립니다. 이것이 내 문제를 해결했는지 여부를 테스트 할 수는 없지만 당신의 말이 영리하게 들리므로 답으로 표시했습니다. 건배!
Tim Iles 2013

나는 똑같은 문제에 부딪 쳤고 궁극적으로 응답에서 파이핑으로 끝났습니다. 바라건대 이것은 장기적으로 다른 사람을 도울 것입니다.
Metro Smurf 2013

1
"이것은 프롬프트 단어가 다를 수있는 지역화 된 Windows 버전에서는 작동하지 않습니다. 대체 방법 은 대상 끝에 별표 ' '를 추가하는 것입니다. 그러면 xcopy가 파일 / 디렉토리에 대해 프롬프트하지 않습니다. – Govert Jan 28 at 19:40 "따라서 echo D (신뢰할 수 없음)없이 다음과 같이 복사 할 수 있습니다. XCOPY $ (ProjectDir) .. \ scripts * $ (TargetDir) scripts * / Y / R. 또는 에코 F없이이 같은 복사본을 수행 XCOPY D를 : \ file.zip C : \ renamedFile.zip / Y / R
leetNightshade

@leetNightshade- *디렉토리에서도 작동합니까? 아니면 파일 전용입니까?
Metro Smurf 2013

@MetroSmurf Hm, 내 예제의 형식이 실패한 것 같습니다. 백 슬래시가 누락되고 (기호를 이스케이프하려고한다고 생각 했어야 함) 별표가 누락되었습니다. 그러나 예, 디렉토리 및 파일에서 작동합니다. Govert의 답변에 대한 링크는 다음과 같습니다. stackoverflow.com/a/14022309/353094
leetNightshade 2013

37

내 경로 끝에 \를 추가하여 오류 코드 2를 수정했습니다.이 코드가 없으면 xcopy는 폴더가 아닌 파일이라고 생각합니다.


3
그게 다야. Windows 7, Visual Studio 2013에서 잘 작동했습니다. 감사합니다!
Charles

33

빌드 후 이벤트에서 xcopy를 사용하는 경우 / C 외에 / Y 스위치를 사용합니다.

/C           Continues copying even if errors occur.
/Y           Suppresses prompting to confirm you want to overwrite an existing file.

4
아주 간단합니다! /Y프롬프트를 억제합니다! 왜 이렇게 찾기 어려웠습니까?
SouthShoreAK

3
/ Y는 덮어 쓰기 프롬프트를 표시하지 않지만 이것이 코드 2의 유일한 이유는 아닙니다. RTFM은 그 원인을 알려주지 않습니다.
MSalters

2

이 문제에 대한 수정 사항은 대상 bin 폴더로 이동하여 적절한 하위 폴더가 있는지 확인하는 것이 었습니다. 해당 하위 폴더가 수동으로 생성되면 빌드 프로세스가 성공적으로 완료되었습니다.


2

copy나를 위해 고쳤습니다. xcopy with /c /y작동하지 않았다. 나는 출구 4를 얻고 있었기 때문에 함께 xcopy갔지만 주위에 따옴표가 필요하다는 것이 밝혀졌습니다 ($TargetPath).

내 스크립트 :

if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"

2

아마도 git과 함께 TeamCity를 사용하고있을 것입니다. 그렇다면 복사하려는 폴더 가 git 저장소에 있는지 확인하십시오 . 일반적으로 git aviod는 빈 프로젝트 폴더를 저장소에 추가하므로 xcopy찾지 못하고 오류가 발생합니다.

빈 폴더에 빈 텍스트 파일을 추가하고 커밋하고 저장소에 폴더가 나타나는 것을 볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.