14

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


编辑

经过多一点谷歌搜索后,我遇到了这个

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

转到开始 --> 程序文件 -> Visual Studio v10.0 -> Visual Studio 工具 -> Visual Studio 10.0 命令提示符,打开 Visual Studio 命令提示符

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

命令行 web.config 转换

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

转换后的 web.config

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

您现在可以验证生成的新登台 web.config 文件是否具有更改的连接字符串部分。

来源:Web 部署:Web.Config 转换

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

编辑 2

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

4

4 回答 4

12

Visualstudiogallery 上的SlowCheetah VS 插件可让您预览转换结果

于 2011-08-26T08:52:07.037 回答
7

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

以下代码片段来自一个简单的类库,引用了 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 文件中的上下文菜单项。至少,您可以制作一个控制台实用程序或脚本来生成预览。

祝你好运!

于 2010-09-29T14:29:53.613 回答
2

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

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

此外,它对任何感兴趣的人都是开源的。

于 2014-01-16T19:12:59.960 回答
0

只是为了扩展一点。我需要上面讨论的内容。只能运行转换。然后将其连接到我的构建过程中,在我的例子中恰好是 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();
        }
    }
}

变换.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();
        }
    }
}
于 2014-11-21T16:36:17.713 回答