Saya memiliki aplikasi .NET yang memiliki file konfigurasi berbeda untuk pembuatan Debug dan Rilis. Misalnya file app.config debug menunjuk ke pengembangan SQL Server yang telah debugging diaktifkan dan target rilis rilis ke SQL Server langsung. Ada juga pengaturan lain, beberapa di antaranya berbeda dalam debug / rilis.
Saat ini saya menggunakan dua file konfigurasi terpisah (debug.app.config dan release.app.config). Saya memiliki acara build di proyek yang mengatakan jika ini adalah rilis build kemudian salin release.app.config ke app.config, atau salin debug.app.config ke app.config.
Masalahnya adalah bahwa aplikasi tampaknya mendapatkan pengaturannya dari file settings.settings, jadi saya harus membuka settings.settings di Visual Studio yang kemudian meminta saya bahwa pengaturan telah berubah jadi saya menerima perubahan, simpan setting.settings dan miliki untuk membangun kembali untuk membuatnya menggunakan pengaturan yang benar.
Apakah ada metode yang lebih baik / direkomendasikan / disukai untuk mencapai efek yang sama? Atau sama-sama, sudahkah saya mendekati ini sepenuhnya salah dan apakah ada pendekatan yang lebih baik?
Jawaban:
Setiap konfigurasi yang mungkin berbeda di lingkungan harus disimpan di level mesin , bukan di level aplikasi . (Info lebih lanjut tentang tingkat konfigurasi.)
Ini adalah jenis elemen konfigurasi yang biasanya saya simpan di level mesin:
Ketika setiap lingkungan (pengembang, integrasi, pengujian, panggung, live) memiliki pengaturan uniknya sendiri di direktori c: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ CONFIG , maka Anda dapat mempromosikan kode aplikasi antar lingkungan tanpa modifikasi pasca-pembangunan.
Dan tentu saja, isi direktori CONFIG tingkat mesin dapat dikendalikan versi dalam repositori yang berbeda atau struktur folder yang berbeda dari aplikasi Anda. Anda dapat menjadikan file .config Anda lebih ramah kontrol sumber melalui penggunaan cerdas configSource .
Saya telah melakukan ini selama 7 tahun, pada lebih dari 200 aplikasi ASP.NET di 25+ perusahaan yang berbeda. (Tidak berusaha menyombongkan diri, hanya ingin memberi tahu Anda bahwa saya belum pernah melihat situasi di mana pendekatan ini tidak berhasil.)
sumber
Ini mungkin membantu beberapa orang berurusan dengan Settings.settings dan App.config: Hati-hati terhadap atribut GenerateDefaultValueInCode di panel Properties saat mengedit salah satu nilai di grid Settings.settings di Visual Studio (Visual Studio 2008 dalam kasus saya).
Jika Anda mengatur GenerateDefaultValueInCode ke True (Benar adalah default di sini!), Nilai default dikompilasi ke dalam EXE (atau DLL), Anda dapat menemukannya tertanam dalam file ketika Anda membukanya di editor teks biasa.
Saya sedang mengerjakan aplikasi konsol dan jika saya gagal di EXE, aplikasi selalu mengabaikan file konfigurasi yang ditempatkan di direktori yang sama! Cukup mimpi buruk dan tidak ada informasi tentang ini di seluruh Internet.
sumber
Ada pertanyaan terkait di sini:
Meningkatkan Proses Pembuatan Anda
File konfigurasi datang dengan cara untuk menimpa pengaturan:
Alih-alih memeriksa dalam dua file (atau lebih), Anda hanya memeriksa dalam file konfigurasi default, dan kemudian pada setiap mesin target, Anda meletakkan Local.config, dengan hanya bagian appSettings yang memiliki penggantian untuk mesin tertentu.
Jika Anda menggunakan bagian konfigurasi, padanannya adalah:
Tentu saja, merupakan ide bagus untuk membuat salinan cadangan dari semua file Local.config dari komputer lain dan memeriksanya di suatu tempat, tetapi bukan sebagai bagian dari solusi aktual. Setiap pengembang menempatkan "abaikan" pada file Local.config sehingga tidak diperiksa, yang akan menimpa file orang lain.
(Anda sebenarnya tidak harus menyebutnya "Local.config", hanya itu yang saya gunakan)
sumber
Dari apa yang saya baca, sepertinya Anda menggunakan Visual Studio untuk proses pembuatan Anda. Sudahkah Anda berpikir untuk menggunakan MSBuild dan Nant ?
Sintaks xml Nant agak aneh, tetapi begitu Anda memahaminya, melakukan apa yang Anda sebutkan menjadi sangat sepele.
sumber
Bagi saya tampaknya Anda bisa mendapat manfaat dari Proyek Penerapan Web Visual Studio 2005 .
Dengan itu, Anda dapat memerintahkannya untuk memperbarui / memodifikasi bagian file web.config Anda tergantung pada konfigurasi build.
Lihatlah entri blog ini dari Scott Gu untuk ikhtisar / sampel cepat.
sumber
Kami dulu menggunakan proyek Penerapan Web tetapi sejak bermigrasi ke NAnt. Alih-alih melakukan percabangan dan menyalin file pengaturan yang berbeda, kami saat ini menanamkan nilai-nilai konfigurasi langsung di skrip build dan menyuntikkannya ke file konfigurasi kami melalui tugas xmlpoke:
Dalam kedua kasus, file konfigurasi Anda dapat memiliki nilai pengembang apa pun yang Anda inginkan dan mereka akan berfungsi dengan baik dari dalam lingkungan dev Anda tanpa merusak sistem produksi Anda. Kami telah menemukan bahwa pengembang cenderung untuk mengubah variabel skrip build secara sewenang-wenang ketika menguji berbagai hal, jadi kesalahan konfigurasi yang tidak disengaja lebih jarang terjadi dibandingkan dengan teknik lain yang telah kami coba, meskipun masih perlu menambahkan setiap var di awal proses sehingga nilai dev tidak terdorong ke prod secara default.
sumber
Majikan saya saat ini memecahkan masalah ini dengan terlebih dahulu meletakkan level dev (debug, stage, live, dll) di file machine.config. Kemudian mereka menulis kode untuk mengambilnya dan menggunakan file konfigurasi yang tepat. Itu memecahkan masalah dengan string koneksi yang salah setelah aplikasi dikerahkan.
Mereka baru-baru ini menulis layanan web pusat yang mengirimkan kembali string koneksi yang benar dari nilai dalam nilai machine.config.
Apakah ini solusi terbaik? Mungkin tidak, tetapi berhasil untuk mereka.
sumber
Salah satu solusi yang membuat saya baik-baik saja adalah menggunakan WebDeploymentProject. Saya memiliki 2/3 file web.config berbeda di situs saya, dan pada publikasi, tergantung pada mode konfigurasi yang dipilih (release / staging / etc ...) Saya akan menyalin melalui Web.Release.config dan ganti namanya ke web. konfigurasi dalam acara AfterBuild, dan hapus yang tidak saya butuhkan (Web.Staging.config misalnya).
sumber
Anda akan menemukan solusi lain di sini: Cara terbaik untuk beralih konfigurasi antara lingkungan Pengembangan / UAT / Prod di ASP.NET? yang menggunakan XSLT untuk mentransformasikan web.config.
Ada juga beberapa contoh bagus tentang penggunaan NAnt.
sumber
Proyek kami memiliki masalah yang sama di mana kami harus memelihara konfigurasi untuk dev, qa, uat dan prod. Inilah yang kami ikuti (hanya berlaku jika Anda terbiasa dengan MSBuild):
Gunakan MSBuild dengan ekstensi tugas Komunitas MSBuild. Ini termasuk tugas 'XmlMassUpdate' yang dapat 'memperbarui secara massal' entri dalam file XML apa pun setelah Anda memberinya simpul yang benar untuk memulai.
Untuk melaksanakan:
1) Anda perlu memiliki satu file konfigurasi yang akan memiliki entri dev env Anda; ini adalah file konfigurasi dalam solusi Anda.
2) Anda harus memiliki file 'Substitutions.xml', yang hanya berisi entri yang BERBEDA (sebagian besar pengaturan aplikasi dan ConnectionStrings) untuk setiap lingkungan. Entri yang tidak berubah di lingkungan tidak perlu dimasukkan dalam file ini. Mereka dapat tinggal di file web.config dari solusi dan tidak akan tersentuh oleh tugas
3) Dalam file build Anda, panggil saja tugas pembaruan massal XML dan berikan lingkungan yang tepat sebagai parameter.
Lihat contoh di bawah ini:
ganti '$ Environment' dengan 'QA' atau 'Prod' berdasarkan pada apa. Anda sedang membangun. Perhatikan bahwa Anda harus mengerjakan salinan file konfigurasi dan bukan file konfigurasi yang sebenarnya itu sendiri untuk menghindari kemungkinan kesalahan yang tidak dapat dipulihkan.
Jalankan saja file build dan kemudian pindahkan file konfigurasi yang diperbarui ke lingkungan penyebaran Anda dan Anda selesai!
Untuk ikhtisar yang lebih baik, baca ini:
http://blogs.microsoft.co.il/blogs/dorony/archive/2008/01/18/easy-configuration-deployment-with-msbuild-and-the-xmlmassupdate-task.aspx
sumber
Seperti Anda, saya juga telah mengatur 'multi' app.config - misal app.configDEV, app.configTEST, app.config.LOCAL. Saya melihat beberapa alternatif bagus disarankan, tetapi jika Anda menyukai cara kerjanya, saya akan menambahkan yang berikut:
Saya memiliki
<appSettings>
<add key = "Env" value = "[Local] "/>
untuk setiap aplikasi yang saya tambahkan ini ke UI di batang judul: dari ConfigurationManager.AppSettings.Get ("Env");Saya baru saja mengubah nama konfigurasi menjadi yang saya targetkan (Saya punya proyek dengan 8 aplikasi dengan banyak basis data / konfigurasi wcf terhadap 4 evenioments). Untuk menerapkan dengan clickonce ke masing-masing saya mengubah 4 seetings dalam proyek dan pergi. (ini saya ingin mengotomatisasi)
Gotcha saya hanya ingat untuk 'membersihkan semua' setelah perubahan, karena konfigurasi lama 'macet' setelah mengubah nama manual. (Yang saya pikir AKAN akan memperbaiki Anda masalah setting.setting).
Saya menemukan ini bekerja dengan sangat baik (suatu hari saya akan mendapatkan waktu untuk melihat MSBuild / NAnt)
sumber
Web.config:
Web.config diperlukan ketika Anda ingin meng-host aplikasi Anda di IIS. Web.config adalah file konfigurasi wajib untuk IIS untuk mengonfigurasi bagaimana berperilaku sebagai proxy terbalik di depan Kestrel. Anda harus memelihara web.config jika Anda ingin menghostingnya di IIS.
AppSetting.json:
Untuk semua hal lain yang tidak terkait IIS, Anda menggunakan AppSetting.json. AppSetting.json digunakan untuk hosting Asp.Net Core. ASP.NET Core menggunakan variabel lingkungan "ASPNETCORE_ENVIRONMENT" untuk menentukan lingkungan saat ini. Secara default, jika Anda menjalankan aplikasi Anda tanpa menetapkan nilai ini, itu akan secara otomatis default ke lingkungan Produksi dan menggunakan file "AppSetting.production.json". Ketika Anda debug melalui Visual Studio itu mengatur lingkungan untuk Pengembangan sehingga menggunakan "AppSetting.json". Lihat situs web ini untuk memahami cara mengatur variabel lingkungan hosting di Windows.
App.config:
App.config adalah file konfigurasi lain yang digunakan oleh .NET yang terutama digunakan untuk Formulir Windows, Layanan Windows, Aplikasi Konsol, dan aplikasi WPF. Saat Anda memulai hosting Asp.Net Core Anda melalui app.config aplikasi konsol juga digunakan.
TL; DR
Pilihan file konfigurasi ditentukan oleh lingkungan hosting yang Anda pilih untuk layanan ini. Jika Anda menggunakan IIS untuk meng-host layanan Anda, gunakan file Web.config. Jika Anda menggunakan lingkungan hosting lainnya, gunakan file App.config. Lihat Mengkonfigurasi Layanan Menggunakan dokumentasi File Konfigurasi dan juga memeriksa Konfigurasi di ASP.NET Core.
sumber
Dikatakan asp.net di atas, jadi mengapa tidak menyimpan pengaturan Anda dalam database dan menggunakan cache kustom untuk mengambilnya?
Alasan kami melakukannya karena lebih mudah (bagi kami) untuk memperbarui database terus menerus daripada mendapatkan izin untuk terus memperbarui file produksi.
Contoh dari Tembolok Kustom:
sumber