8

私が持っているプロジェクト内のすべての web.config ファイルを変換しようとしています。これが私のツリー構造です:

  • Transform.bat
  • 変換
    • ConfigTransform.proj
    • Web.Transform.config
  • Webサイト
    • web.config
    • ビュー
      • web.config

他にも web.config ファイルがありますが、アイデアは、これがそれらすべてを見つけて、それらに同じ構成変換を適用することです。

見つけたブログ投稿からいくつかのヒントを得ましたが、最後のステップである実際の変換で行き詰まりました。また、途中でちょっと大雑把な部分がありますが、これはあまり好きではありません (自分が何をしているのかよくわかりませんし、明らかに間違っています)。これが私がこれまでのところです:

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

私の Transform.bat は次のようになります。

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

したがって、バッチを呼び出すと、適切なディレクトリが作成されます。ただし、ご覧のとおり、OutDir を少し工夫して ..\N\N にする必要がありました。何らかの理由で、これを行わないと、OutDir パスは入力ディレクトリとまったく同じになります。したがって、明らかに MakeDir で何かを変更する必要がありますが、何がわからないのですか。

本当の問題は、変換を開始するときに発生します。TransformXml Source パラメーターを次のように維持しようとしました。

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

後者では、「ソース ファイルを開けませんでした: 指定されたパスの形式はサポートされていません」というエラーが表示されます。そして前者は私にこの出力を与えます:

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.

私の質問を要約すると:

  1. OutDir のパスの問題を回避するにはどうすればよいですか? 複数のパスをいじりましたが、うまくいきません。
  2. Source 属性で複数のファイルを受け入れるように TransformXml タスクを取得するにはどうすればよいですか?
4

1 に答える 1

11

かなり近かったと思います。これを行う方法を示すサンプルを以下に貼り付けました。

私のサンプルでは、​​変換が web.config ファイル自体の隣にあることを発見しました。あなたのシナリオでは、特定のファイルを指す MSBuild プロパティを使用できます。

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

参考までに、 https://github.com/sayedihashimi/sayed-samples/tree/master/TransformMultipleWebConfigsで完全なサンプルをダウンロードできます。

于 2012-05-02T06:22:26.930 に答える