Transformasi App.Config untuk proyek yang bukan Proyek Web di Visual Studio?

546

Untuk aplikasi berbasis web Visual Studio 2010 kami memiliki fitur-fitur Konfigurasi Transformasi dimana kami dapat mempertahankan beberapa file konfigurasi untuk lingkungan yang berbeda. Tetapi fitur yang sama tidak tersedia untuk file App.Config untuk Layanan Windows / WinForms atau Aplikasi Konsol.

Ada solusi yang tersedia seperti yang disarankan di sini: Menerapkan sihir XDT ke App.Config .

Namun itu tidak mudah dan membutuhkan sejumlah langkah. Apakah ada cara yang lebih mudah untuk mencapai hal yang sama untuk file app.config?

Amitabh
sumber
Saya telah menemukan artikel berikut yang terlihat sedikit lebih sederhana tetapi saya belum mencobanya sendiri. fknut.blogspot.com/2009/11/... Selain itu, ada permintaan fitur di MS Connect yang mungkin layak untuk dipilih sehingga ini akan disertakan di seluruh papan dalam SP atau versi berikutnya. connect.microsoft.com/VisualStudio/feedback/details/564414
Kim R

Jawaban:

413

Ini berfungsi sekarang dengan Visual Studio AddIn diperlakukan dalam artikel ini: SlowCheetah - Web.config Transformation Syntax sekarang digeneralisasi untuk setiap file konfigurasi XML .

Anda dapat mengklik kanan pada web.config Anda dan klik "Add Config Transforms." Ketika Anda melakukan ini, Anda akan mendapatkan web.debug.config dan web.release.config. Anda dapat membuat web.wh whatever.config jika Anda suka, asalkan nama tersebut berbaris dengan profil konfigurasi. File-file ini hanya perubahan yang ingin Anda buat, bukan salinan lengkap web.config Anda.

Anda mungkin berpikir Anda ingin menggunakan XSLT untuk mengubah web.config, tetapi sementara mereka merasa secara intuitif benar itu sebenarnya sangat bertele-tele.

Berikut adalah dua transformasi, satu menggunakan XSLT dan yang sama menggunakan sintaks / namespace XML Document Transform. Seperti semua hal, ada beberapa cara di XSLT untuk melakukan ini, tetapi Anda mendapatkan ide umum. XSLT adalah bahasa transformasi pohon umum, sementara penyebaran ini dioptimalkan untuk subset tertentu dari skenario umum. Tetapi, bagian yang paling keren adalah bahwa setiap transformasi XDT adalah plugin .NET, sehingga Anda dapat membuatnya sendiri.

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
  <xsl:copy>           
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="/configuration/appSettings">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
    <xsl:element name="add">
      <xsl:attribute name="key">NewSetting</xsl:attribute>
      <xsl:attribute name="value">New Setting Value</xsl:attribute>
    </xsl:element>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Atau hal yang sama melalui transformasi penempatan:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
   <appSettings>
      <add name="NewSetting" value="New Setting Value" xdt:Transform="Insert"/>
   </appSettings>
</configuration>
Scott Hanselman
sumber
Oh itu manis sekali! Memiliki aplikasi dengan banyak file konfigurasi (log4net, nHibernate, web.config) dan mengingat untuk mengubahnya semuanya agak menyebalkan. Saya tidak menantikan untuk memindahkan kode ke CruiseControl.NET baik tetapi sepertinya itu juga mudah.
DilbertDave
10
FYI, SlowCheetah adalah ekstensi yang fantastis yang sekarang tidak didukung setelah VS 2014. Per penulis, Sayed Ibrahim Hashimi, sedodream.com/2014/08/11/… .
bdeem
5
@ andrewb, saya membacanya di sini ; Namun, itu setahun yang lalu. Setelah meninjau utas, dan membaca komentar, sepertinya seseorang telah menyediakan versi yang bekerja dengan VS2015 di sini .
Anil Natha
2
Bekerja dengan sempurna dengan Visual Studio 2017 dan Visual STudio 2019
Guilherme de Jesus Santos
1
Itu ada di sini sekarang
Hugo Freitas
573

Saya mencoba beberapa solusi dan ini adalah yang paling sederhana yang saya temukan secara pribadi.
Dan menunjukkan dalam komentar itu posting asli milik Oleg Sych - terima kasih, Oleg!

Berikut instruksinya:

1. Tambahkan file XML untuk setiap konfigurasi ke proyek.

Biasanya Anda akan memiliki Debugdan Releasekonfigurasi sehingga nama file Anda App.Debug.configdan App.Release.config. Dalam proyek saya, saya membuat konfigurasi untuk setiap jenis lingkungan, jadi Anda mungkin ingin bereksperimen dengan itu.

2. Bongkar proyek dan buka file .csproj untuk diedit

Visual Studio memungkinkan Anda untuk mengedit file .csproj langsung di editor — Anda hanya perlu membongkar proyek terlebih dahulu. Kemudian klik kanan padanya dan pilih Edit <ProjectName> .csproj .

3. Bind App. *. Config file ke App.config utama

Temukan bagian file proyek yang berisi semua App.configdan App.*.configreferensi. Anda akan melihat aksi build mereka diatur ke None:

<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />

Pertama, atur aksi build untuk mereka semua Content.
Selanjutnya, buat semua file konfigurasi khusus bergantung pada mainApp.config sehingga Visual Studio mengelompokkannya seperti halnya desainer dan file di belakang kode.

Ganti XML di atas dengan yang di bawah ini:

<Content Include="App.config" />
<Content Include="App.Debug.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>
<Content Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>

4. Aktifkan sihir transformasi (hanya diperlukan untuk versi Visual Studio pra VS2017 )

Di akhir file setelah

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

dan sebelum final

</Project>

masukkan XML berikut:

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="CoreCompile" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <!-- Force build process to use the transformed configuration file from now on. -->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="app.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

Sekarang Anda dapat memuat ulang proyek, membangunnya dan menikmati App.configtransformasi!

FYI

Pastikan App.*.configfile Anda memiliki pengaturan yang benar seperti ini:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
     <!--magic transformations here-->
</configuration>
Dan Abramov
sumber
4
Terima kasih banyak untuk ini! Satu catatan, jika Anda menambahkan file .config baru ke proyek setelah Anda mengedit csproj, mereka akan muncul dikelompokkan di bawah App.config. Saya menambahkan satu sebelum mengedit csproj dan pada dasarnya berakhir dengan dua tautan ke sana, satu dikelompokkan dan satu solo.
Jeff Swensen
8
Satu masalah dengan pendekatan ini adalah ketika Anda melihat pada tab "Terbitkan" di properti proyek, dan kemudian klik tombol "File Aplikasi" ... Anda akan melihat bahwa app.config, app.Debug.config, app.Release.config dipaksa untuk digunakan sebagai bagian dari proses Publikasikan. Tentu, Anda mendapatkan file MyApp.exe.config yang benar juga, tetapi saya tidak ingin bagasi tambahan tersebut digunakan. Perlu ada cara untuk menjaga aplikasi. *. Config file dalam proyek sebagai <Tidak> bukan <Konten>.
Lee Grissom
6
Satu-satunya masalah yang ditinggalkan oleh sebagian orang adalah jawaban yang awalnya diambil dari Oleg Sych meninggalkan bagian penting. Jika dalam aplikasi individual Anda. (Env) .configs Anda TIDAK mencantumkan '<konfigurasi xmlns: xdt = " schemas.microsoft.com/XML-Document-Transform ">' dan sesuatu seperti <appSettings xdt: Transform = "Ganti"> atau atribut yang melakukan hal serupa pada garis pengaturan, itu tidak akan berfungsi. Ini sedikit informasi terakhir adalah kunci dan setelah saya menambahkannya, poof semuanya mulai bekerja.
djangojazz
24
Anda dapat mengganti v10.0dengan v$(VisualStudioVersion)untuk memastikan proyek Anda bekerja dengan semua versi VS.
Thibault D.
14
Saya mengalami kesalahan MSBuild kesalahan MSB3021: Tidak dapat menyalin file. Tidak dapat menemukan file 'obj \ Release \ ConsoleApp.exe' selama pembuatan. Jadi saya mengubah sedikit solusi untuk menggunakan kembali bagian target <Target Name = "AfterBuild"> daripada membuat yang baru seperti dalam solusi
asidis
137

Solusi lain yang saya temukan adalah BUKAN menggunakan transformasi tetapi hanya memiliki file konfigurasi terpisah, misalnya app.Release.config. Kemudian tambahkan baris ini ke file csproj Anda.

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <AppConfig>App.Release.config</AppConfig>
  </PropertyGroup>

Ini tidak hanya akan menghasilkan file myprogram.exe.config yang tepat tetapi jika Anda menggunakan Setup dan Deployment Project di Visual Studio untuk menghasilkan MSI, itu akan memaksa proyek deployment untuk menggunakan file konfigurasi yang benar saat mengemas.

Alec
sumber
6
Keajaiban MSBuild yang tak terhitung. Sekarang saya bertanya-tanya apa lagi yang mungkin. Btw. ini juga berfungsi untuk penyebaran klik-langsung langsung dari VS (berbeda dengan jawaban dengan suara lebih tinggi).
Boris B.
4
Perubahan dapat menjadi berat dan rentan kesalahan jika konfigurasi berisi banyak entri yang SAMA untuk semua build. Berhadapan dengan masalah saat ini di mana .config satu lingkungan melewatkan perubahan, dan tentu saja itu adalah produksi.
jeepwran
1
Memiliki dua salinan file konfigurasi tidak menjadi masalah, asalkan pengembang bukan orang yang memeliharanya secara manual.
anIBMer
1
Ini indah, bekerja seperti pesona! Saya menyisipkan hanya <AppConfig>App.Release.config</AppConfig>baris di dalam <PropertyGroupkondisi yang ada untuk Releasekonfigurasi dan IDE menunjukkan garis berlekuk-lekuk di bawah <AppConfig>... baris mengatakan itu tidak ada dalam skema atau sesuatu, tetapi saya menyimpan file lagian dan memuat kembali file proyek dan melakukan pembangunan dalam Releasekonfigurasi dan itu berhasil!
Shiva
1
Dengan ini, Anda akan kehilangan fungsionalitas perancang pengaturan.
Ondřej
33

Dalam pengalaman saya, hal-hal yang perlu saya buat khusus lingkungan adalah hal-hal seperti string koneksi, pengaturan aplikasi dan pengaturan smpt sering. Sistem config memungkinkan untuk menentukan hal-hal ini dalam file yang terpisah. Jadi Anda dapat menggunakan ini di app.config / web.config Anda:

 <appSettings configSource="appsettings.config" />
 <connectionStrings configSource="connection.config" />
 <system.net>
    <mailSettings>
       <smtp configSource="smtp.config"/>
    </mailSettings>
 </system.net>

Apa yang biasanya saya lakukan adalah meletakkan bagian konfigurasi khusus ini di file terpisah, dalam subfolder yang disebut ConfigFiles (baik di root solusi atau di tingkat proyek, tergantung). Saya mendefinisikan file per konfigurasi, misalnya smtp.config.Debug dan smtp.config.Release.

Kemudian Anda dapat mendefinisikan acara pra-bangun seperti:

copy $(ProjectDir)ConfigFiles\smtp.config.$(ConfigurationName) $(TargetDir)smtp.config

Dalam pengembangan tim, Anda dapat mengubah ini lebih lanjut dengan memasukkan% COMPUTERNAME% dan / atau% USERNAME% dalam konvensi.

Tentu saja, ini menyiratkan bahwa file target (x.config) TIDAK boleh dimasukkan ke dalam kontrol sumber (karena dihasilkan). Anda masih harus menambahkannya ke file proyek dan mengatur properti tipe output mereka menjadi 'salin selalu' atau 'salin jika lebih baru'.

Sederhana, dapat dikembangkan, dan berfungsi untuk semua jenis proyek Visual Studio (konsol, winforms, wpf, web).

Jeroenh
sumber
Saya memiliki konfigurasi yang persis sama dengan yang Anda miliki. Tapi saya punya masalah mengubah file smtp. Bisakah Anda memasukkan yang asli dan tranformasi? Ini milik saya: File dasar: <?xml version="1.0"?> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\mail"/> <network host="localhost"/> </smtp> Transformasi:<?xml version="1.0"?> <smtp xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Transform="Replace" from="[email protected]" deliveryMethod="Network"> <network .../> </smtp>
jgarza
Saya tidak yakin saya mengerti. Dalam konfigurasi ini saya tidak mengubah apa pun, itu hanya menyalin file ...
jeroenh
Oh, saya tidak melihat bagian salinannya. Saya mengubah konfigurasi daripada hanya menyalinnya. Bagaimanapun, terima kasih.
jgarza
Saya suka solusi ini. Satu saran kecil: Dalam contoh salinan di atas sumber dan target argumen untuk salinan harus dikelilingi oleh tanda kutip; kalau tidak Pra-Bangun akan gagal untuk direktori dengan ruang atas nama mereka
vandre
32

Terinspirasi oleh Oleg dan yang lainnya dalam pertanyaan ini, saya mengambil solusinya https://stackoverflow.com/a/5109530/2286801 selangkah lebih maju untuk mengaktifkan yang berikut.

  • Bekerja dengan ClickOnce
  • Bekerja dengan proyek Pengaturan dan Penempatan di VS 2010
  • Bekerja dengan VS2010, 2013, 2015 (tidak menguji 2012 meskipun harus bekerja dengan baik).
  • Bekerja dengan Pembangun Tim. (Anda harus menginstal A) Visual Studio atau B) Microsoft.Web.Publishing.targets dan Microsoft.Web.Publishing.Tasks.dll)

Solusi ini berfungsi dengan melakukan transformasi app.config sebelum app.config direferensikan untuk pertama kalinya dalam proses MSBuild. Ini menggunakan file target eksternal untuk manajemen yang lebih mudah di beberapa proyek.

Instruksi:

Langkah serupa dengan solusi lainnya. Saya mengutip apa yang tetap sama dan memasukkannya untuk kelengkapan dan perbandingan yang lebih mudah.

0. Tambahkan file baru ke proyek Anda yang disebut AppConfigTransformation.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Transform the app config per project configuration.-->
  <PropertyGroup>
    <!-- This ensures compatibility across multiple versions of Visual Studio when using a solution file.
         However, when using MSBuild directly you may need to override this property to 11.0 or 12.0 
         accordingly as part of the MSBuild script, ie /p:VisualStudioVersion=11.0;
         See http://blogs.msdn.com/b/webdev/archive/2012/08/22/visual-studio-project-compatability-and-visualstudioversion.aspx -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  </PropertyGroup>

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />

  <Target Name="SetTransformAppConfigDestination" BeforeTargets="PrepareForBuild" 
          Condition="exists('app.$(Configuration).config')">
    <PropertyGroup>
      <!-- Force build process to use the transformed configuration file from now on. -->
      <AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
    </PropertyGroup>
    <Message Text="AppConfig transformation destination: = $(AppConfig)" />
  </Target>

  <!-- Transform the app.config after the prepare for build completes. -->
  <Target Name="TransformAppConfig" AfterTargets="PrepareForBuild" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(AppConfig)" Transform="app.$(Configuration).config" />
  </Target>

</Project>

1. Tambahkan file XML untuk setiap konfigurasi ke proyek.

Biasanya Anda akan memiliki konfigurasi Debug dan Release jadi beri nama file Anda App.Debug.config dan App.Release.config. Dalam proyek saya, saya membuat konfigurasi untuk setiap jenis enironment sehingga Anda mungkin ingin bereksperimen dengan itu.

2. Bongkar proyek dan buka file .csproj untuk diedit

Visual Studio memungkinkan Anda untuk mengedit .csproj tepat di editor — Anda hanya perlu membongkar proyek terlebih dahulu. Kemudian klik kanan padanya dan pilih Edit .csproj.

3. Bind App. *. Config file ke App.config utama

Temukan bagian file proyek yang berisi semua referensi konfigurasi App.config dan App. *. Dan ganti sebagai berikut. Anda akan melihat kami menggunakan Tidak Ada alih-alih Konten.

<ItemGroup>
  <None Include="app.config"/>
  <None Include="app.Production.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.QA.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.Development.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
</ItemGroup>

4. Aktifkan sihir transformasi

Di akhir file setelah

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

dan sebelum final

</Project>

masukkan XML berikut:

<Import Project="AppConfigTransformation.targets" />

Selesai!

bdeem
sumber
1
Mencoba di VS Community 2015 RC dan mengabaikan file app.Debug.config yang saya miliki.
Khainestar
Saya berhasil menggunakan jawaban yang diterima pada satu proyek WinForms .. tetapi karena alasan yang membingungkan tidak dapat menerapkan ans yang diterima. ke proyek WinForms lain (semua dalam solusi yang sama). Jawaban dari @bdeem ini adalah fave baru saya - karena dioperasi dengan benar dengan proyek MSI saya - terima kasih banyak!
bkwdesign
Ini sepertinya tidak berfungsi di VS 2015. Saya memperbarui VisualStudioVersion dari 10 menjadi 12 tetapi tidak ada dadu. Ada ide?
Sinaesthetic
@Sinesthetic Bisakah Anda memberi kami detail lebih lanjut? VS 2015 Ultimate, Komunitas, dll. VB.NET, C #, Ada kesalahan?
bdeem
VS2015 Enterprise. Tidak ada kesalahan apa pun. Itu tidak melakukan apa-apa.
Sinaesthetic
27

Anda dapat menggunakan file konfigurasi terpisah per konfigurasi, misal app.Debug.config, app.Release.config dan kemudian gunakan variabel konfigurasi dalam file proyek Anda:

<PropertyGroup>
    <AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>

Ini kemudian akan membuat file ProjectName.exe.config yang benar tergantung pada konfigurasi yang sedang Anda buat.

Tevin
sumber
Terima kasih, saya tidak menggunakan contoh persis Anda untuk memecahkan masalah yang saya alami tetapi contoh Anda membuat saya berpikir dan membawa saya ke soulution lain yang sangat mirip menggunakan tugas Salin.
jpierson
Mencoba ini di bawah VS 2015 Community RC dan itu dibangun, tetapi kemudian mengabaikan konten app. *. Config yang saya tambahkan.
Khainestar
14

Saya menulis ekstensi yang bagus untuk mengotomatisasi transformasi app.config seperti yang dibangun di Web Application Project Configuration Transform

Keuntungan terbesar dari ekstensi ini adalah Anda tidak perlu menginstalnya di semua mesin build

Golan Avraham
sumber
1
Ekstensi yang sangat berguna, terutama sekarang karena Cheetah Lambat memasuki mode pemeliharaan dan mungkin tidak didukung di masa mendatang.
dthrasher
Ya, orang-orang harus berhenti memperlambat cheetah sebagai solusi untuk ini ketika fungsi ini sekarang didukung oleh tugas msbuild transformxml. Arsitek sw di tim saya memperkenalkan cheetah lambat dengan cara yang terlalu bersemangat untuk proyek kami dan menciptakan debug, stage, dan rilis transformasi dari semua konfigurasi kami, yang sebagian besar tidak memerlukan transformasi. Tak perlu dikatakan, saat dia pergi saya mengeluarkan cheetah lambat dan sekarang kita hanya menggunakan tugas transformxml tunggal di web.config. Ahhhhh, kesederhanaan. Belum lagi cheetah yang lambat tidak punya waktu dan tempat.
HarryTuttle
5

Instal "Alat Transformasi Konfigurasi" di Visual Studio dari Marketplace dan restart VS. Anda juga dapat melihat transformasi pratinjau menu untuk app.config.

https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform

Agnel Amodia
sumber
1
Ini bekerja dengan sempurna dan hanya membutuhkan sedikit usaha atau pemikiran. Sangat dihargai. Terima kasih. ('transformasi pratinjau' tidak berfungsi, tetapi 'tambahkan transformasi' berfungsi sempurna tanpa masalah pada VS 2017). Sepertinya juga sering mendapat pembaruan.
adudley
1
terima kasih banyak atas solusinya, di balik layar, ia melakukan persis seperti yang dijelaskan Dan Abramov di atas, tanpa membuat tangan Anda kotor
Mohammed Dawood Ansari
Ini adalah solusi akhir. Pratinjau tampaknya berfungsi dengan baik dengan VS 2019.
Kyle Champion
1
Saya menyukainya, tetapi ternyata tidak mendukung file non app.config lainnya tanpa mengedit csproj. Masih bagus untuk melihat pratinjau sekalipun.
Ian1971
4

Jadi saya akhirnya mengambil pendekatan yang sedikit berbeda. Saya mengikuti langkah-langkah Dan melalui langkah 3, tetapi menambahkan file lain: App.Base.Config. File ini berisi pengaturan konfigurasi yang Anda inginkan di setiap App.Config yang dihasilkan. Kemudian saya menggunakan BeforeBuild (dengan tambahan Yuri ke TransformXml) untuk mengubah konfigurasi saat ini dengan konfigurasi Base ke dalam App.config. Proses build kemudian menggunakan App.config yang diubah seperti biasa. Namun, satu gangguan adalah Anda ingin mengecualikan App.config yang selalu berubah dari kontrol sumber setelahnya, tetapi file konfigurasi lainnya sekarang bergantung padanya.

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="BeforeBuild" Condition="exists('app.$(Configuration).config')">
    <TransformXml Source="App.Base.config" Transform="App.$(Configuration).config" Destination="App.config" />
  </Target>
Taruhan
sumber
3

Hanya sedikit perbaikan pada solusi yang tampaknya diposting di mana-mana sekarang:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • yaitu, kecuali Anda berencana untuk tetap menggunakan versi VS Anda saat ini selamanya
Yuri Makassiouk
sumber
Bisakah Anda jelaskan jawaban Anda sedikit atau berikan sumber untuk menjelaskannya?
roydukkey
4
Sepertinya $(VisualStudioVersion)tidak diatur saat menggunakan MSBuild secara langsung.
Jeremy Smith
Ini harus menjadi komentar untuk stackoverflow.com/a/5109530/2003763 (Saya baru saja menambahkan info yang sama dengan komentar di sana)
Thibault D.
2

Saya telah membuat alternatif lain dari yang diposting oleh Vishal Joshi di mana persyaratan untuk mengubah tindakan membangun ke Konten dihapus dan juga menerapkan dukungan dasar untuk penyebaran ClickOnce. Saya katakan dasar, karena saya tidak mengujinya secara menyeluruh tetapi harus bekerja dalam skenario penyebaran ClickOnce yang khas.

Solusinya terdiri dari satu proyek MSBuild yang pernah diimpor ke proyek aplikasi windows yang ada (* .csproj) memperluas proses pembuatan untuk merenungkan transformasi app.config.

Anda dapat membaca penjelasan yang lebih terperinci di Visual Studio App.config XML Transformation dan file proyek MSBuild dapat diunduh dari GitHub .

João Angelo
sumber
1

Jika Anda menggunakan TFS online (versi Cloud) dan Anda ingin mengubah App.Config dalam sebuah proyek, Anda dapat melakukan hal berikut tanpa menginstal alat tambahan apa pun. Dari VS => Bongkar proyek => Edit file proyek => Buka bagian bawah file dan tambahkan yang berikut:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
<TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(OutDir)\$(AssemblyName).dll.config" />

AssemblyFile dan Destination berfungsi untuk penggunaan lokal dan server TFS online (Cloud).

Benjamin
sumber
0

solusi yang diusulkan tidak akan berfungsi ketika perpustakaan kelas dengan file konfigurasi direferensikan dari proyek lain (dalam kasus saya itu adalah perpustakaan proyek pekerja Azure). Itu tidak akan menyalin file yang diubah benar dari objfolder ke bin\##configuration-name##folder. Untuk membuatnya berfungsi dengan perubahan minimal, Anda perlu mengubah AfterCompiletarget ke BeforeCompile:

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
avs099
sumber