7

Al agregar un archivo de configuración de la aplicación a un proyecto .Net en Visual Studio, se llamará app.config y se renombrará (en compilación) al ApplicationName.config.¿Puede Visual Studio ajustar automáticamente el nombre de otro archivo como lo hace con app.config?

Tengo una solución con aproximadamente 40 proyectos. Deseo agregar la funcionalidad de log4net a bastantes de ellos. Entonces para cada proyecto agregaría un archivo app.log4net. Luego declararía un evento de construcción posterior como este:

copy $(ProjectDir)app.log4net $(TargetPath).log4net 

Eso funciona bien. Pero me preguntaba si había una forma incorporada de lograr lo mismo sin un evento explícito posterior a la construcción.

Editar: Si bien me gustan las dos soluciones propuestas por JaredPar y Simon Mourier, no ofrecen lo que esperaba. Tener una herramienta personalizada o regla MsBuild para esto lo hace menos transparente (para otros programadores en el proyecto) o al menos más complicado que usar el evento post-build que estoy usando actualmente. Sin embargo, creo que MsBuild sería el lugar correcto para resolver problemas similares.

Respuesta

6

En este caso, no es Visual Studio el que está actualizando el nombre de app.config sino que es una regla básica de MSBuild que es independiente de Visual Studio. Si desea emular el modelo app.config, este es el enfoque que debe tomar

Las dos partes de la secuencia de compilación que controla la copia de app.config se encuentran en Microsoft.Common.targets.

En primer lugar el nombre del archivo se calcula

<ItemGroup> 
    <AppConfigWithTargetPath Include="$(AppConfig)" Condition="'$(AppConfig)'!=''"> 
     <TargetPath>$(TargetFileName).config</TargetPath> 
    </AppConfigWithTargetPath> 
</ItemGroup> 

A continuación se copian en realidad como parte de la construcción

<Target 
    Name="_CopyAppConfigFile" 
    Condition=" '@(AppConfigWithTargetPath)' != '' " 
    Inputs="@(AppConfigWithTargetPath)" 
    Outputs="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')"> 

    <!-- 
    Copy the application's .config file, if any. 
    Not using SkipUnchangedFiles="true" because the application may want to change 
    the app.config and not have an incremental build replace it. 
    --> 
    <Copy 
     SourceFiles="@(AppConfigWithTargetPath)" 
     DestinationFiles="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')" 
     OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)" 
     Retries="$(CopyRetryCount)" 
     RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" 
     UseHardlinksIfPossible="$(CreateHardLinksForAdditionalFilesIfPossible)" 
     > 

     <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/> 

    </Copy> 

</Target> 
Cuestiones relacionadas