2015-05-22 17 views
5

Sadece paylaşılan projeleri bir kez derleyerek bir dizi çözüm derlemesini hızlandırmaya çalışıyorum. Bu benim sorunumun basitleştirilmiş bir açıklamasıdır.MSBuild neden paylaşılan projeleri yeniden oluşturuyor?

İki çözümüm var - one.sln ve two.sln. Her ikisi de paylaşılan proje shared.csproj içerir. Visual Studio'da iki çözümü açın, her ikisini de temizleyin, sonra bir.sln oluşturun, sonra ikişer inşa edin. Two.sln oluşturulduğunda, shared.dll beklediğim davranış olan REGEDİLMEMİŞTİR.

bu işlemi otomatik hale getirmek için, ben (aşağıda) bir msbuild .proj dosyası oluşturduk. .proj dosyasında msbuild çağrıldığında, shared.dll BOTH çözümleri için yeniden derlenir. Neyi yanlış yapıyorum?

<Project ToolsVersion="4.0" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     DefaultTargets="Build"> 
    <ItemGroup> 
     <Solution Include="C:\one.sln"/> 
     <Solution Include="C:\two.sln"/> 
    </ItemGroup> 
    <Target Name="Build"> 
     <MSBuild Projects="@(Solution)" Targets="Build" RunEachTargetSeparately="false" StopOnFirstFailure="true" /> 
    </Target> 
</Project> 

cevap

3

IIRC, referans, iki kere derlenen her iki çözümlerinde bir referans proje olarak bildirilmiş olmasıdır nedeni. Bu yüzden her ikisi de referanslarının Oluşturma Hedefini çağıracaktır. Ben bunu anladım.

ekle referans projesi

<!--Project reference--> 
    <ItemGroup> 
    <ProjectReference Include="refProject\refProject.csproj"> 
     <Targets>Build</Targets> 
    </ProjectReference> 
    </ItemGroup> 

için maalesef MSBuild görev parametre olarak başvuruları almaz

<Target Name="ComputeProjectReference" Inputs="@(ProjectReference)" Outputs="%(ProjectReference.Identity)__Forced"> 
    <MSBuild Projects="@(ProjectReference)" Targets="%(ProjectReference.Targets)"> 
     <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="$(AssemblyName)\$(OutputPath)" SkipUnchangedFiles="false" /> 

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

    </Target> 

Referans

inşa etmek için bir hedef bir ItemGroup oluşturun. Gereken her bir projeyi temsil eden itemGroups oluşturmanızı öneriyorum.

<ItemGroup> 
    <CompileA Include="ConsProject\Program.cs" /> 
    <CompileA Include="ConsProject\Properties\AssemblyInfo.cs" /> 
    <CompileA Include="ConsProject\Properties\Settings.Designer.cs"> 
     <AutoGen>True</AutoGen> 
     <DesignTimeSharedInput>True</DesignTimeSharedInput> 
     <DependentUpon>Settings.settings</DependentUpon> 
    </CompileA> 
    </ItemGroup> 

    <ItemGroup> 
    <CompileB Include="OtherProject\Program.cs" /> 
    <CompileB Include="OtherProject\Properties\AssemblyInfo.cs" /> 
    <CompileB Include="OtherProject\Properties\Settings.Designer.cs"> 
     <AutoGen>True</AutoGen> 
     <DesignTimeSharedInput>True</DesignTimeSharedInput> 
     <DependentUpon>Settings.settings</DependentUpon> 
    </CompileB> 
    </ItemGroup> 

Ve projeleri inşa etmek için bir hedef oluşturmak gibi bir şey referanslar paylaşılan projeler her çözümü için yeniden derlenmesi ediliyordu neden anladım

<!--Build Process--> 
    <Target Name="Build" DependsOnTargets="ComputeProjectReference" > 
    <Csc Sources="@(CompileA)" References="@(NewAssemblies)" TargetType="exe" OutputAssembly="$(AssemblyName)\$(OutputPath)\$(AssemblyName).exe" /> 

    <Csc Sources="@(CompileB)" References="@(NewAssemblies)" TargetType="exe" OutputAssembly="$(AssemblyName)\$(OutputPath)\$(AssemblyName).exe" /> 

    </Target> 
1

kez derlenmiş ile. Her projede, kodun hedef dosyayı imzaladığı bir posta oluşturma adımımız var. Bir projenin her önceki derlemesinden sonra, .dll dosyası, .pdb dosyasından daha yenidir, bu nedenle projeyi yeniden derler. Bunu, ayrıntılı günlük kaydı için/v: d anahtarını kullanarak buldum, sonra projelerin neden her seferinde tam olarak oluşturulduğunu bulmak için çıktıda "tamamen" arama yapıyordum.