2008-11-07 2 views
3

나는 수동으로 빌드해도 CC.NET에서는 실패한다.왜 Build가 CruiseControl.NET과 함께 실패하지만 동일한 설정으로 수동으로 잘 빌드됩니까?

CC.NET에서 나타나는 오류는 기본적으로 파일을 찾을 수 없어 가져 오기와 관련이 있습니다. 프로젝트 (C++ dll) 중 하나가 다른 프로젝트에서 빌드 한 dll을 가져 오려고합니다. DLL은 프로젝트 사이에 종속성이 있기 때문에 올바른 위치에 있어야합니다. 수동으로 빌드하면 모든 것이 잘 작동합니다. (수동으로 말하면 소스 코드 저장소에서 신선한 것을 모두 가져 와서 VS2005에서 다시 빌드하여 CC.NET을 시뮬레이트합니다. 오토메이션).

CC.NET을 통해 빌드를 자동화 할 때 종속성이 무시되는 것처럼 보입니다.

릴리스 MinDependency 모드로 구축 중입니다.

도움이 되었으면 좋겠습니다.

답변

4

devenv 대신 msbuild를 사용하도록 CC를 변경할 수 있습니까? 그것은 나에게 최적의 솔루션 인 것처럼 보입니다. 빌드가 두 상황에서 동일하다는 것을 의미하기 때문입니다.

+0

이것은이 경우에 이상적인 해결책이 될 것입니다. 나는 뻔뻔한 해킹으로 이미 건물을 만들지 않았을 것입니다. (그리고 나는 devenv를 사용하는 것을 선호합니다. 왜냐하면 나는 다른 모든 것을 위해 이것을 사용하고 있습니다.) – JohnIdol

1

명령 줄에서 빌드하고 결과를 확인하십시오.

+0

나는 이것을 시도하지 않았다 - 가능한 설명에 대한 어떤 추측 이니? 나는 너트하려고한다 – JohnIdol

+0

나는 이것을 시도했다 - 그것은 devenv와 함께 실패한다 - visual studio는 msbuild를 사용하고 있지만 명령 행 매개 변수의 정확한 세트를 무시한다. – JohnIdol

0

CC.Net이 필요한 라이브러리 디렉토리가 경로에 제대로 추가되지 않도록 다른 환경 변수로 빌드하고 있는지 궁금합니다.

특정 DLL 가져 오기가 실패한 이유에 대한 CC.Net 빌드 로그에 특정 오류 메시지가 있습니까? 파일을 찾을 수 없습니까? 권한? 자세한 CC.Net 빌드 로그에서 실패를 확인하고 일반적인 명령 행 빌드와 다른 점을 확인하십시오.

+0

yep - error는 '파일을 찾을 수 없음' – JohnIdol

+0

솔루션에 대한 cmd 행을 어떻게 체크 할 수 있는가? 짓다? CC.NET – JohnIdol

1

실제로 서비스를 구성 할 때 사용자가 실제로 사용하는 것과 다른 사용 권한 및/또는 환경 변수를 가지고 있다고 생각됩니다. 동일한 물리적 상자에 있고 Visual Studio에서 잘 컴파일하고 CruiseControl (MSBuild가 아닌)의 Visual Studio를 사용하는 경우 거의 확실하게 사용자입니다. 그러나 CruiseControl에서 MSBuild를 사용하고 있다면 MSBuild (2.0)가 C++ sln을 컴파일 할 때와 Visual Studio에서 컴파일 할 때 큰 차이가 있습니다. MSBuild를 C++ 솔루션에서 사용해야하는 경우 v3.5를 사용해보십시오. C++ 솔루션을 훨씬 더 지원합니다.

+0

이 좋은 제안 일 때 buildLog에서 수동으로 빌드 할 때 출력에서 ​​단일 프로젝트의 cmd 행만 볼 수 있습니다. 그러나 서비스가 등록 된 동일한 사용자, 즉 환경 변수를 사용하고 있습니다. 모두 동일합니다 – JohnIdol

+0

BTW - 저는 Visual Studio를 사용하여 수동으로 또는 cc.net을 통해 빌드합니다. – JohnIdol

+0

DId를 사용하여 컴퓨터가 검색되어 dll이 빌드되고 있는지 예상되는 위치가 아닌 다른 곳으로 출력되고 있는지 확인하십시오. 만약 당신이 soloution properities에서 출력을 변경할 수 있습니다. – Alex

2

오랜 조사 끝에 - 현재이 단계에서 내 이해는 문제가 CruiseControl.NET을 통해 빌드하는 데 devenv를 사용한다는 사실과 관련이 있지만 Visual Studio에서 수동으로 빌드 할 때 msbuild를 사용하고 있다는 것입니다.

기본적으로 종속성이 무시됩니다 (일부 msbuild 명령에서 devenv를 사용하여 복제하지 못하기 때문입니다).

저는 C++ 프로젝트간에 종속성이 설정된다는 사실은 어느 정도 관련이 있다고 생각합니다. 다른 경우에는 .NET 프로젝트와 C++ 프로젝트 사이의 CC.NET 설정 종속성을 올바르게 구축 할 수 있었기 때문입니다.

정확하게 무엇이 다른 동작을 생성하는지 알아 내려면 this lead을 따라야합니다.

다른 사람들의 의견을 듣고 싶습니다.

0

IDE에서 열어 컴파일하면 솔루션이 빌드되는 인스턴스로 실행되었지만 명령 줄 (msbuild 또는 devenv)에서 실행하면 실패합니다. 각각의 경우 문제는 나쁜 참조 - 가능성이 로컬 상자와 빌드 서버 사이에 일치하는 경로에서.솔루션을 열 때 VisualStudio가 깨진 경로를 자동으로 확인하려고하기 때문에 IDE에서 올바르게 컴파일됩니다. 이 작업을 수행하면 솔루션 및 프로젝트 파일 (일반적으로 사용자가 원하는 것)이 변경되지 않습니다.

솔루션 파일 및/또는 프로젝트 파일을 텍스트 편집기를 사용하고 모든 상대 경로가 유효한지 확인하십시오.

0

Alex가 말했듯이 CC.NET 서비스가 로컬 사용자 계정으로 실행되는 것이 문제라고 생각합니다. 불행히도 C++ 환경 변수 중 일부는 사용자별로 있으며 기본 빌드 환경으로 이월되지 않습니다. 내 경우에 그것은 lib 디렉토리 였고 도구 -> 옵션 -> 프로젝트 및 솔루션 -> VC++ 디렉토리에 정의 된 파일을 포함합니다. 이 같은 문제는 분명히 다른 문제를 유발하고 this article에서 노란색 블록으로 호출됩니다.

제 솔루션은 빌드를 위해 특별히 빌드 머신에 새로운 사용자 (BuildUser)를 만드는 것입니다. 열쇠는 BuildUser으로 로그인 한 후 환경을 설정하는 것이 었습니다. 마지막으로 CC.NET 서비스를 BuildUser으로 로그인하여 다시 시작했습니다.

0

VC2003은 종속성 및 입력 라이브러리 사이의 불일치가있는 것 (내 후 처음으로 재개시는 실패한 것으로 보인다).

예 :

  • PROJECTA -> A.lib
  • ProjectB -> B.exe
    • 속성 -> 링커 -> 추가 입력 도서관, A. lib가 지정되었습니다. (이것은 자동없는 이유를 아직 나에게 신비) 프로젝트 종속성에서
    • 는 PROJECTA는 ProjectB 청소

는, A.lib이 삭제되지 않습니다 선택되어 있지 않으며, ProjectB 인 경우는 재 구축 컴파일. 따라서 빌드가 로컬 시스템에서 성공한 것처럼 보입니다.

CC.NET은 처음부터 시작되며 A.lib가 처음에는 발견되지 않으므로 빌드가 실패합니다.

관련 문제