不幸的是, Visual Studio(2010 - 2019)在您调试时不直接支持它,它仅用于发布 - 即使扩展名为 SlowCheetah(标记答案)它对我也不起作用(仅适用于使用 app.config 而不是web.config)。
请注意,在 codeproject 中描述了一种解决方法 。
它描述了如何修改 .msproj 文件以通过转换后的版本覆盖当前的 web.config。
我将首先将该解决方法描述为Option 1,但我最近发现了另一个Option 2,它更易于使用(因此,如果您愿意,可以直接向下滚动到 option 2 ):
选项1:我添加了从原始代码项目文章中获取的说明(参见上面的链接),因为那里的屏幕截图已经消失了,我不想丢失整个信息:
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
为):Professional
VS 版本 路径 (for 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 在调试期间被覆盖,否则您最终可能会转换错误的文件。