用于预览配置文件转换的工具

时间:2010-09-22 17:25:26

标签: visual-studio-2010 web-config configuration-files slowcheetah

是否有任何工具或Visual Studio 2010扩展允许我查看配置文件转换的输出,而不必发布整个项目?执行转换的过程是否可以直接调用?


修改

经过一番谷歌搜索后,我遇到了this

  

步骤4:从命令行为“暂存”环境生成新的转换后的web.config文件

     

打开Visual Studio命令提示符   去开始 - >程序文件 - >   Visual Studio v10.0 - >视觉工作室   工具 - > Visual Studio 10.0命令   提示

     

键入“MSBuild”应用程序的路径   项目文件(.csproj / .vbproj)“   /吨:TransformWebConfig   / p:Configuration = Staging“并点击   按如下所示输入:

     

commandline web.config transformation

     

转化成功后   “暂存”的web.config   配置将存储在obj下    - >项目根目录下的暂存文件夹(在解决方案资源管理器中,您可以   首先取消隐藏,访问此文件夹   隐藏文件):

     

transformed web.config

     
      
  • 在解决方案资源管理器中,单击按钮以显示隐藏文件
  •   
  • 打开Obj文件夹
  •   
  • 导航到您的Active配置(在我们当前的情况下,它是“Staging”)
  •   
  • 您可以在那里找到转换后的web.config
  •   
     

您现在可以验证新的   staging生成的web.config文件有   已更改的连接字符串部分。

     

来源:Web Deployment: Web.Config Transformation

这对我来说并不是一个完美的解决方案,因为它仍然需要构建整个项目 - 至少使用他发布的命令。如果有人知道如何使用MSBuild命令跳过构建步骤会有所帮助(尽管听起来有些不太可能)。

编辑2

我还在CodePlex上找到了这个Config Transformation Tool,它提供了一些很好的功能来扩展转换过程。这个工具是我所见过的最接近我正在寻找的功能的工具,并且是开发创建预览的扩展的一个很好的起点。它使用Microsoft.Web.Publishing.Tasks库来执行转换,而不依赖于构建实际项目。

4 个答案:

答案 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();
        }
    }
}