Visual Studio (2010-2019) , на жаль, не підтримує його безпосередньо під час налагодження, він призначений лише для публікації - навіть із розширенням SlowCheetah (позначена відповідь) він не працює для мене (лише для проектів, що використовують app.config, а не web.config).
Зверніть увагу, що існує обхідний шлях, описаний у codeproject .
Він описує, як змінити файл .msproj для перезапису поточного web.config трансформованою версією.
Спочатку я опишу це обхідне рішення як варіант 1 , але нещодавно я знайшов інший варіант 2 , який є простішим у використанні (тому ви можете прокрутити вниз до варіанту 2, якщо хочете):
Варіант 1: Я додав інструкції, взяті з оригінальної статті про кодовий проект (див. Посилання вище), тому що знімки екрана там уже пропали, і я не хочу втрачати всю інформацію:
VS.Net не виконує жодних перетворень, коли ви розробляєте і просто налагоджуєте місцеве середовище. Але є кілька кроків, які ви можете зробити, щоб це сталося, якщо хочете.
- Спочатку створіть потрібні конфігурації VS.Net , припускаючи, що налагодження та випуску за замовчуванням недостатньо для того, що ви намагаєтесь виконати.
- Клацніть правою кнопкою миші на вашому
web.config
та виберіть Додати конфігурацію перетворень - це створить залежну конфігурацію перетворення для кожної з визначених конфігурацій.
- Тепер ви можете перейменувати ваш
web.config
на web.base.config
.
- Додайте
web.config
до свого проекту. Не має значення, що в ній, оскільки він буде перезаписаний кожного разу, коли ми робимо збірку, але ми хочемо, щоб це була частина проекту, щоб VS.Net не давав нам спливаючого "Ваш проект не налаштований для налагодження" вгору.
- Відредагуйте файл
.csproj
проекту та додайте наступне TransformXml
завдання до цілі AfterBuild. Тут ви бачите, що я буду перетворювати web.base.config
файл за допомогою, web.[configuration].config
і він збереже його як web.config
. Для отримання детальної інформації перегляньте ці запитання та відповіді на Microsoft, а також інструкції щодо продовження збірки див. Там .
Варіант 2:
На основі цієї відповіді я розробив просту консольну програму TransformConfig.exe (у синтаксисі C # 6.0):
using System;
using System.Linq;
using Microsoft.Web.XmlTransform;
namespace TransformConfig
{
class Program
{
static int Main(string[] args)
{
var myDocumentsFolder = $@"C:\Users\{Environment.UserName}\Documents";
var myVsProjects = $@"{myDocumentsFolder}\Visual Studio 2015\Projects";
string srcConfigFileName = "Web.config";
string tgtConfigFileName = srcConfigFileName;
string transformFileName = "Web.Debug.config";
string basePath = myVsProjects + @"\";
try
{
var numArgs = args?.Count() ?? 0;
if (numArgs == 0 || args.Any(x=>x=="/?"))
{
Console.WriteLine("\nTransformConfig - Usage:");
Console.WriteLine("\tTransformConfig.exe /d:tgtConfigFileName [/t:transformFileName [/s:srcConfigFileName][/b:basePath]]");
Console.WriteLine($"\nIf 'basePath' is just a directory name, '{basePath}' is preceeded.");
Console.WriteLine("\nTransformConfig - Example (inside PostBuild event):");
Console.WriteLine("\t\"c:\\Tools\\TransformConfig.exe\" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config /b:\"$(ProjectDir)\\\"");
Environment.ExitCode = 1;
return 1;
}
foreach (var a in args)
{
var param = a.Trim().Substring(3).TrimStart();
switch (a.TrimStart().Substring(0,2).ToLowerInvariant())
{
case "/d":
tgtConfigFileName = param ?? tgtConfigFileName;
break;
case "/t":
transformFileName = param ?? transformFileName;
break;
case "/b":
var isPath = (param ?? "").Contains("\\");
basePath = (isPath == false)
? $@"{myVsProjects}\" + param ?? ""
: param;
break;
case "/s":
srcConfigFileName = param ?? srcConfigFileName;
break;
default:
break;
}
}
basePath = System.IO.Path.GetFullPath(basePath);
if (!basePath.EndsWith("\\")) basePath += "\\";
if (tgtConfigFileName != srcConfigFileName)
{
System.IO.File.Copy(basePath + srcConfigFileName,
basePath + tgtConfigFileName, true);
}
TransformConfig(basePath + tgtConfigFileName, basePath + transformFileName);
Console.WriteLine($"TransformConfig - transformed '{basePath + tgtConfigFileName}' successfully using '{transformFileName}'.");
Environment.ExitCode = 0;
return 0;
}
catch (Exception ex)
{
var msg = $"{ex.Message}\nParameters:\n/d:{tgtConfigFileName}\n/t:{transformFileName}\n/s:{srcConfigFileName}\n/b:{basePath}";
Console.WriteLine($"TransformConfig - Exception occurred: {msg}");
Console.WriteLine($"TransformConfig - Processing aborted.");
Environment.ExitCode = 2;
return 2;
}
}
public static void TransformConfig(string configFileName, string transformFileName)
{
var document = new XmlTransformableDocument();
document.PreserveWhitespace = true;
document.Load(configFileName);
var transformation = new XmlTransformation(transformFileName);
if (!transformation.Apply(document))
{
throw new Exception("Transformation Failed");
}
document.Save(configFileName);
}
}
}
Переконайтеся, що ви додали DLL "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
як посилання (цей приклад стосується VS 2015, для старих версій замініть v14.0
у шляху відповідний номер версії, наприклад v11.0
).
Для Visual Studio 2017, схема присвоєння імен шляху змінилося: наприклад, для корпоративної версії саме тут: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.
Я припускаю, що для професійної версії вам потрібно замінити Enterprise
шлях на Professional
. Якщо ви використовуєте попередню версію, додатково замініть2017
на Preview
.
Ось короткий огляд того, як шлях змінився для різних версій Visual Studio (якщо у вас немає версії Enterprise ви , можливо , буде потрібно замінити Enterprise
на Professional
в дорозі):
Шлях до Microsoft.Web.XmlTransform.dll
версії VS (для )
2015 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web
2017 C:\Program Files (x86)\Microsoft Visual Studio\2017\
Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
2019 C:\Program Files (x86)\Microsoft Visual Studio\2019\
Enterprise\MSBuild\Microsoft\VisualStudio\v16.0\Web
Скомпілюйте його та помістіть файл .exe у каталог, наприклад C:\MyTools\
.
Використання:
Ви можете використовувати його у своїй події після збірки (у властивостях проекту виберіть Збірки подій , а потім відредагуйте командний рядок Події збірки ). Параметри командного рядка (наприклад):
"C: \ MyTools \ TransformConfig.Exe" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b: "$ (ProjectDir) \"
тобто спочатку ім'я файлу конфігурації, за яким слідує файл конфігурації перетворення, після чого необов'язковий шаблон конфігурації, а потім шлях до вашого проекту, що містить обидва файли.
Я додав необов’язковий параметр конфігурації шаблону, оскільки в іншому випадку ваша початкова повна конфігурація буде замінена перетворенням, чого можна уникнути, надавши шаблон.
Створіть шаблон, просто скопіювавши оригінальний Web.config і назвіть його Web.Template.config.
Примітка:
Якщо ви бажаєте, ви також можете скопіювати TransformConfig.exe
файл у шлях Visual Studio, згаданий вище, де Microsoft.Web.XmlTransform.dll
знаходиться, і посилатися на нього у всіх своїх проектах, де вам потрібно перетворити ваші конфігурації.
Для тих з вас, хто задається питанням, чому я додав Environment.ExitCode = x;
завдання: Просто повернення int з Main не допомогло у події build. Подробиці дивіться тут.
Якщо ви публікуєте свій проект і використовуєте Web.Template.config, перед публікацією переконайтеся, що ви переробили своє рішення з правильною конфігурацією (як правило, Release). Причина полягає в тому, що Web.Config перезаписується під час налагодження, і в іншому випадку ви можете перетворити неправильний файл.