Может ли Visual Studio автоматически настроить имя другого файла, как это делается с помощью app.config?

#.net #visual-studio #visual-studio-2010 #msbuild #post-build-event

#.net #visual-studio #visual-studio-2010 #msbuild #событие после сборки

Вопрос:

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

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

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

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

Редактировать: Хотя мне нравятся оба решения, предложенные Джаредпаром и Саймоном Мурье, они не обеспечивают того, на что я надеялся. Наличие пользовательского инструмента или правила MSBuild для этого делает его менее прозрачным (для других программистов в проекте) или, по крайней мере, более сложным, чем использование события post-build, которое я использую в настоящее время. Тем не менее, я чувствую, что MSBuild был бы правильным местом для решения подобных проблем.

Ответ №1:

В этом случае не 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>
  

Ответ №2:

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

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