不幸的是,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
。
以下是针对不同版本的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\
。
用法:
您可以在构建后事件中使用它(在项目属性中,选择Build Events,然后编辑构建后事件命令行)。命令行参数为(示例):
“ C:\ MyTools \ TransformConfig.Exe” /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b:“ $(ProjectDir)\”
即,首先是配置文件的名称,然后是转换配置文件,然后是可选的模板配置,然后是包含两个文件的项目路径。
我添加了可选的模板config参数,因为否则您的原始完整配置会被转换覆盖,而通过提供模板可以避免这种情况。
通过简单地复制原始Web.config并将其命名为Web.Template.config来创建模板。
注意:
如果愿意,还可以将TransformConfig.exe
文件复制到上面提到的Visual Studio路径中,并将其复制到Microsoft.Web.XmlTransform.dll
需要转换配置的所有项目中。
对于那些想知道为什么我要添加Environment.ExitCode = x;
任务的人:从Main返回一个int并不能帮助build事件。在这里查看详细信息。
如果要发布项目,并且正在使用Web.Template.config,请确保在发布之前使用正确的配置(通常是Release)对解决方案进行了重建。原因是在调试过程中Web.Config被覆盖,否则您可能最终会转换错误的文件。