很不幸,
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.[configuration].config
转换web.base.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
。
我假设对于专业版,您需要在路径中用
Professional
替换
Enterprise
。如果您使用预览版,则还需要将
2017
替换为
Preview
。
以下是不同版本的Visual Studio中路径的概述(如果您没有企业版,则可能需要在路径中用
Professional
替换
Enterprise
):
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,请确保在发布之前使用正确的配置(通常是Release)对解决方案进行了重新生成。原因是在调试期间会覆盖Web.Config,否则可能会转换错误的文件。