Может ли Visual Studio автоматически настроить имя другого файла, как это происходит с app.config? - PullRequest
7 голосов
/ 13 мая 2011

При добавлении файла конфигурации приложения в проект .Net в Visual Studio он будет называться app.config и будет переименован (при сборке) в ApplicationName.config.

У меня есть решение около 40 проектов. Я хочу добавить функциональность log4net довольно многим из них. Поэтому для каждого проекта я бы добавил файл app.log4net. Затем я объявил бы событие после сборки следующим образом:

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

Это прекрасно работает. Но мне было интересно, есть ли встроенный способ добиться того же самого без явного события после сборки.

Редактировать: Хотя мне нравятся оба решения, предложенные JaredPar и Simon Mourier, они не дают того, на что я надеялся. Наличие специального инструмента или правила MsBuild для этого делает его менее прозрачным (для других программистов проекта) или, по крайней мере, более сложным, чем использование события пост-сборки, которое я сейчас использую. Тем не менее, я чувствую, что MsBuild была бы правильным местом для решения подобных проблем.

Ответы [ 2 ]

6 голосов
/ 13 мая 2011

В данном случае это не Visual Studio, которая обновляет имя app.config, а это основное правило MSBuild, которое не зависит от Visual Studio.Если вы хотите эмулировать модель app.config, этот подход следует использовать

Две части последовательности сборки, которые контролируют копирование app.config, находятся в Microsoft.Common.targets.

Сначала вычисляется имя файла

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

Затем оно фактически копируется как часть сборки

<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>
3 голосов
/ 13 мая 2011

Я думаю, что это довольно жестко запрограммировано для app.config (вы можете попробовать другие имена xxx.config, и оно не работает).

Вы можете достичь того же результата без события после сборки, но с помощью специального инструмента, который вы выберете для своих файлов .log4net. См. Следующие примеры: Написание пользовательского инструмента для генерации кода для Visual Studio .NET и Разработка пользовательского инструмента Visual Studio

...