2015-01-29 8 views
9

Relatedprojekty msbuild z różnymi build-configs bez użycia SLN

Mam dwa projekty w moim roztwór i VS, BookApp.WebBookApp.Domain.

BookApp.Web referencje BookApp.Domain.

BookApp.Web ma następujące konfiguracje produkcji: debug, staging, prod-eu, prod-us i prod-as. Mamy trzy centra danych do produkcji i środowiska testowego.

BookApp.Domain do tej pory ma tylko dwie konfiguracje kompilacji, debug.

Podczas budowania rozwiązania z poziomu Visual Studio, mogę użyć konfiguratora kompilacji, aby upewnić się, że bez względu na to, jaka konfiguracja została wybrana dla projektu WWW, konfiguracja debugowania jest zawsze używana dla projektu Domain.

Jednak podczas budowania z MSBuild na moim serwerze ciągłej integracji, wszystko idzie nie tak. Używam tego w moim rollout.msbuild pliku:

<MSBuild Projects="BookApp.Web\BookApp.Web.csproj" Properties="Configuration=Prod-us" /> 

Kiedy uruchomić tego MSBuild oczekuje, że wszystkie projekty zależne mieć taką samą konfigurację kompilacji. Jako że nie jest to przypadek (i nie powinien być IMO), nie jest on z tym komunikatem o błędzie:

The OutputPath property is not set for project 'BookApp.Domain.csproj'. Please check to make sure that you have specified a valid combination of Configuration and Platform for this project. Configuration='Prod-us' Platform='AnyCPU'. 

odpowiedzią na related question sugeruje tworzenie oddzielnych rozwiązań .sln dla każdej konfiguracji kompilacji i uruchamiania że z MSBuild. Dla mnie to nie brzmi jak dobry pomysł.

Kopiowanie wszystkich konfiguracji kompilacji do projektu domeny również nie jest idealne.

Czy istnieje lepszy sposób informowania programu MSBuild o korzystaniu z różnych konfiguracji kompilacji?

Odpowiedz

2

Zapraszamy do obejrzenia tej odpowiedzi Wyjaśnia, jak konfiguracje są przekazywane od projektu poprzez MSBuild zadanie i przy użyciu metadanych konfiguracji przekazać żądaną konfigurację projektu celowego

here

UPDATE

Utworzono rozwiązanie z biblioteką klas (Sample.Domain) i ConsoleApplication (SampleApp.Console). Dodałem dwie dodatkowe konfiguracje do SamplApp.Console: prod-us; prod-eu, Sample.Domain pozostał z debugowaniem;

Potem Zmieniono plik csproj z ConsoleApplication, tak:

ProjectReferences

<!--<ItemGroup> 
    <ProjectReference Include="..\Sample.Domain\Sample.Domain.csproj"> 
     <Project>{73e8a7fd-0a24-47c5-a527-7601550d4b92}</Project> 
     <Name>Sample.Domain</Name> 
    </ProjectReference> 
    </ItemGroup>--> 

    <ItemGroup> 
    <ProjectReference Include="..\Sample.Domain\Sample.Domain.csproj" > 
     <Targets>Build</Targets> 
    </ProjectReference> 
    </ItemGroup> 

Dodany przypadek przełącznik konfiguracji przekazany do MSBuild, aby skonfigurować niektóre właściwości Outputfiles i plików referencyjnych:

<Choose> 
    <When Condition="'$(Configuration)' != 'Debug'"> 
     <PropertyGroup> 
     <OutputProperty>$(OutputPath)\$(Configuration)</OutputProperty> 
     <FileCopy>$(OutputProperty)</FileCopy> 
     </PropertyGroup> 
    </When> 
    <Otherwise> 
     <PropertyGroup> 
     <OutputProperty>$(OutputPath)</OutputProperty> 
     <FileCopy>$(OutputProperty)</FileCopy> 
     </PropertyGroup> 
    </Otherwise> 
    </Choose> 

Utworzono cel do przełączania konfiguracji przekazany do MSBuild, tak że minie Debug Debug do Sample.Domain, wszystko to minie Zwolnij

<Target Name="MultiConfiguration" > 
    <CreateProperty Value="Debug"> 
     <Output TaskParameter="Value" PropertyName="LibConfiguration" Condition="'$(Configuration)' == 'Debug'"/> 
    </CreateProperty> 

    <CreateProperty Value="Release"> 
     <Output TaskParameter="Value" PropertyName="LibConfiguration" Condition="'$(Configuration)' != 'Debug' "/> 
    </CreateProperty> 
    </Target> 

Build docelowa używa właściwości dodaliśmy więc wyjścia i kopiowania plików referencje będą mieć odpowiednie wartości według wartości konfiguracji

<!--Build Process--> 
    <Target Name="Build" DependsOnTargets="Clean;MultiConfiguration;ComputeProjectReference" > 
    <Csc Sources="@(Compile)" References="@(NewAssemblies)" TargetType="exe" OutputAssembly="$(OutputProperty)\$(AssemblyName).exe"/> 
    </Target> 

    <Target Name="ComputeProjectReference" Inputs="@(ProjectReference)" Outputs="%(ProjectReference.Identity)__Forced"> 
    <MSBuild Projects="@(ProjectReference)" Targets="%(ProjectReference.Targets)" Properties="Configuration=$(LibConfiguration);Platform=AnyCPU;OutputPath=bin\$(LibConfiguration)"> 
     <Output TaskParameter="TargetOutputs" ItemName="ResolvedProjectReferences"/> 
    </MSBuild> 
    </Target> 

    <Target Name="AfterProjectReference" AfterTargets="ComputeProjectReference"> 
    <CreateItem Include="@(ResolvedProjectReferences)"> 
     <Output TaskParameter="Include" ItemName="CopyFiles" /> 
    </CreateItem> 

    <Copy SourceFiles="@(CopyFiles)" DestinationFolder="$(FileCopy)" SkipUnchangedFiles="false" /> 

    <ItemGroup> 
     <NewAssemblies Include="$(OutputProperty)\%(CopyFiles.FileName)%(CopyFiles.Extension)" /> 
    </ItemGroup> 
    </Target> 

Aby wywołać Debug konfiguracja odbywa się ten msbuild SampleApp.Console.csproj

zadzwonić (release; prod-us; prod-eu; ...) odbywa się ten msbuild SampleApp.Console.csproj/p: Configuratio n = "prod-us"/p: OutputPath = "bin"

Jestem pewien, że może być zoptymalizowany i może być trochę łatwiejszy, ale działa.

+0

Z tego co rozumiem, to pytanie i odpowiedź dotyczy budowania wielu konfiguracji konfiguracji * jednego * projektu, z jednym krokiem. Próbuję zrozumieć, jak mogę to wykorzystać w moim przypadku. Czy możesz rozwinąć? – lasseschou

Powiązane problemy