Visual Studio'da Web Projeleri olmayan projeler için App.Config Dönüşümü?


546

Visual Studio 2010 Web tabanlı uygulama için, farklı ortamlar için birden fazla yapılandırma dosyası tutabileceğimiz Config Transformation özelliklerine sahibiz. Ancak aynı özellik Windows Hizmetleri / WinForms veya Konsol Uygulaması için App.Config dosyaları için geçerli değildir.

Burada önerildiği gibi bir geçici çözüm vardır: XDT büyüsünü App.Config dosyasına uygulama .

Ancak bu basit değildir ve bir dizi adım gerektirir. Aynı şeyi app.config dosyaları için elde etmenin daha kolay bir yolu var mı?


Biraz daha basit görünen aşağıdaki makaleye rastladım ama kendim denemedim. fknut.blogspot.com/2009/11/… Ayrıca, MS Connect'te oy vermeye değer olabilecek bir özellik isteği var, bu da bir sonraki SP veya sürümde anakartta yer alıyor. connect.microsoft.com/VisualStudio/feedback/details/564414
Kim R

Yanıtlar:


413

Bu, şimdi bu makalede işlenen Visual Studio AddIn ile çalışır: SlowCheetah - Web.config Dönüşüm Sözdizimi artık herhangi bir XML yapılandırma dosyası için genelleştirilmiştir .

Web.config dosyasına sağ tıklayıp "Config Transforms Ekle" ye tıklayabilirsiniz. Bunu yaptığınızda bir web.debug.config ve web.release.config alırsınız. İsterseniz ad bir yapılandırma profiliyle aynı olduğu sürece bir web.whatever.config yapabilirsiniz. Bu dosyalar yalnızca istediğiniz değişikliklerdir, web.config dosyanızın tam bir kopyası değildir.

Bir web.config dosyasını dönüştürmek için XSLT kullanmak isteyeceğinizi düşünebilirsiniz, ancak sezgisel olarak doğru hissettiklerinde aslında çok ayrıntılıdır.

İşte biri XSLT, diğeri XML Belge Dönüşümü sözdizimi / ad alanını kullanarak iki dönüşüm. Her şeyde olduğu gibi, XSLT'de bunu yapmanın birden fazla yolu vardır, ancak genel fikri anlarsınız. XSLT genelleştirilmiş bir ağaç dönüştürme dilidir, ancak bu dağıtım yaygın senaryoların belirli bir alt kümesi için optimize edilmiştir. Ancak, havalı kısım, her bir XDT dönüşümünün bir .NET eklentisi olmasıdır, böylece kendiniz yapabilirsiniz.

<?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>

Ya da dağıtım dönüşümüyle aynı şey:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
   <appSettings>
      <add name="NewSetting" value="New Setting Value" xdt:Transform="Insert"/>
   </appSettings>
</configuration>

Ah bu çok tatlı! Çok sayıda yapılandırma dosyası (log4net, nHibernate, web.config) içeren bir uygulamanız var ve hepsini değiştirmeyi hatırlamak biraz acı vericiydi. Ben de CruiseControl.NET içine kodu taşımak için sabırsızlanıyordu ama bu da bir esinti gibi görünüyor.
DilbertDave

10
FYI, SlowCheetah, VS 2014'ten sonra artık desteklenmeyecek harika bir uzantıydı . Yazar, Sayed İbrahim Hashimi, sedodream.com/2014/08/11/… .
bdeem

5
@andrewb, bunu burada okudum ; ancak bu bir yıl önceydi. İleti dizisini yeniden ziyaret ettikten ve yorumları okuduktan sonra, burada VS2015 ile çalışan bir sürüm sağlanmış gibi görünüyor .
Anil Natha

2
Visual Studio 2017 ve Visual STudio 2019 ile mükemmel çalışma
Guilherme de Jesus Santos

1
Bu var burada şimdi
Hugo Freitas

573

Birkaç çözüm denedim ve işte şahsen bulduğum en basit çözüm.
Dan o Açıklamalarda belirttiği orijinal yayın aittir Oleg Sych - teşekkürler, Oleg!

İşte talimatlar:

1. Projeye her yapılandırma için bir XML dosyası ekleyin.

Genellikle sahip olacak Debugve Releaseyapılandırmaları böylece dosyalarınızı adlandırın App.Debug.configve App.Release.config. Projemde, her tür ortam için bir yapılandırma oluşturdum, bu yüzden bunu denemek isteyebilirsiniz.

2. Projeyi kaldırın ve düzenlemek için .csproj dosyasını açın

Visual Studio .csproj dosyalarını doğrudan düzenleyicide düzenlemenize olanak tanır ; önce projeyi kaldırmanız yeterlidir. Ardından üzerine sağ tıklayın ve <ProjeAdı> .csproj Düzenle'yi seçin .

3. App. *. Yapılandırma dosyalarını ana App.config dosyasına bağlayın

Tümünü App.configve App.*.configbaşvuruları içeren proje dosyası bölümünü bulun . Oluşturma eylemlerinin şu şekilde ayarlandığını göreceksiniz None:

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

İlk olarak, hepsi için derleme eylemi ayarlayın Content.
Ardından, yapılandırmaya özgü tüm dosyaları ana dosyaya bağımlı hale getirin , App.configböylece Visual Studio onları tasarımcı ve arka planda kodlama dosyaları gibi gruplandırır.

Yukarıdaki XML'i aşağıdaki ile değiştirin:

<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. Dönüşüm sihrini etkinleştir (yalnızca VS2017 öncesi Visual Studio sürümleri için gereklidir )

Sonunda dosyanın sonunda

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

ve finalden önce

</Project>

aşağıdaki XML'i ekleyin:

  <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>

Artık projeyi yeniden yükleyebilir, inşa edebilir ve App.configdönüşümlerin tadını çıkarabilirsiniz !

Bilginize

App.*.configDosyalarınızın aşağıdaki gibi doğru kuruluma sahip olduğundan emin olun :

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
     <!--magic transformations here-->
</configuration>

4
Bunun için bir ton teşekkürler! Bir not, csproj'u düzenledikten sonra projeye yeni .config dosyalarını eklerseniz, App.config altında gruplandırılmış olarak görünürler. Ben csproj düzenlemeden önce bir tane ekledi ve aslında bir gruplandırılmış ve bir solo, iki bağlantı ile sona erdi.
Jeff Swensen

8
Bu yaklaşımla ilgili bir sorun, proje özelliklerinde "Yayınla" sekmesine bakıp "Uygulama Dosyaları" düğmesini tıkladığınızda ... app.config, app.Debug.config, app.Release.config, Yayınlama işleminin bir parçası olarak dağıtılmak zorunda kalır. Elbette, doğru MyApp.exe.config dosyasını da alırsınız, ancak fazladan bagajın dağıtılmasını istemiyorum. Projede app. *. Config dosyalarını <Content> yerine <None> olarak tutmanın bir yolu olmalıdır.
Lee Grissom

6
Bazıları için dışarıda bırakılan tek sorun, aslında Oleg Sych'tan alınan cevabın anahtar bir parça bırakmasıdır. Bireysel uygulamanızda. (Env) .configs ise '<configuration xmlns: xdt = " schemas.microsoft.com/XML-Document-Transform ">' ve <appSettings xdt: Transform = "Değiştir"> veya ayar satırlarında benzer şeyler yapan özellikler işe yaramaz. Bu son bilgi biraz anahtar ve ekledikten sonra, her şey çalışmaya başladı.
djangojazz

24
Projenizin VS'nin sonraki tüm sürümleriyle çalıştığından emin olmak için v10.0ile değiştirebilirsiniz v$(VisualStudioVersion).
Thibault D.

14
Bir hata oluştu MSBuild hatası MSB3021: Dosya kopyalanamıyor. Derleme sırasında 'obj \ Release \ ConsoleApp.exe' dosyası bulunamadı. Bu yüzden, çözümde yeni bir benzer oluşturmak yerine hedef <Hedef Adı = "AfterBuild"> bölümünü yeniden kullanmak için çözümü biraz değiştirdim
asidis 5:18

137

Bulduğum başka bir çözüm, dönüşümleri kullanmak DEĞİL, ancak sadece ayrı bir yapılandırma dosyasına sahip olmak, örneğin app.Release.config. Ardından bu satırı csproj dosyanıza ekleyin.

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

Bu yalnızca doğru myprogram.exe.config dosyasını oluşturmakla kalmaz, aynı zamanda MSI oluşturmak için Visual Studio'da Kurulum ve Dağıtım Projesi'ni kullanırsanız, dağıtım projesini paketleme sırasında doğru yapılandırma dosyasını kullanmaya zorlar.


6
MSBuild'in anlatılmamış harikaları. Şimdi başka neyin mümkün olduğunu merak ediyorum. Btw. bu aynı zamanda doğrudan VS'den clickonce dağıtımları için de geçerlidir (daha yüksek oy alan cevapların aksine).
Boris B.15

4
Yapılandırmalar tüm derlemeler için AYNI olan birçok girdi içeriyorsa, değişiklikler zahmetli ve hataya açık hale gelebilir. Şu anda bir ortamın .config dosyasının bir değişikliği kaçırdığı ve elbette üretim olduğu bir sorunla başa çıkmak.
jeepwran

1
Geliştiricilerin el ile bakımını yapmadıkları sürece yapılandırma dosyasının iki kopyasına sahip olmak bir sorun oluşturmaz.
anIBMer

1
Bu güzel, bir cazibe gibi çalışıyor! Yapılandırma için <AppConfig>App.Release.config</AppConfig>mevcut <PropertyGroupkoşulun içine sadece çizgiyi yapıştırdım Releaseve IDE <AppConfig>, şemanın veya başka bir şeyin olmadığını söyleyen ... çizgisinin altında dalgalı bir çizgi gösterdi , ancak dosyayı yine de kaydettim ve proje dosyasını yeniden yükledim ve bir derleme yaptım içinde Releasehem de yapılandırma işe yaradı!
Shiva

1
Bununla, ayar tasarımcısının işlevselliğini kaybedeceksiniz.
Ondřej

33

Deneyimlerime göre, çevreye özgü yapmam gereken şeyler bağlantı dizeleri, aparatlar ve genellikle smpt ayarları gibi şeyler. Yapılandırma sistemi bunları ayrı dosyalarda belirtmeye izin verir. Böylece bunu app.config / web.config dosyasında kullanabilirsiniz:

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

Ne tipik olarak bu yapılandırma özgü bölümleri ayrı dosyalara, ConfigFiles adlı bir alt klasör (çözüm kökünde veya proje düzeyinde, bağlıdır) koymaktır. Konfigürasyon başına bir dosya tanımlıyorum, örneğin smtp.config.Debug ve smtp.config.Release.

Daha sonra şu şekilde bir ön oluşturma etkinliği tanımlayabilirsiniz:

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

Takım geliştirmede,% COMPUTERNAME% ve / veya% USERNAME %'yi kongreye ekleyerek bunu daha da değiştirebilirsiniz.

Tabii ki, bu hedef dosyaların (x.config) kaynak kontrolüne (üretilmeleri nedeniyle) konulmaması gerektiğini gösterir. Yine de bunları proje dosyasına eklemeli ve çıktı türü özelliklerini 'her zaman kopyala' veya 'daha yeniyse kopyala' olarak ayarlamalısınız.

Basit, genişletilebilir ve her türlü Visual Studio projesi (konsol, winform, wpf, web) için çalışır.


Tam olarak aynı yapılandırmaya sahibim. Ama smtp dosyasını dönüştürürken sorunlar yaşıyorum. Orijinal ve dönüşüm dahil edebilir misiniz? Bunlar benim: Temel dosya: <?xml version="1.0"?> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\mail"/> <network host="localhost"/> </smtp> Dönüşüm:<?xml version="1.0"?> <smtp xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Transform="Replace" from="user@email.com" deliveryMethod="Network"> <network .../> </smtp>
jgarza

Anladığımdan emin değilim. Bu konfigürasyonda hiçbir şeyi dönüştürmüyorum, sadece dosyaları kopyalıyor ...
jeroenh

Kopya bölümünü görmedim. Sadece kopyalamak yerine yapılandırmayı dönüştürüyorum. Yine de teşekkürler.
jgarza

Bu çözümü seviyorum. Küçük bir öneri: Yukarıdaki kopya örneğinde, kopya için kaynak ve hedef bağımsız değişkenler tırnak işaretleri içine alınmalıdır; aksi takdirde Pre-Build adında alan bulunan dizinler için başarısız olur
vandre

32

Bu sorudan Oleg ve diğerlerinden esinlenerek , aşağıdakileri etkinleştirmek için https://stackoverflow.com/a/5109530/2286801 çözümünü bir adım daha attım .

  • ClickOnce ile çalışır
  • VS 2010'da Kurulum ve Dağıtım projeleriyle çalışır
  • VS2010, 2013, 2015 ile çalışır (2012 de test edilmedi, ancak aynı zamanda çalışmalıdır).
  • Team Build ile çalışır. (A) Visual Studio veya B'yi yüklemelisiniz) Microsoft.Web.Publishing.targets ve Microsoft.Web.Publishing.Tasks.dll)

Bu çözüm, app.config'e MSBuild işleminde ilk kez başvurulmadan önce app.config dönüşümünü gerçekleştirerek çalışır. Birden fazla projede daha kolay yönetim için harici hedefler dosyası kullanır.

Talimatlar:

Diğer çözüme benzer adımlar. Neyin aynı kaldığını alıntıladım ve eksiksizlik ve daha kolay karşılaştırma için ekledim.

0. Projenize AppConfigTransformation.targets adlı yeni bir dosya ekleyin

<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. Projeye her yapılandırma için bir XML dosyası ekleyin.

Genellikle dosyalarınıza App.Debug.config ve App.Release.config adını vermek için Debug ve Release yapılandırmalarına sahip olursunuz. Projemde, her türlü çevre için bir yapılandırma oluşturdum, böylece bunu denemek isteyebilirsiniz.

2. Projeyi kaldırın ve düzenlemek için .csproj dosyasını açın

Visual Studio .csproj dosyasını doğrudan düzenleyicide düzenlemenize olanak tanır; önce projeyi kaldırmanız yeterlidir. Ardından üzerine sağ tıklayın ve .csproj dosyasını düzenle'yi seçin.

3. App. *. Yapılandırma dosyalarını ana App.config dosyasına bağlayın

Tüm App.config ve App. *. Config başvurularını içeren proje dosyası bölümünü bulun ve aşağıdaki gibi değiştirin. İçerik yerine Hiçbiri kullandığımızı fark edeceksiniz.

<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. dönüşüm büyü etkinleştirin

Sonunda dosyanın sonunda

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

ve finalden önce

</Project>

aşağıdaki XML'i ekleyin:

<Import Project="AppConfigTransformation.targets" />

Bitti!


1
VS Topluluk 2015 RC'de denedim ve sahip olduğum app.Debug.config dosyasını yok sayar.
Khainestar

Kabul edilen yanıtı bir WinForms projesinde başarıyla kullandım ... ancak şaşırtıcı bir sebepten dolayı kabul edilenleri uygulayamadım. başka bir WinForms projesine (hepsi aynı çözümde). @Bdeem'den gelen bu cevap benim yeni favorim - MSI projemle doğru bir şekilde birlikte çalıştığı için - çok teşekkürler!
bkwdesign

Bu VS 2015'te işe yaramadı. VisualStudioVersion'ı 10'dan 12'ye güncelledim ama zar yok. Herhangi bir fikir?
Sinaesthetic

@Sinaesthetic Bize daha fazla ayrıntı verebilir misiniz? VS 2015 Ultimate, Topluluk, vb VB.NET, C #, Herhangi bir hata?
bdeem

VS2015 Kurumsal. Hata yok. Hiçbir şey yapmaz.
Sinaestetik

27

Her yapılandırma için ayrı bir yapılandırma dosyası kullanabilirsiniz, örneğin app.Debug.config, app.Release.config ve ardından proje dosyanızda yapılandırma değişkenini kullanabilirsiniz:

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

Böylece, içinde yapılandırdığınız yapılandırmaya bağlı olarak doğru ProjectName.exe.config dosyası oluşturulur.


Teşekkürler, yaşadığım sorunu çözmek için tam örneğinizi kullanmadım, ancak örneğiniz beni düşündürdü ve Kopyala görevini kullanarak beni çok benzer bir ruha götürdü.
jpierson

Bunu VS 2015 Community RC altında denedim ve oluşturur, ancak daha sonra uygulamanın içeriğini yok sayar. *. Config ekledim.
Khainestar

14

Web Uygulaması Projesi'nde olduğu gibi app.config dönüşümünü otomatikleştirmek için güzel bir uzantı yazdım Yapılandırma Dönüşümünde olduğu

Bu uzantının en büyük avantajı, tüm derleme makinelerine yüklemenize gerek olmamasıdır


1
Çok kullanışlı bir uzatma, özellikle Yavaş Çita bakım moduna giriyor ve gelecekte desteklenmeyebilir.
dthrasher

Evet, bu işlev artık transformxml msbuild görevi tarafından desteklendiğinde, bunun çözümü olarak millet yavaş çitaya gitmeyi bırakmalıdır. Ekibimdeki bir mimar, projemize çok çirkin bir şekilde yavaş çita tanıttı ve çoğu dönüşüm gerektirmeyen tüm yapılandırmalarımızın hata ayıklama, sahne ve sürüm dönüşümlerini yarattı. Söylemeye gerek yok, ayrıldığı anda yavaş çitayı çıkardım ve şimdi sadece web.config üzerinde tek bir transformxml görevi kullanıyoruz. Ahhhhh, basitlik. Yavaş çitaların zamanı ve yeri olmadığını söylememek.
HarryTuttle

5

Visual Studio'da "Yapılandırma Dönüştürme Aracı" nı Market'ten yükleyin ve VS'yi yeniden başlatın. Ayrıca app.config için menü önizleme dönüşümünü de görebilirsiniz.

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


1
Bu mükemmel çalışır ve çok az çaba veya düşünce gerektirir. Çok takdir etmek. Teşekkürler. ('önizleme dönüşümü' çalışmaz, ancak 'dönüşümleri ekle' VS 2017'de sorunsuz çalışır). Ayrıca sık sık güncelleme alıyor gibi görünüyor.
adudley

1
çözüm için çok teşekkür ederim, sahne arkasında, Dan Abramov'un yukarıda açıkladığı şeyi, elinizi kirletmeden tam olarak yapıyor
Mohammed Dawood Ansari

Bu nihai çözümdür. Önizleme VS 2019 ile gayet iyi çalışıyor gibi görünüyor.
Kyle Champion

1
Onu seviyorum, ancak bazı csproj düzenlemesi olmadan diğer app.config dosyalarını desteklemediğini buldu. Yine de önizleme görmek olsa harika.
Ian1971

4

Böylece biraz farklı bir yaklaşım benimsemiştim. Dan'ın adım 3'teki adımlarını izledim, ancak başka bir dosya ekledim: App.Base.Config. Bu dosya, oluşturulan her App.Config dosyasında istediğiniz yapılandırma ayarlarını içerir. Daha sonra geçerli yapılandırmayı Base config ile App.config dosyasına dönüştürmek için BeforeBuild'i (Yuri'nin TransformXml'e ek olarak) kullanıyorum. Derleme işlemi daha sonra dönüştürülmüş App.config dosyasını normal olarak kullanır. Bununla birlikte, bir sıkıntı, sürekli değişen App.config dosyasını daha sonra kaynak kontrolünden çıkarmak istemenizdir, ancak diğer yapılandırma dosyaları artık ona bağımlıdır.

  <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>

3

Şu anda her yerde yayınlanmış gibi görünen çözümde küçük bir gelişme:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • yani, mevcut VS sürümünüzle sonsuza kadar kalmayı planlamıyorsanız,

Lütfen biraz cevap verdiğinizi açıklayabilir misiniz veya açıklamak için kaynaklar verir misiniz?
roydukkey

4
$(VisualStudioVersion)MSBuild doğrudan kullanılırken ayarlanmış gibi görünmüyor .
Jeremy Smith

Bu stackoverflow.com/a/5109530/2003763 için bir yorum olmalıdır (Ben sadece orada bir yorum ile aynı bilgileri ekledim)
Thibault D.

2

Vishal Joshi tarafından yayınlanan eylemi İçerik olarak değiştirme gereksiniminin kaldırıldığı ve ClickOnce dağıtımı için temel desteği uyguladığı başka bir alternatif oluşturdum . Temel diyorum, çünkü tam olarak test etmedim ama tipik ClickOnce dağıtım senaryosunda çalışmalı.

Çözüm, bir kez var olan bir windows uygulama projesine (* .csproj) içe aktarılan tek bir MSBuild projesinden oluşur ve derleme işlemini app.config dönüşümünü tasarlayacak şekilde genişletir.

Visual Studio App.config XML Dönüşümü'nde daha ayrıntılı bir açıklama okuyabilirsiniz ve MSBuild proje dosyası GitHub'dan indirilebilir .


1

Çevrimiçi TFS (Bulut sürümü) kullanıyorsanız ve bir projede App.Config dosyasını dönüştürmek istiyorsanız, herhangi bir ek araç yüklemeden aşağıdakileri yapabilirsiniz. VS => Projeyi kaldırın => Proje dosyasını düzenle => Dosyanın altına gidin ve aşağıdakileri ekleyin:

<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 ve Destination yerel kullanım ve TFS çevrimiçi (Bulut) sunucusu için çalışır.


0

önerilen çözüm, yapılandırma dosyası olan bir sınıf kitaplığına başka bir projeden başvurulduğunda işe yaramaz (benim durumumda Azure çalışan proje kitaplığıydı). Doğru dönüştürülmüş dosyayı objklasörden klasöre kopyalamaz bin\##configuration-name##. Minimum değişikliklerle çalışmasını sağlamak için AfterCompilehedefi şu şekilde değiştirmeniz gerekir BeforeCompile:

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.