Visual Studio( 2010-2019 )は、残念ながら、デバッグ中は直接サポートしていません。公開のみを目的としています。拡張子がSlowCheetah(回答のマークが付いている)であっても、機能しません(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
。詳細については、確認してください。このマイクロソフト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
。
ここでは(あなたが交換する必要があるかもしれませんEnterpriseバージョンがない場合は、パスは、Visual Studioの異なるバージョンのためにどのように変化したかを概観だ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が上書きされ、そうしないと間違ったファイルを変換してしまう可能性があるためです。