首页 文章

如何使用新的VS 2010配置转换并将其应用于其他.config文件?

提问于
浏览
10

我已经在我的web.config中为我的connectionStrings等设置了一些配置转换 . 但是我已将web.config的某些区域分离为单独的文件,例如appSettings.config .

如何配置Visual Studio和MSBuild以对这些附加配置文件执行配置转换?

我已经按照web.config的方法在我的Web应用程序项目文件中将文件关联在一起,但不会自动应用转换 .

<ItemGroup>
    <Content Include="appSettings.Debug.config">
        <DependentUpon>appSettings.config</DependentUpon>
    </Content>
</ItemGroup>

3 回答

  • 11

    默认情况下,管理转换的目标( TransformWebConfig )仅适用于 web.config 文件 .


    要使其适用于 appSettings.config 文件,您必须:

    • 将文件的 Build Action 设置为 Content

    • 使用 ProjectConfigFileName=appSettings.configConfiguration=$(Configuration) 调用MSBuild目标 TransformWebConfig .


    要在 web.config 文件转换后立即调用 appSettings.config 的MSBuild TransformWebConfig 目标,您需要在项目文件的末尾添加它:

    <PropertyGroup>
      <!-- Name of your custom config file -->
      <ConfigFileName>appSettings.config</ConfigFileName>
    </PropertyGroup>
    
    <PropertyGroup>
      <!-- 
          This property is used to handle circular dependency between
          TransformWebConfig and our custom target TransformAppConfig
      -->
      <FirstRun Condition="$(FirstRun) == ''">true</FirstRun>
    </PropertyGroup>
    
    <!-- This target will be called one time after a call to TransformWebConfig -->
    <Target Name="TransformAppConfig" 
            AfterTargets="TransformWebConfig"
            Condition="$(FirstRun) == 'true'">
    
      <MSBuild Projects="$(MSBuildProjectFile)"
               Targets="TransformWebConfig"
               Properties="ProjectConfigFileName=$(ConfigFileName);
                           Configuration=$(Configuration);
                           FirstRun=false"/>
    </Target>
    
    <!-- 
        This target will be called one time before PreAutoParameterizationWebConfigConnectionStrings 
        to add $(ConfigFileName) to autoparameterization step
    -->
    <Target Name="AddToAutoParameterizationStep" 
            BeforeTargets="PreAutoParameterizationWebConfigConnectionStrings">
      <ItemGroup>
        <_WebConfigsToAutoParmeterizeCS Include="@(FilesForPackagingFromProject)"
                               Condition="('%(FilesForPackagingFromProject.Filename)%(FilesForPackagingFromProject.Extension)'=='$(ConfigFileName)') And !%(FilesForPackagingFromProject.Exclude)">
          <TransformOriginalFile>$(AutoParameterizationWebConfigConnectionStringsLocation)\original\%(DestinationRelativePath)</TransformOriginalFile>
          <TransformOutputFile>$(AutoParameterizationWebConfigConnectionStringsLocation)\transformed\%(DestinationRelativePath)</TransformOutputFile>
          <TransformScope>$(_PackageTempDir)\%(DestinationRelativePath)</TransformScope>
        </_WebConfigsToAutoParmeterizeCS>
        <_WebConfigsToAutoParmeterizeCSOuputFiles Include="@(_WebConfigsToAutoParmeterizeCS->'%(TransformOutputFile)')">
        </_WebConfigsToAutoParmeterizeCSOuputFiles>
      </ItemGroup>   
    </Target>
    
  • 3

    使这更容易的东西,看看在...的SlowCheetah VS加载项... visualstudiogallery

  • 5

    这是适合我的代码:

    <PropertyGroup>
        <!-- Name of your custom config file -->
        <ConfigFileName>ConnectionStrings.config</ConfigFileName>
        <ConfigTransformFileName>ConnectionStrings.$(Configuration).config</ConfigTransformFileName>
      </PropertyGroup>
      <PropertyGroup>
        <!-- 
          This property is used to handle circular dependency between
          TransformWebConfig and our custom target TransformAppConfig
      -->
        <FirstRun Condition="$(FirstRun) == ''">true</FirstRun>
      </PropertyGroup>
      <Target Name="AddConfigToTransform" AfterTargets="CollectWebConfigsToTransform">
        <ItemGroup>
          <WebConfigsToTransform Include="@(FilesForPackagingFromProject)" Condition="'%(FilesForPackagingFromProject.Filename)%(FilesForPackagingFromProject.Extension)'=='$(ConfigFileName)'">
            <TransformFile>%(RelativeDir)$(ConfigTransformFileName)</TransformFile>
            <TransformOriginalFile>$(TransformWebConfigIntermediateLocation)\original\%(DestinationRelativePath)</TransformOriginalFile>
            <TransformOutputFile>$(TransformWebConfigIntermediateLocation)\transformed\%(DestinationRelativePath)</TransformOutputFile>
            <TransformScope>$([System.IO.Path]::GetFullPath($(_PackageTempDir)\%(DestinationRelativePath)))</TransformScope>
          </WebConfigsToTransform>
        </ItemGroup>
      </Target>
      <!-- 
        This target will be called one time before PreAutoParameterizationWebConfigConnectionStrings 
        to add $(ConfigFileName) to autoparameterization step
    -->
      <Target Name="AddToAutoParameterizationStep" BeforeTargets="PreAutoParameterizationWebConfigConnectionStrings">
        <ItemGroup>
          <_WebConfigsToAutoParmeterizeCS Include="@(FilesForPackagingFromProject)" Condition="('%(FilesForPackagingFromProject.Filename)%(FilesForPackagingFromProject.Extension)'=='$(ConfigFileName)') And !%(FilesForPackagingFromProject.Exclude)">
            <TransformOriginalFile>$(AutoParameterizationWebConfigConnectionStringsLocation)\original\%(DestinationRelativePath)</TransformOriginalFile>
            <TransformOutputFile>$(AutoParameterizationWebConfigConnectionStringsLocation)\transformed\%(DestinationRelativePath)</TransformOutputFile>
            <TransformScope>$(_PackageTempDir)\%(DestinationRelativePath)</TransformScope>
          </_WebConfigsToAutoParmeterizeCS>
          <_WebConfigsToAutoParmeterizeCSOuputFiles Include="@(_WebConfigsToAutoParmeterizeCS->'%(TransformOutputFile)')">
          </_WebConfigsToAutoParmeterizeCSOuputFiles>
        </ItemGroup>
      </Target>
    

相关问题