2009-05-13 11 views
7

Ich habe ein paar Projekte, die auf SQL Server-Assemblys verweisen. Mit SQL Server 2005 und SQL Server 2008 führe ich derzeit 2 Projektdateien, die auf die gleichen Quelldateien verweisen, und der einzige Unterschied sind die Verweise auf die SQL Server-Assemblys.Mit Msbuild erstellen und Projektreferenzen dynamisch festlegen

Gibt es eine Möglichkeit, dass ich nur ein Projekt verwalten und die Referenzen in meinem Build-Skript dynamisch angeben kann?

+0

Sie nicht die 2005-Baugruppen gegenüber 2008 arbeiten? –

+0

Nein, aber die Assemblys von 2008 funktionieren gegen 2005. Das einzige Problem ist, dass ich ein paar dieser Projekte auf Codeplex release und ich mache gerne eine Version für Leute, die nur SQL 2005 haben und eins für Leute, die 2008 haben Diese Versammlungen sind in der GAC so (soweit ich weiß) kann ich nicht alle meine Abhängigkeiten neu verteilen. Und ich bin mir nicht sicher, ob ich meine Release-Größe aufblähen möchte, selbst wenn ich könnte. –

Antwort

15

für eine Lösung des gleichen Problems gesucht hatte ich Sie auf die vorgeschlagene Lösung kam auf der ItemGroup einen Zustand zu haben. Dies hatte jedoch einen Nebeneffekt, da ich in den Referenzen von Visual Studio beide Referenzen sehen konnte, was sich auch auf ReSharper auswirkte.

Ich benutze endlich ein Wählen wenn sonst und ich habe kein Problem mehr mit ReSharper und Visual Studio zeigt zwei Referenzen.

<Choose> 
    <When Condition=" '$(Configuration)' == 'client1DeployClickOnce' "> 
    <ItemGroup> 
     <ProjectReferenceInclude="..\client1\app.Controls\app.Controls.csproj"> 
     <Project>{A7714633-66D7-4099-A255-5A911DB7BED8}</Project> 
     <Name>app.Controls %28Sources\client1\app.Controls%29</Name> 
     </ProjectReference> 
    </ItemGroup> 
    </When> 
    <Otherwise> 
    <ItemGroup> 
     <ProjectReference Include="..\app.Controls\app.Controls.csproj"> 
     <Project>{2E6D4065-E042-44B9-A569-FA1C36F1BDCE}</Project> 
     <Name>app.Controls %28Sources\app.Controls%29</Name> 
     </ProjectReference> 
    </ItemGroup> 
    </Otherwise> 
</Choose> 

Sie könnten mehr darüber auf meinem Blog-Post lesen: ProjectReference with Condition in your MSBuild project file

+0

Tolle Lösung Laurent, die doppelten Referenzen waren nervig und diese Lösung behebt dieses Problem. Vielen Dank! –

+0

Es funktioniert nicht für mich in Visual Studio 2015 –

5

Jedes MSBuild Element (ok fast jeder) kann eine Condition mit ihm verbunden ist. Was würde ich vorschlagen, dass Sie die Projektdatei bearbeiten (die eine MSBuild-Datei selbst) und legen Sie alle SQL-Server-Referenzen in einer ItemGroup, die eine Bedingung für sie zum Beispiel hat:

<ItemGroup Condition="'$(SqlServerTargetEdition)'=='2005'"> 
    <!-- SQL Server 2005 References here --> 
    <Reference Include="..."/> 
    </ItemGroup> 

Und ein anderes ItemGroup für Sql 2008-Server:

<ItemGroup Condition="'$(SqlServerTargetEdition)'=='2008'"> 
    <!-- SQL Server 2008 References here --> 
    <Reference Include="..."/> 
    </ItemGroup> 

Sie sollten einen Standardwert für die Eigenschaft SqlServerTargetEdition liefern, bevor diese Elemente deklariert werden. Dann können Sie diesen Wert in der Befehlszeile überschreiben, indem Sie die Option/p beim Aufruf von msbuild.exe verwenden.

Sayed Ibrahim Hashimi

My Book: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Ehrfürchtiges Buch! Ich habe es und es hat meinen Verstand gerettet! Sayed, großartig dich hier auf Stack Overflow zu sehen! – Cyberherbalist

+0

Das hört sich genau danach an, was ich möchte. Ich werde das heute Abend zu Hause testen. Danke Sayed! –

Verwandte Themen