2012-04-30 26 views
8

Tôi cố gắng để chuyển đổi tất cả các file web.config trong một dự án tôi có, đây là một cấu trúc cây của tôi:Làm cách nào để có tác vụ msbuild thực hiện chuyển đổi cấu hình trên tập hợp các tệp?

  • Transform.bat
  • Transforms
    • ConfigTransform.proj
    • Web .Transform.config
  • website
    • web.config
    • Lần
      • web.config

Có nhiều file web.config, nhưng ý tưởng là điều này sẽ tìm thấy tất cả trong số họ và áp dụng cùng một cấu hình chuyển đổi về họ.

Tôi đã lấy một vài gợi ý từ a blog post I found nhưng tôi gặp khó khăn trong bước cuối cùng, việc chuyển đổi thực tế. Ngoài ra có một chút phần thô ở giữa mà tôi không thực sự thích (Tôi không hoàn toàn hiểu những gì tôi đang làm và tôi rõ ràng là làm sai). Đây là nơi tôi cho đến nay:

<Project ToolsVersion="4.0" DefaultTargets="Transform" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <UsingTask TaskName="TransformXml" AssemblyFile="Tools\Microsoft.Web.Publishing.Tasks.dll"/> 

    <PropertyGroup> 
     <SitePath>..\..\Website</SitePath> 
     <WebConfigTransformInputFile>$(SitePath)\Web.config</WebConfigTransformInputFile> 
     <WebConfigTransformFile>Web.Transform.config</WebConfigTransformFile> 
     <OutDir>..\N\N\</OutDir> 

    </PropertyGroup> 

    <ItemGroup> 
     <_FilesToTransform Include="$(SitePath)\**\web.config"/> 
    </ItemGroup> 

    <Target Name="Transform"> 

    <MakeDir Directories="@(_FilesToTransform->'$(OutDir)%(RelativeDir)')" /> 

    <TransformXml Source="@(_FilesToTransform->'$(OutDir)%(RelativeDir)%(Filename)%(Extension)')" 
        Transform="$(WebConfigTransformFile)" 
        Destination="@(_FilesToTransform->'$(OutDir)%(RelativeDir)%(Filename)%(Extension)')" /> 
    </Target> 
</Project> 

My Transform.bat trông như thế này:

%systemroot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe %CD%\Transforms\ConfigTransform.proj 

Vì vậy, khi tôi gọi là hàng loạt, các thư mục thích hợp được tạo ra. Tuy nhiên, như bạn có thể thấy tôi đã có một chút sáng tạo với OutDir, làm cho nó .. \ N \ N. Vì một lý do nào đó, nếu tôi không làm điều này, đường dẫn OutDir sẽ hoàn toàn giống với thư mục đầu vào. Vì vậy, tôi rõ ràng là cần phải thay đổi một cái gì đó trong MakeDir nhưng tôi không chắc chắn những gì.

Sự cố thực sự xảy ra khi bắt đầu thực hiện các biến đổi. Tôi đã cố gắng giữ cho thông số Nguồn Biến đổi như thế này hoặc như vậy:

@(_FilesToTransformNotAppConfig->'%(FullPath)') 

Trường hợp sau cung cấp cho tôi lỗi "Không thể mở tệp nguồn: Định dạng đường dẫn đã cho không được hỗ trợ". và cựu mang lại cho tôi kết quả này:

Build started 30-4-2012 14:02:48. 
Project "D:\Dev\transform\DoTransforms\Transforms\ConfigTransform.proj" on node 1 (default targets). 
Transform: 
    Creating directory "..\N\N\..\..\Website\Views\". 
    Transforming Source File: ..\N\N\..\..\Website\Views\Web.config;..\N\N\..\..\Website\Web.config 
D:\Dev\transform\DoTransforms\Transforms\ConfigTransform.proj(32,2): error : Could not open Source file: Could not find a part of the path 'D:\Dev\transform\DoTransforms\Website\Views\Web.config;\Website\Web.config'. 
    Transformation failed 
Done Building Project "D:\Dev\transform\DoTransforms\Transforms\ConfigTransform.proj" (default targets) -- FAILED. 

Build FAILED. 

Để tóm tắt câu hỏi của tôi:

  1. Làm thế nào để tránh những vấn đề đường dẫn cho các OutDir? Tôi đã không có nhiều đường dẫn nhưng tôi không thể làm đúng.
  2. Làm cách nào để tác vụ TransformXml chấp nhận nhiều tệp trong thuộc tính Nguồn?
+0

Trước khi đi vào nơi bạn đang ở, bạn có thể giải thích bạn đang cố gắng làm gì không? –

+0

Chuyển đổi tất cả các tệp cấu hình trong giải pháp của tôi. – sebastiaan

+0

Làm rõ trong bài (dưới cấu trúc cây). – sebastiaan

Trả lời

10

Tôi nghĩ bạn khá thân thiết. Tôi đã dán một mẫu dưới đây cho thấy làm thế nào để làm điều này.

Trong mẫu của tôi, tôi khám phá biến đổi đang ngồi bên cạnh tệp web.config. Đối với kịch bản của bạn, bạn chỉ có thể sử dụng một thuộc tính MSBuild trỏ đến một tệp cụ thể.

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="TransformAll" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 

    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)'=='' ">Release</Configuration> 
    <OutputFolder Condition=" '$(OutputFolder)'=='' ">C:\temp\transformed-files\</OutputFolder> 
    </PropertyGroup> 

    <!-- 
    This target shows how to transform web.config with a specific transform file associated to that specific web.config file. 
    --> 
    <Target Name="TransformAll"> 

    <!-- discover the files to transform --> 
    <ItemGroup> 
     <FilesToTransofm Include="$(MSBuildProjectDirectory)\**\web.config"/> 
    </ItemGroup> 

    <!-- Ensure all target directories exist --> 
    <MakeDir Directories="@(FilesToTransofm->'$(OutputFolder)%(RecursiveDir)')"/> 

    <!-- TransformXml only supports single values for source/transform/destination so use %(FilesToTransofm.Identity) 
     to sned only 1 value to it --> 
    <TransformXml Source="%(FilesToTransofm.Identity)" 
        Transform="@(FilesToTransofm->'%(RecursiveDir)web.$(Configuration).config')" 
        Destination="@(FilesToTransofm->'$(OutputFolder)%(RecursiveDir)web.config')" />  
    </Target> 

</Project> 

FYI bạn có thể tải xuống mẫu đầy đủ tại https://github.com/sayedihashimi/sayed-samples/tree/master/TransformMultipleWebConfigs.

+0

Tuyệt vời, với một chút tinh chỉnh để làm cho nó hoạt động theo cách tôi cần nó và bằng cách sửa lỗi với MakeDir (bạn quên dấu gạch chéo ngược) nó làm chính xác những gì tôi muốn! https://gist.github.com/2601426 – sebastiaan

+0

Một câu hỏi nữa: Tôi có thể làm $ (MSBuildProjectDirectory) \ ** \ web.config nhưng loại trừ web.config đầu tiên được tìm thấy (một trong thư mục gốc của trang web)? – sebastiaan

+1

FYI Tôi không quên dấu gạch chéo, nó đã được xác định trên bản thân tài sản. Trong MSBuild điển hình dấu gạch chéo được định nghĩa ở cuối thuộc tính để bạn không quên khi bạn sử dụng thuộc tính. Tôi khuyên bạn nên làm theo điều đó trừ khi bạn không thể vì lý do nào đó. Về câu hỏi khác của bạn, bạn nên thêm Exclude = "$ (MSBuildProjectDirectory) \ web.config" để bỏ qua root.config gốc. –

Các vấn đề liên quan