O Visual Studio (2010 - 2019) infelizmente não oferece suporte direto durante a depuração, ele se destina apenas à publicação - mesmo com a extensão SlowCheetah (resposta marcada), ele não funciona para mim (apenas para projetos que usam app.config em vez de web.config).
Observe que há uma solução alternativa descrita em codeproject .
Ele descreve como modificar o arquivo .msproj para substituir o web.config atual pela versão transformada.
Descreverei primeiro essa solução alternativa como Opção 1 , mas recentemente descobri outra Opção 2 , que é mais fácil de usar (portanto, você pode rolar para baixo até a opção 2 diretamente, se desejar):
Opção 1: adicionei as instruções retiradas do artigo original do codeproject (veja o link acima), porque as capturas de tela lá já sumiram e não quero perder todas as informações:
VS.Net não faz nenhuma transformação quando você está desenvolvendo e apenas depurando seu ambiente local. Mas existem algumas etapas que você pode seguir para que isso aconteça, se desejar.
- Primeiro, crie as configurações desejadas no VS.Net , assumindo que a depuração e a liberação padrão não são suficientes para o que você está tentando realizar.
- Clique com o botão direito em seu
web.config
e selecione Adicionar Transformações de Configuração - isso criará uma configuração de transformação dependente para cada uma das configurações definidas.
- Agora você pode renomear seu
web.config
para web.base.config
.
- Adicione um
web.config
ao seu projeto. Não importa o que está nele, porque ele será sobrescrito toda vez que fizermos uma compilação, mas queremos que faça parte do projeto para que o VS.Net não nos dê o pop-up "Seu projeto não está configurado para depuração" acima.
- Edite seu
.csproj
arquivo de projeto e adicione a seguinte TransformXml
tarefa ao destino AfterBuild. Aqui você pode ver que irei transformar o web.base.config
arquivo usando o web.[configuration].config
e salvarei como web.config
. Para obter detalhes, verifique este Q&A da Microsoft e, para obter instruções sobre como estender a compilação, consulte aqui .
Opção 2:
Com base nessa resposta, desenvolvi um aplicativo de console simples, TransformConfig.exe (na sintaxe 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);
}
}
}
Certifique-se de adicionar a DLL "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
como uma referência (este exemplo se aplica ao VS 2015, para versões mais antigas, substitua v14.0
no caminho pelo número de versão apropriado, por exemplo v11.0
).
Para Visual Studio 2017, o esquema de nomeação para o caminho foi alterado: Por exemplo, para a versão Enterprise é aqui: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.
Presumo que, para a versão profissional, você precise substituir Enterprise
no caminho por Professional
. Se você estiver usando a versão de visualização, substitua adicionalmente 2017
por Preview
.
Esta é uma visão geral de como o caminho mudou para diferentes versões do Visual Studio (se você não tiver a versão Enterprise, pode ser necessário substituir Enterprise
por Professional
no caminho):
Caminho da Microsoft.Web.XmlTransform.dll
versão do VS (para )
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
Compile-o e coloque o arquivo .exe em um diretório, por exemplo C:\MyTools\
.
Uso:
você pode usá-lo em seu evento de pós-construção (nas propriedades do projeto , selecione Eventos de construção e edite a linha de comando do evento de pós-construção ). Os parâmetros da linha de comando são (exemplo):
"C: \ MyTools \ TransformConfig.Exe" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b: "$ (ProjectDir) \"
ou seja, primeiro o nome do arquivo de configuração, seguido pelo arquivo de configuração de transformação, seguido por uma configuração de modelo opcional, seguido pelo caminho para seu projeto contendo ambos os arquivos.
Eu adicionei o parâmetro opcional de configuração do modelo porque, caso contrário, sua configuração completa original seria sobrescrita pela transformação, o que pode ser evitado fornecendo um modelo.
Crie o modelo simplesmente copiando o Web.config original e nomeie-o Web.Template.config.
Nota:
Se preferir, você também pode copiar o TransformConfig.exe
arquivo para o caminho do Visual Studio mencionado acima, onde Microsoft.Web.XmlTransform.dll
reside o, e consultá-lo em todos os seus projetos nos quais você precisa transformar suas configurações.
Para aqueles que estão se perguntando por que adicionei Environment.ExitCode = x;
atribuições: O simples retorno de um int de Main não ajudou no evento de construção. Veja os detalhes aqui.
Se você estiver publicando seu projeto e estiver usando um Web.Template.config, certifique-se de reconstruir sua solução com a configuração correta (geralmente Release) antes de publicar. A razão é que o Web.Config é sobrescrito durante a depuração e você pode acabar transformando o arquivo errado de outra forma.