2015-01-29 8 views
9

RelatedMSBuild परियोजनाओं, SLN

का उपयोग किए बिना मैं अपने वी.एस. समाधान, BookApp.Web और BookApp.Domain में दो परियोजनाओं की है।

BookApp.Web संदर्भ BookApp.Domaindebug, staging, prod-eu, prod-us और prod-as:

BookApp.Web निम्नलिखित निर्माण विन्यास है। हमारे पास उत्पादन और स्टेजिंग पर्यावरण के लिए तीन डेटासेंटर हैं।

BookApp.Domain अभी तक केवल दो बिल्ड कॉन्फ़िगरेशन हैं, debug

विजुअल स्टूडियो के भीतर से समाधान का निर्माण करते समय, मैं यह सुनिश्चित करने के लिए बिल्ड कॉन्फ़िगरेटर का उपयोग कर सकता हूं कि वेब प्रोजेक्ट के लिए बिल्ड कॉन्फ़िगरेशन का कोई फर्क नहीं पड़ता है, डीबग कॉन्फ़िगरेशन हमेशा डोमेन प्रोजेक्ट के लिए उपयोग किया जाता है।

हालांकि, मेरे निरंतर एकीकरण सर्वर पर एमएसबिल्ड के साथ निर्माण करते समय, चीजें गलत होती हैं। मैं अपने rollout.msbuild फ़ाइल में इस का उपयोग करें:

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

जब मैं इस चलाने के लिए, MSBuild सभी निर्भर परियोजनाओं ही निर्माण विन्यास की अपेक्षा करता है। चूंकि यह मामला नहीं है (और IMO नहीं होना चाहिए), यह इस त्रुटि संदेश के साथ विफल रहता है:

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'. 

एक उत्तर एक related question करने के लिए प्रत्येक निर्माण विन्यास के लिए अलग .sln समाधान बनाने और MSBuild के साथ चल रहा है कि पता चलता है। मेरे लिए जो एक अच्छा विचार की तरह नहीं लगता है।

डोमेन प्रोजेक्ट में सभी बिल्ड कॉन्फ़िगरेशन की प्रतिलिपि बनाना आदर्श नहीं है।

क्या एमएसबिल्ड को विभिन्न बिल्ड कॉन्फ़िगरेशन का उपयोग करने का एक बेहतर तरीका है?

उत्तर

2

इस जवाब यह बताते हैं कि कैसे विन्यास MSBuild कार्य के माध्यम से परियोजना से परियोजना पारित कर रहे हैं और विन्यास के मेटाडाटा का उपयोग करते हुए लक्ष्य परियोजना

here

के लिए वांछित विन्यास पारित करने के लिए पर एक नज़र डालें अद्यतन

मैंने कक्षा पुस्तकालय (नमूना.डोमेन) और कंसोल अनुप्रयोग (SampleApp.Console) के साथ एक समाधान बनाया है। मैंने SamplApp में दो और कॉन्फ़िगरेशन जोड़े। कंसोल: प्रोड-हम; प्रोड-यू, नमूना। डोमिन डीबग के साथ बने रहे; रिलीज।

मैं तो ConsoleApplication की csproj फ़ाइल बदल गया है, तो जैसे:

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> 

जोड़ा विन्यास MSBuild को पारित कर दिया, Outputfiles और संदर्भ फ़ाइलों के लिए कुछ गुण कॉन्फ़िगर करने के लिए पर एक स्विच मामले:

<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> 

, विन्यास MSBuild के लिए पारित स्विच करने के लिए इतना है कि डीबग Sample.Domain को डीबग पारित करेंगे एक लक्ष्य बनाया गया, बाकी सब यह रिलीज

<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 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> 

डीबग कॉल करने के लिए विन्यास इस MSBuild SampleApp.Console.csproj

कॉल करने के लिए की तरह किया जाता है (रिलीज़; prod-हमें; prod-यूरोपीय संघ, ...) इस MSBuild SampleApp.Console.csproj/p की तरह किया जाता है: configuratio n = "prod-us"/p: आउटपुटपैथ = "बिन"

मुझे यकीन है कि इसे अनुकूलित किया जा सकता है, और यह कुछ आसान हो सकता है, लेकिन यह काम करता है।

+0

जो मैं समझता हूं उससे, एक प्रश्न के साथ * एक * प्रोजेक्ट की कई बिल्ड कॉन्फ़िगरेशन बनाने के साथ यह प्रश्न और उत्तर सौदा करता है। मैं समझने की कोशिश कर रहा हूं कि मैं अपने मामले में इसका उपयोग कैसे कर सकता हूं। क्या आप विस्तार से समझा सकते हैं? – lasseschou