2009-05-13 7 views
7

J'ai quelques projets qui référencent des assemblys SQL Server. Avec SQL Server 2005 et SQL Server 2008, je gère actuellement deux fichiers de projet qui pointent vers les mêmes fichiers source et la seule différence est les références aux assemblys SQL Server.Construire avec msbuild et définir dynamiquement des références de projet

Existe-t-il un moyen que je ne peux maintenir qu'un projet et spécifier dynamiquement les références dans mon script de construction?

+0

Ne pas les assemblées de 2005 travaillent par rapport à 2008? –

+0

Non, mais les assemblées de 2008 fonctionnent contre 2005. Le seul problème est que je lance un couple de ces projets sur codeplex et j'aime faire une version pour les personnes qui ont seulement SQL 2005 et une pour les personnes qui ont 2008. Certains de ces assemblées sont dans le GAC donc (pour autant que je sache) je ne peux pas redistribuer toutes mes dépendances. Et je ne suis pas sûr d'avoir envie de gonfler ma taille de sortie même si je le pouvais. –

Répondre

15

recherche d'une solution au même problème que vous aviez je suis venu à la solution proposée d'avoir une condition sur la ItemGroup. Mais cela a eu un effet secondaire car dans les références Visual Studio, je pouvais voir les deux références, ce qui a également affecté ReSharper.

J'utilise finalement un choix quand autrement et je n'ai plus aucun problème avec ReSharper et Visual Studio montrant deux références.

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

Vous pouvez en lire davantage sur mon blog: ProjectReference with Condition in your MSBuild project file

+0

Grande solution Laurent, les références en double étaient agaçantes et cette solution résout ce problème. Merci! –

+0

Cela ne fonctionne pas pour moi dans Visual Studio 2015 –

5

Chaque élément MSBuild (ok presque tous les) peut avoir un Condition associé. Ce que je suggère est que vous modifiez le fichier de projet (qui est un fichier lui-même MSBuild) et placez toutes les références de serveur SQL dans un ItemGroup qui a une condition sur elle par exemple:

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

Et une autre ItemGroup pour Sql serveur 2008:

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

Vous devez fournir une valeur par défaut de la propriété SqlServerTargetEdition avant que ces articles sont déclarés. Ensuite, sur la ligne de commande, vous pouvez remplacer cette valeur à l'aide du commutateur/p lors de l'appel de msbuild.exe.

Sayed Ibrahim Hashimi

Mon livre: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Livre impressionnant! Je l'ai et ça a sauvé ma santé mentale! Sayed, heureux de vous voir ici sur Stack Overflow! – Cyberherbalist

+0

Cela ressemble exactement à ce que je suis après. Je vais tester ça à la maison ce soir. Merci Sayed! –

Questions connexes