2010-05-11 14 views
10

Tôi đã thiết lập một số biến đổi cấu hình trong web.config của tôi cho connectionStrings của tôi, vv Nhưng tôi đã tách ra một số khu vực của web.config của tôi thành các tệp riêng biệt, cũ) appSettings.config.Làm thế nào để sử dụng các biến đổi cấu hình mới của VS 2010 và áp dụng chúng cho các tệp .config khác?

Làm cách nào tôi có thể định cấu hình Visual Studio và MSBuild để thực hiện chuyển đổi cấu hình trên các tệp cấu hình bổ sung này?

Tôi đã làm theo cách tiếp cận của web.config để liên kết các tệp với nhau trong tệp dự án ứng dụng web của tôi, nhưng các phép biến đổi không tự động được áp dụng.

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

Trả lời

11

Theo mặc định mục tiêu quản lý việc chuyển đổi (TransformWebConfig) chỉ hoạt động trên web.config tập tin.


Để làm cho nó làm việc trong hồ sơ appSettings.config của bạn, bạn sẽ phải:

  • Đặt Build Action của tập tin của bạn để Content
  • Gọi MSBuild nhắm mục tiêu TransformWebConfig với ProjectConfigFileName=appSettings.configConfiguration=$(Configuration).

Để gọi MSBuild TransformWebConfig mục tiêu cho appSettings.config ngay sau khi việc chuyển đổi web.config file, bạn cần phải thêm này ở phần cuối của tập tin dự án của bạn:

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

Điều này dường như hoạt động. Tệp appSettings.config của tôi được chuyển đổi, nhưng trong quá trình triển khai, tệp cấu hình cuối cùng không được đặt vào thư mục đầu ra. –

+0

Tôi đã cập nhật mã để sử dụng BeforeTarget và AfterTarget thay vì ghi đè các mục tiêu phụ thuộc TransformWebConfig và để xử lý bước autoparametization. Bây giờ bạn tập tin cấu hình tùy chỉnh nên ở trong thư mục đầu ra với web.config –

+1

Tôi cũng đã thử giải pháp của bạn. Giống như @Wallace Breza, nó xuất hiện để làm việc: Tôi có thể xem các tập tin EntLib.config chuyển đổi trong obj \ $ (Cấu hình) \ TransformWebConfig \ chuyển đổi nhưng nó không được triển khai. Tôi đã thử bằng cách sử dụng (nhấp chuột phải vào dự án)> Xuất bản ... (Phương pháp xuất bản: Hệ thống tệp) và tiếp cận bằng cách sử dụng Project> Build Deployment Package mà sau đó tôi đã chạy trên một máy khác. Cả hai để lại cho tôi với EntLib.config ở dạng ban đầu của nó cộng với mỗi tệp EntLib. ($ Configuration) .config cùng với nó. – SGarratt

5

Cái gì đó làm cho điều này rất nhiều dễ dàng hơn, hãy xem phần bổ trợ SlowCheetah VS tại ... visualstudiogallery

+0

Cảm ơn bạn Steve !!! Tôi chắc chắn đồng ý với bạn. Dễ dàng hơn nhiều. Tôi đang tìm kiếm những gì bạn đề xuất chính xác. Cảm ơn :) – curiousBoy

3

Đây là mã hoạt động cho tôi:

<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> 
Các vấn đề liên quan