2010-02-19 21 views
10

Estamos utilizando .NET 3.5 con VS2008. Tengo una solución con ~ 20 proyectos en ella, y esa cantidad crecerá con el tiempo a medida que la aplicación crezca y agregue nuevos módulos. Hoy necesitaba establecer una propiedad en cada proyecto. Tuve que editar cada archivo csproj añadir lo siguiente:MSBuild - Establecer propiedades para la solución

<Target Name="BeforeBuild"> 
    <CreateProperty Condition=" '$(SolutionDir)' != '' And '$(SolutionDir)' != '*Undefined*' " 
        Value="$(SolutionDir)Tools\MSBuild"> 
     <Output TaskParameter="Value" PropertyName="AlToolPath" /> 
    </CreateProperty> 
    </Target> 

Esto es para permitir que los proyectos para encontrar el enlazador de montaje (al.exe) que se almacena en el repositorio de origen de manera que la construcción es agnóstico máquina (puede verificar y construir en cualquier máquina con .NET sin tener que instalar el SDK). La solución está construida en la línea de comandos usando MSBuild por los desarrolladores, instale archivos por lotes, CCNet, etc.

De todos modos, busqué una forma mejor de hacerlo (es decir, algo así como propiedades de nivel de solución) pero no pude encontrar ninguna. Sé que es posible establecer el valor de la propiedad en la línea de comandos de MSBuild, pero eso no se adapta bien a mí, ya que todas las líneas de comando existentes y futuras tendrían que incluirlo. También pensé en llamar a un objetivo anterior en el primer proyecto construido para usar una tarea personalizada para establecer una variable de entorno y un objetivo posterior en el último proyecto para eliminarlo, pero parecía más pesado y frágil que simplemente editar todos los archivos de proyecto individualmente. .

Háganme saber si ha hecho algo como esto o conozca una forma de establecer una propiedad una vez por solución que pueda ser utilizada por varios proyectos (incluyendo .NET 4/VS2010 con el que no tengo experiencia). Recuerde que estamos utilizando MSBuild para construir el archivo sln, no proyectos individuales.

Respuesta

14

Puede especificar esta propiedad, y todas las otras comunes, en un solo archivo, y cargarla incluyendo en sus archivos de proyecto una declaración Import. Esto es lo que hacemos en nuestro entorno de compilación, que tiene aproximadamente 220 proyectos construidos y varios archivos de proyectos compartidos (por ejemplo, "rama"). Funciona bien.

+2

Me gusta esta solución, pero aún significa que los archivos del proyecto deben editarse al menos una vez. – Mafuba

+1

@Mafuba He automatizado esto usando NuGet. –

+0

fyi utilizando VS 2017 si un archivo de props compartido se llama 'Directory.Build.props', se importará automáticamente a todos los proyectos en la jerarquía del directorio. –

1

Dado que los archivos de Solución no son archivos de MSBuild, no podrá realizar tales operaciones. La única opción es manejarlo o utilizar un archivo master msbuild en lugar de compilar el archivo de solución. Una opción podría ser crear una configuración especial que use su proceso de compilación. Y para los archivos de solución puede especificar la configuración utilizada.

7

He implementado la solución sugerida por @ fatcat111 varias veces. Esta vez he automatizado este proceso usando NuGet - Common.Props. El paquete agregará un archivo de utilería común a nivel de solución e, instalando el paquete en múltiples proyectos de la misma solución, las propiedades se pueden compartir.

El código está en GitHub.

Cuestiones relacionadas