95

.NET MVC 3.0 アプリケーションでは、次の構成を使用していますappSettings

web.config

<appSettings>
<add key="SMTPHost" value="mail.domain.com"/>
    <add key="SMTPUsername" value="user@gmail.com"/>
    <add key="SMTPPort" value="25"/>
    <add key="SMTPPwd" value="mypassword"/>
    <add key="EmailFrom" value="notific@gmail.com"/>
</appSettings>

デバッグのために、次の構成変換を定義しました。

web.Debug.config

<appSettings>
    <add  key="SMTPPort" value="58" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>

また、アプリケーションをデバッグ モードで実行していますが、SMTP ポートは からでweb.configはなくから値を取得していweb.Debug.configます。

この構成で何が間違っている可能性があるかを誰かが提案できますか?

4

10 に答える 10

167

Web.config 変換は、発行操作の一部としてのみ適用されます。

これをapp.configビルド操作の一部として実行したい場合は、SlowCheetah - XML Transforms Visual Studio プラグインを使用できます。

http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

于 2012-01-12T19:28:04.137 に答える
35

残念ながら、 Visual Studio (2010 - 2019)はデバッグ中に直接サポートしていません。これは公開のみを目的としています - 拡張機能 SlowCheetah (マーク付きの回答) を使用しても機能しません (app.config ではなく app.config を使用するプロジェクトのみ)。 web.config)。

codeproject で説明されている回避策 があることに注意してください。

.msproj ファイルを変更して、変換されたバージョンで現在の web.config を上書きする方法について説明します。

最初にその回避策をオプション 1として説明しますが、最近別のオプション 2を見つけました。これは使いやすいです (したがって、必要に応じてオプション 2 まで直接スクロールしてください)。


オプション 1:元のcodeproject 記事(上記のリンクを参照)から取った手順を追加しました。そこにあるスクリーン ショットは既になくなっており、情報全体を失いたくないからです。

VS.Net は、ローカル環境を開発してデバッグするだけの場合、変換を行いません。ただし、必要に応じて、これを実現するために実行できる手順がいくつかあります。

  • 最初に、VS.Netで必要な構成を作成します。デフォルトのデバッグとリリースでは、目的を達成するには不十分であると想定します。
  • を右クリックして[構成変換の追加web.config]を選択します。これにより、定義された構成ごとに依存する変換構成が作成されます。
  • web.configこれで、名前をに変更できますweb.base.config
  • プロジェクトに を追加web.configします。ビルドを行うたびに上書きされるため、何が含まれているかは問題ではありませんが、プロジェクトの一部にしたいので、VS.Net「あなたのプロジェクトはデバッグ用に構成されていません」というポップアップを表示しません。上。
  • .csprojプロジェクト ファイルを編集し、次のTransformXmlタスクを AfterBuild ターゲットに追加します。web.base.configここで、を使用してファイルを変換し、web.[configuration].configとして保存することがわかりますweb.config。詳細については、このMicrosoft Q&A を確認してください。ビルドを拡張する方法については、こちらを参照しください。

オプション 2:

この回答に基づいて、単純なコンソール アプリ TransformConfig.exe (C# 6.0 構文) を開発しました。

using System;
using System.Linq;
using Microsoft.Web.XmlTransform;

namespace TransformConfig
{

  class Program
  {
    static int Main(string[] args)
    {
        var myDocumentsFolder = $@"C:\Users\{Environment.UserName}\Documents";
        var myVsProjects = $@"{myDocumentsFolder}\Visual Studio 2015\Projects";

        string srcConfigFileName = "Web.config";
        string tgtConfigFileName = srcConfigFileName;
        string transformFileName = "Web.Debug.config";
        string basePath = myVsProjects + @"\";
        try
        {

            var numArgs = args?.Count() ?? 0;
            if (numArgs == 0 || args.Any(x=>x=="/?"))
            {
                Console.WriteLine("\nTransformConfig - Usage:");
                Console.WriteLine("\tTransformConfig.exe /d:tgtConfigFileName [/t:transformFileName [/s:srcConfigFileName][/b:basePath]]");
                Console.WriteLine($"\nIf 'basePath' is just a directory name, '{basePath}' is preceeded.");
                Console.WriteLine("\nTransformConfig - Example (inside PostBuild event):");
                Console.WriteLine("\t\"c:\\Tools\\TransformConfig.exe\"  /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config /b:\"$(ProjectDir)\\\"");
                Environment.ExitCode = 1;
                return 1;
            }

            foreach (var a in args)
            {
                var param = a.Trim().Substring(3).TrimStart();
                switch (a.TrimStart().Substring(0,2).ToLowerInvariant())
                {
                    case "/d":
                        tgtConfigFileName = param ?? tgtConfigFileName;
                        break;
                    case "/t":
                        transformFileName = param ?? transformFileName;
                        break;
                    case "/b":
                        var isPath = (param ?? "").Contains("\\");
                        basePath = (isPath == false)
                                    ? $@"{myVsProjects}\" + param ?? ""
                                    : param;
                        break;
                    case "/s":
                        srcConfigFileName = param ?? srcConfigFileName;
                        break;
                    default:
                        break;
                }
            }
            basePath = System.IO.Path.GetFullPath(basePath);
            if (!basePath.EndsWith("\\")) basePath += "\\";
            if (tgtConfigFileName != srcConfigFileName)
            {
                System.IO.File.Copy(basePath + srcConfigFileName,
                                     basePath + tgtConfigFileName, true);
            }
            TransformConfig(basePath + tgtConfigFileName, basePath + transformFileName);
            Console.WriteLine($"TransformConfig - transformed '{basePath + tgtConfigFileName}' successfully using '{transformFileName}'.");
            Environment.ExitCode = 0;
            return 0;
        }
        catch (Exception ex)
        {
            var msg = $"{ex.Message}\nParameters:\n/d:{tgtConfigFileName}\n/t:{transformFileName}\n/s:{srcConfigFileName}\n/b:{basePath}";
            Console.WriteLine($"TransformConfig - Exception occurred: {msg}");
            Console.WriteLine($"TransformConfig - Processing aborted.");
            Environment.ExitCode = 2;
            return 2;
        }
    }

    public static void TransformConfig(string configFileName, string transformFileName)
    {
        var document = new XmlTransformableDocument();
        document.PreserveWhitespace = true;
        document.Load(configFileName);

        var transformation = new XmlTransformation(transformFileName);
        if (!transformation.Apply(document))
        {
            throw new Exception("Transformation Failed");
        }
        document.Save(configFileName);
    }

  }
}

必ず DLL"C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"を参照として追加してください (この例は VS 2015 に適用されます。古いバージョンの場合v14.0は、パス内の を適切なバージョン番号 (例: ) に置き換えますv11.0)。

Visual Studio 2017 では、パスの名前付けスキーマが変更されました。たとえば、エンタープライズ バージョンの場合は次のとおりです: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
プロフェッショナル版Enterpriseでは、パスを に置き換える必要があると思いますProfessional。プレビュー版を使用している場合は、さらに に置き換え2017ますPreview

Visual Studio のさまざまなバージョンでパスがどのように変更されたかの概要を以下に示します (Enterprise バージョンがない場合は、パスで置き換える必要がある場合がありEnterpriseますProfessional)。

VS バージョン        パス (の場合Microsoft.Web.XmlTransform.dll)
2015                   C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web
2017                   C:\Program Files (x86)\Microsoft Visual Studio\2017\
                          Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
2019                  C:\Program Files (x86)\Microsoft Visual Studio\2019\
                          Enterprise\MSBuild\Microsoft\VisualStudio\v16.0\Web

それをコンパイルし、.exe ファイルをディレクトリに配置しますC:\MyTools\

使用法:ビルド後のイベント で使用できます(プロジェクト プロパティで [ビルド イベント]を選択し、[ビルド後のイベント コマンド ライン]を編集します)。コマンドライン パラメータは次のとおりです (例):

"C:\MyTools\TransformConfig.Exe" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config /b:"$(ProjectDir)\"

つまり、最初に構成ファイルの名前、次に変換構成ファイル、その後にオプションのテンプレート構成、その後に両方のファイルを含むプロジェクトへのパスが続きます。

オプションのテンプレート構成パラメーターを追加しました。そうしないと、元の完全な構成が変換によって上書きされ、テンプレートを提供することで回避できるためです。

元の Web.config をコピーするだけでテンプレートを作成し、Web.Template.config という名前を付けます。

ノート:

  • TransformConfig.exe必要に応じて、ファイルが存在する上記の Visual Studio パスにファイルをコピーしMicrosoft.Web.XmlTransform.dll、構成を変換する必要があるすべてのプロジェクトで参照することもできます。

  • なぜEnvironment.ExitCode = x;割り当てを追加したのか疑問に思っている方のために: Main から単に int を返すだけでは、ビルド イベントでは役に立ちませんでした。詳細はこちらをご覧ください。

  • プロジェクトを発行していて、Web.Template.config を使用している場合は、発行する前に、正しい構成 (通常はリリース) でソリューションを再構築したことを確認してください。その理由は、デバッグ中に Web.Config が上書きされ、そうしないと間違ったファイルを変換してしまう可能性があるためです。

于 2013-06-27T06:29:12.860 に答える
24

問題を引き起こすため、質問への回答は簡単ではありません-Web.configをWeb.debug.configで変換する場合-変換効果をどこに保存する必要がありますか? Web.config自体で?これにより、変換ソース ファイルが上書きされます。おそらくそれが、Visual Studio がビルド中に変換を行わない理由です。

以前のマットの回答は有効ですが、アクティブなソリューション構成をデバッグからリリースなどに実際に変更するときに機能する一般的なソリューションを使用するために、それらを混在させたい場合があります。簡単な解決策は次のとおりです。

  1. 構成の構成変換を作成します (デバッグ、リリースなど)。
  2. Web.configファイルの名前を次のように変更Web.base.config- 変換はそれに応じて自動的に名前を変更する必要があります (Web.base.Debug.configなど)
  3. 次のtransformWebConfig.proj XML ファイルをプロジェクト フォルダーに追加します。
<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="4.0" DefaultTargets="TransformWebConfig" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="TransformWebConfig">
    <TransformXml Source="Web.base.config" Transform="Web.base.$(CurrentConfig).config" Destination="Web.config" />
  </Target>
</Project>
  1. プロジェクトのプロパティに移動し、 [ビルド イベント] を選択して、ビルド後のイベント コマンド ラインに次の内容を追加します。
@if exist "%ProgramFiles(x86)%\MSBuild\12.0\bin" set PATH=%ProgramFiles(x86)%\MSBuild\12.0\bin;%PATH%
msbuild $(ProjectDir)transformWebConfig.proj /t:TransformWebConfig /p:CurrentConfig=$(ConfigurationName) /p:TargetProjectName=$(TargetPath)

これで、ソリューションをビルドすると、アクティブな構成の有効な変換を含む Web.config ファイルが作成されます。

于 2016-01-21T15:05:58.157 に答える
0

どうやらVisual Studio 2015の拡張機能があるようです

https://visualstudiogallery.msdn.microsoft.com/05bb50e3-c971-4613-9379-acae2cfe6f9e

このパッケージを使用すると、ビルド構成に基づいて app.config またはその他の XML ファイルを変換できます。

于 2016-09-17T18:01:41.280 に答える