2009-05-13 20 views
7

Tengo un par de proyectos que hacen referencia a conjuntos de SQL Server. Con SQL Server 2005 y SQL Server 2008 actualmente mantengo 2 archivos de proyecto que apuntan a los mismos archivos fuente y la única diferencia son las referencias a los ensamblados de SQL Server.Construir con msbuild y establecer dinámicamente referencias de proyecto

¿Hay alguna manera de que solo pueda mantener un proyecto y especificar dinámicamente las referencias en mi script de compilación?

+0

No los ensamblajes 2005 trabajan en contra de 2008? –

+0

No, pero las asambleas de 2008 funcionan contra 2005. El único problema es que publico un par de estos proyectos en codeplex y me gusta hacer un lanzamiento para personas que solo tienen SQL 2005 y una para personas que tienen 2008. Algunas de estas asambleas están en el GAC entonces (hasta donde yo sé) no puedo redistribuir todas mis dependencias. Y no estoy seguro de que me gustaría hinchar mi tamaño de lanzamiento, incluso si pudiera. –

Respuesta

15

La búsqueda de una solución al mismo problema que tenían llegué a la solución propuesta de tener una condición en la ItemGroup. Pero esto tuvo un efecto secundario porque en las referencias de Visual Studio pude ver ambas referencias, lo que también afectó a ReSharper.

Finalmente uso un Elegir cuando de lo contrario y ya no tengo ningún problema con ReSharper y Visual Studio mostrando dos referencias.

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

Usted puede leer más sobre esto en mi blog: ProjectReference with Condition in your MSBuild project file

+0

Gran solución Laurent, las referencias duplicadas eran molestas y esta solución corrige ese problema. ¡Gracias! –

+0

No funciona para mí en Visual Studio 2015 –

5

Cada elemento de MSBuild (vale casi todos) puede tener asociado un Condition. Lo que sugeriría es que edite el archivo de proyecto (que es un archivo de MSBuild sí mismo) y colocar todas las referencias de servidor SQL en un ItemGroup que tiene una condición en la que por ejemplo:

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

Y otra ItemGroup para SQL Server 2008:

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

debería proporcionar un valor predeterminado de la propiedad antes de SqlServerTargetEdition esos artículos se declaran. Luego, en la línea de comando puede anular ese valor utilizando el modificador/p al invocar msbuild.exe.

Sayed Ibrahim Hashimi

Mi libro: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Impresionante libro! ¡Lo tengo y me salvó la cordura! ¡Sayed, es un placer verte aquí en Stack Overflow! – Cyberherbalist

+0

Esto suena exactamente a lo que estoy buscando. Voy a probar esto en casa esta noche. Gracias Sayed! –

Cuestiones relacionadas