残念ながら、 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 が上書きされ、そうしないと間違ったファイルを変換してしまう可能性があるためです。