Dalam Aplikasi .NET MVC 3.0 saya memiliki konfigurasi berikut di appSettings
:
web.config
<appSettings>
<add key="SMTPHost" value="mail.domain.com"/>
<add key="SMTPUsername" value="[email protected]"/>
<add key="SMTPPort" value="25"/>
<add key="SMTPPwd" value="mypassword"/>
<add key="EmailFrom" value="[email protected]"/>
</appSettings>
Untuk debugging, saya memiliki transformasi konfigurasi berikut yang ditentukan:
web.Debug.config
<appSettings>
<add key="SMTPPort" value="58" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>
Dan saya menjalankan aplikasi dalam mode debug, tetapi port SMTP saya masih mengambil nilai dari web.config
, bukan web.Debug.config
.
Adakah yang bisa menyarankan apa yang bisa salah dalam konfigurasi ini?
Visual Studio (2010-2019) sayangnya tidak secara langsung mendukungnya saat Anda melakukan debug, ini hanya dimaksudkan untuk penerbitan - bahkan dengan ekstensi SlowCheetah (jawaban yang ditandai) itu tidak berfungsi untuk saya (hanya untuk proyek yang menggunakan app.config daripada web.config).
Perhatikan bahwa ada solusi yang dijelaskan di codeproject .
Ini menjelaskan cara memodifikasi file .msproj untuk menimpa web.config saat ini dengan versi yang diubah.
Pertama-tama saya akan menjelaskan solusi tersebut sebagai Opsi 1 , tetapi baru-baru ini saya menemukan Opsi 2 lain , yang lebih mudah digunakan (jadi Anda dapat menggulir ke bawah ke opsi 2 secara langsung jika Anda mau):
Opsi 1: Saya telah menambahkan instruksi yang diambil dari artikel codeproject asli (lihat tautan di atas), karena tangkapan layar di sana sudah hilang, dan saya tidak ingin kehilangan seluruh informasi:
VS.Net tidak melakukan transformasi apa pun saat Anda mengembangkan dan hanya men-debug lingkungan lokal Anda. Tetapi ada beberapa langkah yang dapat Anda lakukan untuk mewujudkannya jika Anda mau.
web.config
dan pilih Add Config Transforms - ini akan membuat konfigurasi transformasi dependen untuk setiap konfigurasi yang Anda tentukan.web.config
menjadiweb.base.config
.web.config
ke proyek Anda. Tidak masalah apa yang ada di dalamnya karena itu akan ditimpa setiap kali kita melakukan pembangunan tetapi kita menginginkannya menjadi bagian dari proyek sehingga VS.Net tidak memberi kita pop- "Proyek Anda tidak dikonfigurasi untuk Debugging" naik..csproj
File Proyek Anda dan tambahkanTransformXml
tugas berikut ke target AfterBuild. Di sini Anda dapat melihat saya akan mengubahweb.base.config
file menggunakanweb.[configuration].config
dan akan menyimpannya sebagaiweb.config
. Untuk detailnya, periksa Q&A Microsoft ini , dan untuk instruksi bagaimana memperluas build, lihat di sana .Pilihan 2:
Berdasarkan jawaban ini , saya telah mengembangkan aplikasi konsol sederhana, TransformConfig.exe (dalam sintaks 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); } } }
Pastikan bahwa Anda menambahkan DLL
"C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
sebagai referensi (contoh ini berlaku untuk VS 2015, untuk versi yang lebih lama gantiv14.0
di jalur dengan nomor versi yang sesuai, mis.v11.0
).Untuk Visual Studio 2017, skema penamaan jalan telah berubah: Misalnya, untuk versi enterprise itu adalah di sini:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.Saya berasumsi bahwa untuk versi profesional Anda perlu mengganti
Enterprise
di jalur denganProfessional
. Jika Anda menggunakan versi pratinjau, ganti2017
denganPreview
.Berikut gambaran bagaimana jalan telah berubah untuk berbagai versi Visual Studio (jika Anda tidak memiliki versi Enterprise Anda mungkin perlu mengganti
Enterprise
denganProfessional
di jalan):Kompilasikan dan letakkan file .exe ke dalam direktori, mis
C:\MyTools\
.Penggunaan: Anda dapat menggunakannya dalam acara pasca-pembuatan (di properti proyek , pilih Peristiwa Build , lalu edit baris perintah Peristiwa pasca-pembangunan ). Parameter baris perintah adalah (contoh):
yaitu, pertama nama file konfigurasi, diikuti oleh file konfigurasi transformasi, diikuti oleh konfigurasi template opsional, diikuti dengan jalur ke proyek Anda yang berisi kedua file tersebut.
Saya telah menambahkan parameter konfigurasi template opsional karena jika tidak, konfigurasi lengkap asli Anda akan ditimpa oleh transformasi, yang dapat dihindari dengan menyediakan template.
Buat template hanya dengan menyalin Web.config asli dan beri nama Web.Template.config.
catatan:
Jika Anda mau, Anda juga dapat menyalin
TransformConfig.exe
file ke jalur Visual Studio yang disebutkan di atas tempatMicrosoft.Web.XmlTransform.dll
tinggal dan merujuknya di semua proyek Anda di mana Anda perlu mengubah konfigurasi Anda.Bagi Anda yang bertanya-tanya mengapa saya menambahkan
Environment.ExitCode = x;
tugas: Hanya mengembalikan int dari Utama tidak membantu dalam acara pembangunan. Lihat detailnya di sini.Jika Anda menerbitkan proyek Anda dan Anda menggunakan Web.Template.config, pastikan Anda melakukan rekondisi pada solusi Anda dengan konfigurasi yang benar (biasanya Rilis) sebelum Anda menerbitkan. Alasannya adalah Web.Config ditimpa selama proses debug dan Anda mungkin akan mengubah file yang salah jika tidak.
sumber
Menjawab pertanyaan Anda tidaklah mudah, karena ini menimbulkan masalah - jika Anda ingin mengubah Web.config dengan Web.debug.config - di mana efek transformasi harus disimpan? Di Web.config itu sendiri? Ini akan menimpa file sumber transformasi! Mungkin itu sebabnya Visual Studio tidak melakukan transformasi selama pembuatan.
Jawaban Matt sebelumnya valid, tetapi Anda mungkin ingin mencampurnya untuk mendapatkan solusi umum yang berfungsi saat Anda benar-benar mengubah konfigurasi solusi aktif dari debug ke rilis, dll. Berikut solusi sederhana:
Web.config
file menjadiWeb.base.config
- transformasi harus mengganti nama secara otomatis (Web.base.Debug.config
, dll)<?xml version="1.0" encoding="utf-8" ?> <Project ToolsVersion="4.0" DefaultTargets="TransformWebConfig" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll" /> <Target Name="TransformWebConfig"> <TransformXml Source="Web.base.config" Transform="Web.base.$(CurrentConfig).config" Destination="Web.config" /> </Target> </Project>
Sekarang, ketika Anda membangun solusi Anda, file Web.config akan dibuat dengan transformasi yang valid untuk konfigurasi aktif.
sumber
'"$(MSBuildBinPath)\msbuild.exe" $(ProjectDir)TransformWebConfig.proj /t:TransformWebConfig /p:CurrentConfig=$(ConfigurationName) /p:TargetProjectName=$(TargetPath)
dan diperbaruiv12.0
kev14.0
dalam file .proj.12.0
ke14.0
untuk VS 2017 saya menemukan jawabannya disini tidak yakin mengapa tidak ada yang mereferensikannya di atas karena tampaknya menjadi solusi yang sangat populer. Sangat mudah juga. Pastikan Anda melihat komentar dari IOrlandoni pada Mar5 2019 untuk membuatnya berfungsi di VS 2017 dan semua versi.
Pada dasarnya ini adalah dua langkah. Pertama, Anda mengedit file .csproj, menambahkan kode di bawah ini. Kedua, Anda membuat konfigurasi web.base.config baru dan menyalin web.config yang ada di sana. Setelah melakukan itu, build apa pun akan menimpa web.config Anda dengan transformasi yang Anda inginkan.
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" /> <Target Name="BeforeBuild"> <TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" /> </Target>
sumber
Web.config
dariContent
keNone
maka Anda dapat menggunakanSource="Web.config" Destination="$(TargetPath).config"
(atau mungkin untuk beberapa jenis proyek,Destination="$(TargetDir)Web.config"
). Saya juga memindahkan transformasi keAfterBuild
, karena tidak perlu lagi dilakukan sebelum file disalin.bin
.Pertanyaan langsung Anda telah terjawab - penjelasannya adalah bahwa transformasi diterapkan pada publikasi, bukan pada versi build.
Namun, saya pikir itu tidak menawarkan solusi tentang bagaimana mencapai apa yang ingin Anda lakukan.
Saya telah berjuang dengan masalah yang tepat ini selama beberapa hari sekarang, mencari cara untuk menjaga web.config bersih dan mengatur semua kunci yang bervariasi tergantung pada lingkungan di masing-masing file transformasi. Kesimpulan saya adalah bahwa solusi termudah dan paling stabil adalah dengan menggunakan nilai debug di web.config asli, dengan cara itu mereka selalu ada saat Anda menjalankan debug di Visual Studio.
Kemudian buat transformasi untuk lingkungan berbeda yang ingin Anda publikasikan - pengujian, integrasi, produksi - apa pun yang Anda miliki. Fungsionalitas bawaan sekarang untuk mengubah file web.config saat dipublikasikan sudah cukup untuk ini. Tidak perlu SlowCheetah atau mengedit acara pembangunan atau file proyek. Jika Anda hanya memiliki proyek web.
Jika Anda ingin, Anda juga dapat memiliki file web.debug.config dalam solusi Anda, hanya untuk menyimpan file terpisah dengan semua nilai yang berkaitan dengan lingkungan pengembangan. Pastikan untuk berkomentar di dalamnya bahwa nilai tidak diterapkan saat menjalankan Visual Studio, jika orang lain mencoba menggunakannya untuk tujuan itu!
sumber
Gunakan Octopus Deploy (Edisi komunitas gratis) dan biarkan itu mentransformasikannya
web.config
untuk Anda. Langkah:Web.Release.config
memilikiBuild Action
properti yang disetelContent
sepertiweb.config
file utama Anda .Itu dia! Gurita akan melakukan sisanya tanpa konfigurasi khusus. Penyebaran situs Web IIS default akan melakukan ini di luar kotak:
sumber
Ternyata ada ekstensi untuk Visual Studio 2015
https://visualstudiogallery.msdn.microsoft.com/05bb50e3-c971-4613-9379-acae2cfe6f9e
Paket ini memungkinkan Anda mengubah app.config atau file XML lainnya berdasarkan konfigurasi build
sumber
new
dunia sebagai kalimat.Baru-baru ini saya mengalami masalah yang sama dengan file web.config lama berdasarkan .NET Framework 2.0. Solusinya cukup dengan menghapus namespace web.config ( xmlns attibute di node root konfigurasi ):
SEBELUM:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
SETELAH:
<configuration>
sumber