【问题标题】:Tools for previewing configuration file transformations用于预览配置文件转换的工具
【发布时间】:2011-04-15 21:01:01
【问题描述】:

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


编辑

在谷歌搜索之后,我发现了this

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

通过以下方式打开 Visual Studio 命令提示符 开始->程序文件-> Visual Studio v10.0 –> Visual Studio 工具 –> Visual Studio 10.0 命令 提示

键入“MSBuild”应用程序路径 项目文件(.csproj/.vbproj)” /t:TransformWebConfig /p:Configuration=Staging" 然后点击 如下图输入:

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

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

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

来源:Web Deployment: Web.Config Transformation

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

编辑 2

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

【问题讨论】:

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


    【解决方案1】:

    只是稍微扩展一下。 我需要上面讨论的内容。只能运行转换。 然后将其连接到我的构建过程中,在我的例子中恰好是 TeamCity。

    您将需要使用 Microsoft.Web.Publishing.Tasks,您可以使用 Nuget 将其粉碎。好吧,我在 VS2013 中,所以我可以。我敢肯定,否则你可以获取 dll。

    编写了一个简单的控制台应用程序。您可能会发现它很有用。

    程序.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();
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      旧帖子,但我想我会与快速谷歌分享我发现的内容(对于那些可能没有找到或先在这里尝试过的人):

      Web.config Transformation Tester - By AppHarbor
      只需将原始 XML 与转换 XML 一起粘贴,即可立即查看结果。

      另外,任何有兴趣的人都可以使用open source

      【讨论】:

        【解决方案3】:

        visualstudiogallery 上的 SlowCheetah VS 插件允许您预览转换结果

        【讨论】:

        • 是的,SlowCheetah 将其变为右键单击,因此非常适合此操作
        • 在与变换斗争了半个小时之后,我想我会用谷歌搜索变换工具,来到这里,安装它,它立即显示了我的问题。 2分钟内修复。添加到我的“必备品,以前没有它我是怎么做到的?”工具包。
        【解决方案4】:

        您可以使用 MSBuild 任务使用的相同对象转换配置文件,完全绕过 MSBuild。 Web 配置转换逻辑包含在 Microsoft.Web.Publishing.Tasks 库中。

        以下代码 sn-p 来自一个简单的类库,引用 Microsoft.Web.Publishing.Tasks 库(安装在我的机器上的 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10 .0\Web)。

        示例加载源文档和转换,应用转换,并将结果写入新文件。

        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”段落的扩展。我觉得至少需要这样的工具,我开始自己组装。运气好的话,我希望在不久的将来在扩展库上发布一些东西。感谢您的意见!
        • @Nathan:祝你好运。我期待看到它。 CodePlex 工具通过调用 MSBuild 工作。对于自定义工具,您可能希望直接使用该库,如图所示。帮我一个忙,完成后添加评论。祝你好运!
        • 我最初也认为它可以通过调用 MSBuild 来工作,但在浏览了源代码后,我意识到他正在使用您上面提到的库。从外观上看,构建扩展的功能原型应该不难。
        • @Nathan - 不错。感谢您的跟进。
        猜你喜欢
        • 1970-01-01
        • 2014-04-28
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 2019-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多