msbuild.exe가 열린 상태로 파일을 잠급니다.


98

차례로 msbuild (.NET 4)를 호출하는 TeamCity를 사용합니다. 빌드가 완료된 후 (성공적인 빌드인지 여부는 중요하지 않은 것 같음) msbuild.exe가 열린 상태로 유지되고 파일 중 하나가 잠 깁니다. 즉, TeamCity가 시도 할 때마다 작업 디렉토리를 지우면 실패하고 계속할 수 없습니다.

이것은 거의 매번 발생합니다 .

이 부분을 잃어 버렸기 때문에 가능한 한 자세한 정보를 제공하도록 노력하겠습니다.

  • 서버는 Windows Server 2008 표준 64 비트 SP2가있는 Intel Core i7, 2GB ram입니다.
  • TeamCity에서 msbuild 실행기는 /m명령 줄 매개 변수 (다중 코어 사용을 의미 함)로 구성됩니다.
  • 문제의 파일은 항상 경로의 .NET 프로젝트 중 하나에서 참조되는 동일한 외부 DLL입니다 External Tools\Telerik\Telerik.Reporting.Dll. ( External Tools이 문제를 일으키지 않는 유사한 경로 구조 의 dir에 포함 된 다른 여러 .DLL 파일 이 있습니다.) 현재 이것은 차이가있을 경우를 대비하여 Telerik 보고서의 평가판 버전입니다.
  • 문제가 발생하면 msbuild.exe *32작업 관리자에 항상 여러 프로세스가 나열됩니다. 7이 있다고 생각합니다. Process Explorer를 사용하면 모두 최상위 프로세스 (부모 없음)처럼 보입니다. 그들은 모두 20-50MB 램과 0.0 % CPU를 사용하고 있습니다.
  • 1-3 분 정도 기다리면 msbuild.exe 프로세스가 자동으로 종료되고 TeamCity가 작업 디렉터리를 올바르게 업데이트 할 수 있습니다.
  • msbuild 프로세스를 수동으로 종료하면 TeamCity의 업데이트가 즉시 다시 작동합니다.
  • 인덱싱 서비스는 Windows에서 꺼져 있습니다 (이전의 두 지점은 문제를 일으키는 msbuild.exe임을 거의 확인합니다).
  • Telerik.reporting.dll에는 특별한 속성이 없습니다. 유일한 SVN 속성은svn:mime-type = application/octet-stream

전에이 문제를 겪은 사람이 있습니까?

답변:


123

msbuild와 함께 사용하십시오 /nr:false.

간단히 말해서 MSBuild는 특히 병렬 빌드에서 많은 작업을 빠르게 수행하려고합니다. 많은 "노드"-프로젝트를 컴파일 할 수있는 개별 msbuild.exe 프로세스를 생성합니다. 프로세스를 실행하는 데 약간의 시간이 걸리기 때문에 빌드가 완료된 후 이러한 프로세스가 중단됩니다 (기본적으로 15 분 동안). ), 곧 다시 빌드 할 경우 이러한 노드를 "재사용"하여 프로세스 설정 비용을 절약 할 수 있습니다. 그러나 앞서 언급 한 명령 줄 옵션으로 nodeReuse를 끄면 해당 동작을 비활성화 할 수 있습니다.

또한보십시오:


2
의미가 있습니다. / m을 제거하면 발생하지 않는 것 같습니다. 나는 지금 시도하고 /m /nr:false있으며 몇 가지 빌드를 실행하고 어떻게 진행되는지 볼 것입니다. 감사합니다
gregmac

26
Visual Studio에서 해당 msbuild 옵션으로 프로젝트를 빌드하려면 어떻게해야합니까?
Cameron Taggart 2012

1
여전히 알고 싶지만 실제로 C ++ / CLI 프로젝트에 대한 Visual Studio 11 베타 버그가 발생했습니다. 다음과 같은 증상이 나타납니다. connect.microsoft.com/VisualStudio/feedback/details/728912/…
Cameron Taggart 2012

3
조기 최적화는 진정으로 모든 악의 근원입니다. 마이크로 소프트.
johnwbyrd 2015 년

1
@CameronTaggart 프로젝트 / 솔루션 폴더에 호스팅 된 특수 파일을 사용하여 msbuild 명령 줄 옵션을 추가 할 수 있습니다. docs.microsoft.com/en-us/visualstudio/msbuild/…
needfulthing

43

Visual Studio 내에서 노드 재사용을 비활성화하려면 환경 변수를 사용해야합니다.

MSBUILDDISABLENODEREUSE=1

나는 이것을 효과적으로 사용했지만 VS11 베타로 C ++를 컴파일 할 때 mt.exe라는 또 다른 도구가 있습니다. 다른 변수를 사용할 수 있습니까?
Eugenio Miró

VS 어딘가에 대화 상자를 사용하여 설정할 수 없습니까?
dom_beau

1
@dan 이것을 찾아 주셔서 진심으로 감사 드리며 Microsoft.VisualStudio.Web.Host.exe도 비활성화하는 환경 변수가 있기를 기도 합니다.
jerhewet 2015-04-23

이는 명령 줄에서 빌드를 실행할 때도 작동합니다 (예 : 배치 스크립트, 빌드 서버 등).
Dave E
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.