2009-03-10 5 views
10

나는 정상적인 SLN 파일을 가지고 있으며 명령 행에서 msbuild를 사용하여 정상적으로 컴파일하고있다.msbuild SLN과 여전히 별도의 프로젝트 출력을 얻을 수 있습니까?

C : 나는 이렇게 \ slndir> msbuild를/P : OUTDIR = C : \ slnbin \

그리고 그것은 C에 모든 것을 덤프 : C에 배포 얻을 웹 사이트를 제외하고 \ slnbin을 : \ slnbin_PublishedWebsites \.

bin 디렉토리에 모든 바이너리를 놓는 것뿐만 아니라 각 실행 가능한 프로그램에 각 웹 사이트와 비슷한 자체 "배치 된"폴더가 있어야합니다. 나는 다음과 같은 프로젝트가있는 경우

따라서, 예를 들어, :

C:\slnbin\ // Everything 
    C:\slbin\Deploy\Service1 // Common, Lib1, Service1 
    C:\slbin\Deploy\Service2 // Common, Lib2, Service2 

을 내가하고 시도 : - 공통 - LIB1 - 서비스 1 - 을 - LIB2 서비스 2

내가 얻을 완 "msbuild/p : OutDir = C : \ slnbin \ $ (ProjectName)"과 같은 내용이지만 그냥 리터럴로 처리하고 실제 "$ (ProjectName)"하위 디렉토리를 만듭니다.

각 프로젝트를 개별적으로 수정할 필요는 없습니다.

이것이 가능합니까? 쉬운?

답변

13

John Saunders와 마찬가지로 프로세스를 처리하는 마스터 MSBuild 파일이 있어야합니다. 여기

는 샘플 MSBuild Community Tasks을 사용하고 있습니다 : 주어진 솔루션 그래서

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Package"> 

    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 

    <!-- Specify here, the solution you want to compile--> 
    <ItemGroup> 
    <Solution Include="C:\slndir\solution.sln"/> 
    </ItemGroup> 

    <PropertyGroup> 
    <Platform>AnyCPU</Platform> 
    <Configuration>Debug</Configuration> 

    <!-- Your deployment directory --> 
    <DeployDir>C:\slbin\Deploy</DeployDir> 
    </PropertyGroup> 

    <!-- Gets the projects composing the specified solution --> 
    <Target Name="GetProjectsFromSolution"> 
    <GetSolutionProjects Solution="%(Solution.Fullpath)"> 
     <Output ItemName="ProjectFiles" TaskParameter="Output"/> 
    </GetSolutionProjects> 
    </Target> 

    <Target Name="CompileProject" DependsOnTargets="GetProjectsFromSolution"> 
    <!-- 
     Foreach project files 
     Call MSBuild Build Target specifying the outputDir with the project filename. 
    --> 
    <MSBuild Projects="%(ProjectFiles.Fullpath)" 
      Properties="Platform=$(Platform); 
      Configuration=$(Configuration); 
      OutDir=$(DeployDir)\%(ProjectFiles.Filename)\" 
      Targets="Build"> 
    </MSBuild> 
    </Target> 
</Project> 
+1

이것은 우리에게 큰 도움이되고 있습니다. 한 가지 질문 - MSBuild를 Projects = "% (ProjectFiles.Fullpath)"로 호출하면 MSBuild가 각 프로젝트를 한 번만 빌드 할만큼 똑똑합니까? 예를 들어 솔루션에있는 foo.dll이 있고 다른 4 개의 프로젝트에서 참조하는 foo.dll은 한 번 또는 4 번 또는 5 번 foo.dll을 빌드합니까? –

+2

"Exec 태스크를 사용하여 MSBuild.exe를 시작하는 것과 달리이 태스크는 동일한 MSBuild 프로세스를 사용하여 하위 프로젝트를 빌드합니다. 건너 뛸 수있는 이미 빌드 된 대상 목록은 상위 및 하위 빌드간에 공유됩니다. 새로운 MSBuild 프로세스가 생성되지 않기 때문에 더 빠릅니다. " 그래서 나는 foo.dll이 한 번 빌드 될 것이라고 추측하지만 확실하지 않습니다. –

+2

빌드에 필요한 명령 줄은 무엇입니까? –

1

"손으로"해야합니다. 솔루션을 빌드하는 마스터 MSBUILD 프로젝트 파일을 만든 다음 원하는 모든 솔루션 출력을 복사합니다. 이것은 (대략) Visual Studio Team Build에서 수행하는 작업입니다.

+1

나는 csproj 파일이 모든 종속성을 알고 있다는 사실을 활용할 수 없기 프로젝트를 얻을 수 GetSolutionProjects를? 이것은 두 위치 (csprojs 및 msbuild)에서 종속성을 유지해야한다는 것을 의미합니까? – MichaelGG

관련 문제