2011-03-02 5 views
1

한 번의 클릭으로 빌드 환경을 만드는 단계로 BuildEngine을 사용하고 있습니다. 코드는 다음과 같습니다 :MSBuild : BuildEngine의 하위 프로젝트 정의 구성

Engine engine = new Engine(); 
FileLogger logger = new FileLogger { Parameters = @"logfile=C:\builds\build.log" }; 
engine.RegisterLogger(logger); 

var project = new Project(engine); 
project.Load("Example.csproj"); 
project.SetProperty("Configuration", "Release"); 

bool success = project.Build(); 

그리고 그는 릴리스 구성으로 프로젝트 예를 빌드하는 것 같습니다. 그러나 build.log를 보면 예제 프로젝트의 모든 종속성이 디버그로 빌드 된 것입니다.

Release에서 모든 종속성을 강제로 생성하는 방법이 있습니까?

+0

종속 프로젝트가 csproj 파일에서 "디버그"에 "하드 코드"되어 있지 않습니까? 그들은 다음과 같이 말해야합니다 : Debug jishi

+0

사실, 그것들은 =)하지만 AFAIK는 컴파일러에게 Debug 설정을 사용하도록 지시합니다. $ (Configuration)이 설정되지 않은 경우 그래서, $ (Configuration) 변수를 설정하는 방법이 있습니까? 아니면 기본값을 Release로 설정해야합니까? – dcarneiro

답변

1

설정 엔진에 글로벌 속성 :

BuildPropertyGroup bpg = new BuildPropertyGroup(); 
bpg.SetProperty ("Configuration", "Release"); 
engine.GlobalProperties = bpg; 

이 프로젝트 자체가 설정 한 속성을 재정의합니다.

+0

Property를 리터럴 값으로 처리하는 것을 잊어 버렸습니다. bpg.SetProperty ("Configuration", configuration, true); 그것에도 불구하고, 그것은 완벽하게 작동했습니다! – dcarneiro

1

Engine 클래스는 사용되지 않습니다.
대신 Microsoft.Build.Evaluation.ProjectCollection을 사용하십시오. 명령 줄에서 msbuild를 호출 할 때 전역 속성을 전달할 수 있습니다.

msbuild가 많은 메모리를 차지한다는 경고를해야합니다. 나는 서비스로 일하고있는 기계를 만드는 로봇을 가지고있다. 그것을 빌드 할 명령을받을 때 새로운 프로세스를 만들고 Build()를 호출합니다. 때로는 메모리 사용량이 2GB에 달합니다 (빌드가 큽니다). 명령 줄에서 MSBuild를 호출하면 메모리가 훨씬 더 효율적으로 릴리스됩니다.

API를 던지고 MSBuild.exe를 호출하여 루프를 구현하는 두 가지 구현을 테스트 해보십시오. MSBuild 4.0 MS에서 이러한 메모리 문제를 해결할 수 있습니다.

+0

하지만 내 프로젝트는 프레임 워크 3.5에 있습니다. ProjectCollection은 해당 프레임 워크 또는 프레임 워크 4에서만 프로젝트를 빌드합니까? – dcarneiro

+1

MSBuild 4.0을 사용할 수 있습니다. 프레임 워크 3.5로 프로젝트를 빌드 할 수 있습니다. 빌더가 4.0에서 작동하면 4.0으로 마이그레이션하는 것이 훨씬 쉬워집니다. –