app.config名称是硬编码还是可以修改?

时间:2016-07-01 14:28:11

标签: .net visual-studio visual-studio-2012 msbuild app-config

我知道在VS中构建时,app.config会被复制到<configuration>/<app-name>.exe.config。我相信这个复制步骤是由msbuild执行的,VS用于构建?

我已经看到一些建议,可以通过构建设置或属性等来定制,但我无法找到明确的答案。

我的两个相关问题是:

  1. 在构建期间,谁/什么将app.config文件复制到输出目录?在构建的哪个阶段?
  2. 我可以控制搜索到的文件的名称,例如将其更改为Jeff.config{ConfigurationName}.cfg

1 个答案:

答案 0 :(得分:1)

技术上是的,但是你可能需要注意,因为你正在深入研究。如果您要检查此文件:

  

的Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Microsoft.Common.targets

你可以找到几个有趣的目标:

PrepareForBuild:准备构建的先决条件。

  <Target Name="PrepareForBuild" DependsOnTargets="$(PrepareForBuildDependsOn)">
    <ItemGroup>
      <AppConfigWithTargetPath Include="$(AppConfig)" Condition="'$(AppConfig)'!=''">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>

    <FindAppConfigFile PrimaryList="@(None)" SecondaryList="@(Content)" TargetPath="$(TargetFileName).config" Condition="'$(AppConfig)'==''">
      <Output TaskParameter="AppConfigFile" ItemName="AppConfigWithTargetPath"/>
      <Output TaskParameter="AppConfigFile" PropertyName="AppConfig"/>
    </FindAppConfigFile>

    <!-- Create the directories for intermediate and final build products, and any other arbitrary directories. -->
    <!-- We are going to continue on error here so that if the tree is read only we will still get intellisense -->
    <MakeDir Directories="$(OutDir);$(IntermediateOutputPath);@(DocFileItem->'%(RelativeDir)');@(CreateDirectory)" ContinueOnError="True"/>

  </Target>

构建AppConfigWithTargetPath ItemGroup(此项目组用于许多其他目标)。 另一个执行实际复制的目标 - _CopyAppConfigFile:复制应用程序配置文件。

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

了解它是如何被复制的 - 你可以影响应该复制的内容。 最干净的方法是定义\覆盖$(AppConfig)属性中的值 - 然后一切都必须使用这个新的指定配置。

取决于你如何构建东西 - 你可能需要创建预解决方案文件来挂钩或明确修改你的构建脚本以传递额外的参数。或者您可以直接搜索csproj文件并编辑文件名。