Visual Studio (2010 - 2019) , siz hata ayıklarken maalesef bunu doğrudan desteklemiyor, yalnızca yayınlama amaçlıdır - SlowCheetah (işaretli yanıt) uzantısıyla bile benim için çalışmıyor (yalnızca app.config kullanan projeler için web.config).
Bir çözüm olduğunu unutmayın . CodeProject adresinde açıklanan .
Dönüştürülen sürümün geçerli web.config dosyasının üzerine yazmak için .msproj dosyasının nasıl değiştirileceğini açıklar.
İlk önce bu geçici çözümü Seçenek 1 olarak tanımlayacağım , ancak yakın zamanda kullanımı daha kolay olan başka bir Seçenek 2 buldum (bu nedenle isterseniz doğrudan 2. seçeneğe kaydırabilirsiniz):
Seçenek 1: Orijinal kod projesi makalesinden alınan talimatları ekledim (yukarıdaki bağlantıya bakın), çünkü oradaki ekran görüntüleri çoktan gitti ve tüm bilgileri kaybetmek istemiyorum:
VS.Net, yerel ortamınızı geliştirirken ve yalnızca hata ayıklarken herhangi bir dönüştürme yapmaz. Ancak, isterseniz bunu gerçekleştirmek için yapabileceğiniz bazı adımlar var.
- Öncelikle, varsayılan hata ayıklama ve yayınlamanın başarmaya çalıştığınız şey için yeterli olmadığını varsayarak VS.Net'te istediğiniz yapılandırmaları oluşturun .
- Sağ tıklayın
web.config
ve Yapılandırma Dönüşümleri Ekle'yi seçin - bu, tanımlanan her bir yapılandırmanız için bağımlı bir dönüşüm yapılandırması oluşturacaktır.
- Artık yeniden adlandırabilirsiniz
web.config
To web.base.config
.
web.config
Projenize bir ekleyin . İçinde ne olduğu önemli değil çünkü her derleme yaptığımızda üzerine yazılacak, ancak projenin bir parçası olmasını istiyoruz, böylece VS.Net bize "Projeniz Hata Ayıklama için yapılandırılmamış" vermiyor açılır penceresini yukarı.
- Düzenleyin
.csproj
Proje Dosyası ve aşağıdakileri ekleyin TransformXml
AfterBuild hedefe görevi. Burada ben dönüştüren olacak görebilirsiniz web.base.config
kullanarak dosyayı web.[configuration].config
ve olarak kaydeder web.config
. Ayrıntılar için lütfen bu Microsoft Soru ve Cevap bölümüne bakın ve yapının nasıl genişletileceğine ilişkin talimatlar için oraya bakın .
Seçenek 2:
Bu cevaba dayanarak, basit bir konsol uygulaması geliştirdim, TransformConfig.exe (C # 6.0 sözdiziminde):
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'yi "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
referans olarak eklediğinizden emin olun (bu örnek VS 2015 için geçerlidir, eski sürümler v14.0
için yolu uygun sürüm numarasıyla değiştirin, örn.v11.0
).
İçin Visual Studio 2017, yol için adlandırma şeması değişti: Örneğin, kurumsal versiyonu için o burada: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.
Profesyonel sürüm Enterprise
için yolu değiştirmeniz gerektiğini varsayıyorum Professional
. Önizleme sürümünü kullanıyorsanız, ayrıca değiştirin 2017
tarafından Preview
.
Burada yol (Enterprise sürümü yoksa değiştirmek gerekebilir Visual Studio farklı sürümleri için nasıl değiştiğini genel bir bakış Enterprise
ile Professional
yolunda):
VS Sürüm Yolu (için Microsoft.Web.XmlTransform.dll
)
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
Derleyin ve .exe dosyasını bir dizine koyun, örn C:\MyTools\
.
Kullanım:
Bunu, derleme sonrası olayınızda kullanabilirsiniz ( proje özelliklerinde , Olayları Oluştur'u seçin , ardından Oluşturma sonrası olay komut satırını düzenleyin ). Komut satırı parametreleri (örnek):
"C: \ MyTools \ TransformConfig.Exe" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b: "$ (ProjectDir) \"
ör. önce yapılandırma dosyasının adı, ardından dönüştürme yapılandırma dosyası, ardından isteğe bağlı bir şablon yapılandırması, ardından her iki dosyayı da içeren projenizin yolu.
İsteğe bağlı şablon yapılandırma parametresini ekledim, çünkü aksi takdirde orijinal tam yapılandırmanızın üzerine dönüşüm tarafından yazılır, bu da bir şablon sağlayarak önlenebilir.
Şablonu, orijinal Web.config dosyasını kopyalayıp Web.Template.config olarak adlandırarak oluşturun.
Not:
Tercih ederseniz, TransformConfig.exe
dosyayı yukarıda belirtilen Visual Studio yoluna da kopyalayabilir ve Microsoft.Web.XmlTransform.dll
yapılandırmalarınızı dönüştürmeniz gereken tüm projelerinizde buna başvurabilirsiniz.
Neden Environment.ExitCode = x;
atamalar eklediğimi merak edenler için : Basitçe Main'den int döndürmek, build olayına yardımcı olmadı. Ayrıntıları burada görün .
Projenizi yayınlıyorsanız ve bir Web.Template.config kullanıyorsanız, yayınlamadan önce çözümünüzde doğru yapılandırmayla (genellikle Sürüm) yeniden oluşturduğunuzdan emin olun. Bunun nedeni, hata ayıklama sırasında Web.Config'in üzerine yazılması ve aksi takdirde yanlış dosyayı dönüştürmenizdir.