Инструменты для предварительного просмотра преобразований файла конфигурации

Существуют ли какие-либо инструменты или расширения Visual Studio 2010, которые позволяют мне просматривать результат преобразования файла конфигурации без публикации всего проекта? Вызывается ли процесс, выполняющий преобразование, напрямую?


Изменить

Еще немного погуглив, я наткнулся на это:

Шаг 4. Создание нового преобразованного файла web.config для «промежуточной» среды из командной строки

Откройте командную строку Visual Studio, выбрав Пуск -> Программные файлы -> Visual Studio v10.0 -> Инструменты Visual Studio -> Командная строка Visual Studio 10.0.

Введите «MSBuild« Путь к файлу проекта приложения (.csproj / .vbproj) »/ t: TransformWebConfig / p: Configuration = Staging» и нажмите Enter, как показано ниже:

преобразование командной строки web.config

После успешного преобразования web.config для «промежуточной» конфигурации будет сохранен в папке obj -> Staging в корне вашего проекта (в обозревателе решений вы можете получить доступ к этой папке, сначала отключив скрытые файлы):

преобразованный web.config

  • В обозревателе решений нажмите кнопку, чтобы отобразить скрытые файлы.
  • Откройте папку Obj
  • Перейдите к своей активной конфигурации (в нашем текущем случае это «Промежуточная»).
  • Вы можете найти преобразованный файл web.config там

Теперь вы можете убедиться, что сгенерированный новый промежуточный файл web.config содержит измененный раздел строки подключения.

Источник: Веб-развертывание: преобразование Web.Config

На самом деле это не идеальное решение для меня, поскольку для него все еще требуется собрать весь проект - по крайней мере, с помощью команды, которую он опубликовал. Если кто-нибудь знает, как пропустить этап сборки с помощью команды MSBuild, это будет полезно (хотя это звучит несколько маловероятно).

Изменить 2

Я также нашел этот инструмент преобразования конфигурации на CodePlex, который предлагает некоторые полезные функции для расширения процесса преобразования. Это инструмент, который я видел ближе всего к той функциональности, которую я ищу, и мог бы стать отличной отправной точкой для разработки расширения, которое создает превью. Он использует библиотеку Microsoft.Web.Publishing.Tasks для выполнения преобразования и не зависит от создания реального проекта.


person Nathan Taylor    schedule 22.09.2010    source источник


Ответы (4)


Надстройка SlowCheetah VS в visualstudiogallery позволяет предварительно просмотреть результаты преобразования.

person SteveC    schedule 26.08.2011
comment
Да, SlowCheetah превращает это в щелчок правой кнопкой мыши, поэтому он идеально подходит для этого - person Sayed Ibrahim Hashimi; 11.02.2012
comment
После борьбы с преобразованием в течение последних получаса подумал, что я могу найти в Google инструменты преобразования, пришел сюда, установил его и сразу показал мою проблему. Исправлено за 2 мин. Добавлен в мой must-have, как я раньше обходился без него? Инструментарий. - person Fetchez la vache; 28.08.2015

Вы можете преобразовать файл конфигурации, используя те же объекты, что и задача MSBuild, полностью минуя MSBuild. Логика преобразования веб-конфигурации содержится в библиотеке 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. По крайней мере, вы можете создать консольную утилиту или сценарий для создания превью.

Удачи!

person kbrimington    schedule 29.09.2010
comment
по сути, это расширение моего абзаца Edit 2. Я чувствую, что есть хоть какая-то потребность в таком инструменте, и я сам начинаю складывать части воедино. Если повезет, я надеюсь выпустить что-нибудь в галерее расширений в ближайшем будущем. Спасибо за вклад! - person Nathan Taylor; 29.09.2010
comment
@ Натан: Удачи с расширением. Я с нетерпением жду этого. Инструмент CodePlex работает путем вызова MSBuild. Для специального инструмента вы, вероятно, захотите использовать библиотеку напрямую, как показано. Сделайте мне одолжение и добавьте комментарий, когда закончите. Удачи! - person kbrimington; 29.09.2010
comment
Я также сначала думал, что это сработает, вызвав MSBuild, но после просмотра источника я понял, что он использует библиотеки, о которых вы упомянули выше. Судя по всему, построить функциональный прототип расширения не составит труда. - person Nathan Taylor; 30.09.2010
comment
@ Натан - Прекрасно. Спасибо за продолжение. - person kbrimington; 30.09.2010

Старый пост, но подумал, что поделюсь тем, что нашел, с помощью быстрого google (для тех, кто, возможно, не нашел его или не попробовал сначала):

Web.config Transformation Tester - By AppHarbor
Просто вставьте исходный XML вместе с преобразованием XML и мгновенно увидеть результат.

Кроме того, это открытый исходный код для всех, кому это интересно.

person Brad Christie    schedule 16.01.2014

Просто чтобы немного расширить это. Мне нужно было именно то, о чем говорилось выше. Чтобы иметь возможность запускать только преобразование. Затем подключите это к моему процессу сборки, который в моем случае является 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();
        }
    }
}
person DrLazer    schedule 21.11.2014