是否有任何工具或Visual Studio 2010扩展允许我查看配置文件转换的输出,而不必发布整个项目?执行转换的过程是否可以直接调用?
修改
经过一番谷歌搜索后,我遇到了this:
步骤4:从命令行为“暂存”环境生成新的转换后的web.config文件
打开Visual Studio命令提示符 去开始 - >程序文件 - > Visual Studio v10.0 - >视觉工作室 工具 - > Visual Studio 10.0命令 提示
键入“MSBuild”应用程序的路径 项目文件(.csproj / .vbproj)“ /吨:TransformWebConfig / p:Configuration = Staging“并点击 按如下所示输入:
转化成功后 “暂存”的web.config 配置将存储在obj下 - >项目根目录下的暂存文件夹(在解决方案资源管理器中,您可以 首先取消隐藏,访问此文件夹 隐藏文件):
- 在解决方案资源管理器中,单击按钮以显示隐藏文件
- 打开Obj文件夹
- 导航到您的Active配置(在我们当前的情况下,它是“Staging”)
- 您可以在那里找到转换后的web.config
您现在可以验证新的 staging生成的web.config文件有 已更改的连接字符串部分。
这对我来说并不是一个完美的解决方案,因为它仍然需要构建整个项目 - 至少使用他发布的命令。如果有人知道如何使用MSBuild命令跳过构建步骤会有所帮助(尽管听起来有些不太可能)。
编辑2
我还在CodePlex上找到了这个Config Transformation Tool,它提供了一些很好的功能来扩展转换过程。这个工具是我所见过的最接近我正在寻找的功能的工具,并且是开发创建预览的扩展的一个很好的起点。它使用Microsoft.Web.Publishing.Tasks库来执行转换,而不依赖于构建实际项目。
答案 0 :(得分:12)
visualstudiogallery上的SlowCheetah VS加载项允许您预览转换结果
答案 1 :(得分:7)
您可以使用MSBuild任务使用的相同对象转换配置文件,完全绕过MSBuild。 Web配置转换逻辑包含在Microsoft.Web.Publishing.Tasks库中。
以下代码片段来自一个简单的类库,引用了Microsoft.Web.Publishing.Tasks库(它安装在我的机器上的C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0中) \网络)。
示例加载源文档并进行转换,应用转换,并将结果写入新文件。
using System;
using Microsoft.Web.Publishing.Tasks;
// ...
var xmlTarget = new XmlTransformableDocument();
xmlTarget.PreserveWhitespace = true;
xmlTarget.Load("Web.config");
var xmlTransform = new XmlTransformation("Web.Release.config");
if (xmlTransform.Apply(xmlTarget))
xmlTarget.Save("Web.Transformed.config");
else
Console.WriteLine("Unable to apply transform.");
通过一点创造力,这个简单的解决方案可以集成到Visual Studio插件中,可能作为web.config文件中的上下文菜单项。至少,您可以创建一个控制台实用程序或脚本来生成预览。
祝你好运!答案 2 :(得分:2)
旧帖子,但我想我会分享我用快速谷歌找到的东西(对于那些可能没有找到它或先在这里尝试过的人):
<强> Web.config Transformation Tester - By AppHarbor 强>
只需将原始XML与转换XML一起粘贴,即可立即查看结果。
此外,对于任何有兴趣的人来说都是open source。
答案 3 :(得分:0)
只是为了扩展这一点。 我完全需要上面讨论的内容。只能运行转换。 然后将其挂钩到我的构建过程中,恰好是我的案例中的TeamCity。
您需要使用Microsoft.Web.Publishing.Tasks,您可以使用Nuget粉碎它。好吧,我在VS2013,所以我可以。我确定你可以获得dll。
写了一个简单的控制台应用程序。您可能会发现它很有用。
Program.cs的
using System;
namespace WebConfigTransform
{
class Program
{
static void Main(string[] args)
{
if (args.Length != 3)
{
Console.WriteLine("Config Gen ... usage -source -transform -destination");
Environment.Exit(-1);
}
Transform t = new Transform(args[0], args[1], args[2]);
t.Run();
}
}
}
Transform.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Security;
using System.Security.Permissions;
using Microsoft.Web.XmlTransform;
namespace WebConfigTransform
{
class Transform
{
private readonly string m_source;
private readonly string m_transform;
private readonly string m_destination;
public Transform(string source, string transform, string destination)
{
m_source = source;
m_transform = transform;
m_destination = destination;
}
private void TransformFiles()
{
var xmlTarget = new XmlTransformableDocument();
xmlTarget.PreserveWhitespace = true;
xmlTarget.Load(m_source);
var xmlTransform = new XmlTransformation(m_transform);
if (xmlTransform.Apply(xmlTarget))
xmlTarget.Save(m_destination);
else
{
Console.WriteLine("Unable to apply transform.");
Environment.Exit(-1);
}
}
private void CheckPermissions()
{
string directoryName = m_destination;
PermissionSet permissionSet = new PermissionSet(PermissionState.None);
FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, directoryName);
permissionSet.AddPermission(writePermission);
if (!(permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet)))
{
Console.WriteLine("Cannot write to file : " + m_destination);
Environment.Exit(-1);
}
}
private void CheckFileExistance()
{
List<string> ls = new List<string>();
ls.Add(m_source);
ls.Add(m_transform);
foreach (string item in ls)
{
if (!File.Exists(item))
{
Console.WriteLine("Cannot locate file : " + item);
Environment.Exit(-1);
}
}
}
public void Run()
{
CheckFileExistance();
CheckPermissions();
TransformFiles();
}
}
}