Visual Studio (2010-2019) ne le prend malheureusement pas directement en charge pendant le débogage, il est uniquement destiné à la publication - même avec l'extension SlowCheetah (réponse marquée) cela ne fonctionne pas pour moi (uniquement pour les projets utilisant app.config plutôt que web.config).
Notez qu'il existe une solution de contournement décrite dans codeproject .
Il décrit comment modifier le fichier .msproj pour remplacer le fichier web.config actuel par la version transformée.
Je vais d'abord décrire cette solution de contournement comme l' option 1 , mais j'ai récemment découvert une autre option 2 , qui est plus facile à utiliser (vous pouvez donc faire défiler jusqu'à l'option 2 directement si vous le souhaitez):
Option 1: J'ai ajouté les instructions tirées de l' article d' origine du projet de code (voir le lien ci-dessus), car les captures d'écran y sont déjà parties et je ne veux pas perdre toutes les informations:
VS.Net n'effectue aucune transformation lorsque vous développez et déboguez simplement votre environnement local. Mais si vous le souhaitez, vous pouvez suivre certaines étapes pour y parvenir.
- Tout d'abord, créez les configurations souhaitées dans VS.Net , en supposant que le débogage et la publication par défaut ne suffisent pas pour ce que vous essayez d'accomplir.
- Cliquez avec le bouton droit sur votre
web.config
et sélectionnez Ajouter des transformations de configuration - cela créera une configuration de transformation dépendante pour chacune de vos configurations définies.
- Vous pouvez maintenant renommer votre
web.config
en web.base.config
.
- Ajoutez un
web.config
à votre projet. Peu importe ce qui est en elle , car elle écrasés chaque fois que nous compilons , mais nous voulons qu'elle partie du projet afin VS.Net ne nous donne pas le « Votre projet n'est pas configuré pour le débogage » pop- vers le haut.
- Modifiez votre
.csproj
fichier de projet et ajoutez la TransformXml
tâche suivante à la cible AfterBuild. Ici, vous pouvez voir que je vais transformer le web.base.config
fichier en utilisant le web.[configuration].config
et il l'enregistrera sous web.config
. Pour plus de détails, veuillez consulter ce Microsoft Q&A et pour savoir comment étendre la version, regardez là .
Option 2:
Sur la base de cette réponse, j'ai développé une application console simple, TransformConfig.exe (dans la syntaxe 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);
}
}
}
Assurez-vous d'ajouter la DLL "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
comme référence (cet exemple s'applique à VS 2015, pour les anciennes versions, remplacez le v14.0
dans le chemin par le numéro de version approprié, par exemple v11.0
).
Pour Visual Studio 2017, le schéma de nommage pour le chemin a changé: Par exemple, pour la version entreprise est ici: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.
Je suppose que pour la version professionnelle, vous devez remplacer Enterprise
le chemin par Professional
. Si vous utilisez la version préliminaire, remplacez-la également 2017
par Preview
.
Voici un aperçu de la façon dont le chemin a changé pour différentes versions de Visual Studio (si vous ne disposez pas de la version Entreprise, vous devrez peut-être remplacer Enterprise
par Professional
dans le chemin):
Chemin de la Microsoft.Web.XmlTransform.dll
version VS (pour )
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
Compilez-le et placez le fichier .exe dans un répertoire, par exemple C:\MyTools\
.
Utilisation:
vous pouvez l'utiliser dans votre événement post-build (dans les propriétés du projet , sélectionnez Événements de génération , puis modifiez la ligne de commande de l'événement post-build ). Les paramètres de ligne de commande sont (exemple):
"C: \ MesOutils \ TransformConfig.Exe" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b: "$ (ProjectDir) \"
c'est-à-dire d'abord le nom du fichier de configuration, suivi du fichier de configuration de transformation, suivi d'un modèle de configuration optionnel, suivi du chemin vers votre projet contenant les deux fichiers.
J'ai ajouté le paramètre de configuration de modèle facultatif, car sinon votre configuration complète d'origine serait écrasée par la transformation, ce qui peut être évité en fournissant un modèle.
Créez le modèle en copiant simplement le Web.config d'origine et nommez-le Web.Template.config.
Remarque:
Si vous préférez, vous pouvez également copier le TransformConfig.exe
fichier dans le chemin de Visual Studio mentionné ci-dessus où Microsoft.Web.XmlTransform.dll
réside le et y faire référence dans tous vos projets où vous devez transformer vos configurations.
Pour ceux d'entre vous qui se demandent pourquoi j'ai ajouté des Environment.ExitCode = x;
affectations: Le simple fait de renvoyer un int depuis Main n'a pas aidé lors de l'événement de construction. Voir les détails ici.
Si vous publiez votre projet et que vous utilisez un Web.Template.config, assurez -vous que vous avez fait une reconstruction sur votre solution avec la bonne configuration (généralement Release) avant de publier. La raison en est que Web.Config est écrasé pendant le débogage et que vous pourriez finir par transformer le mauvais fichier dans le cas contraire.