2015-07-21 13 views
5

Üç web projesi (bir çok sınıf kitaplığı projesinin yanı sıra) içeren bir çözümüm var. Web projeleri, tüm ortam yapılandırmasını belirtmek için Web.config dönüşümlerini kullanır.Web.config dönüşümü yayınlanmak üzere iki kez yayınlanıyor

Ben Web.config var adlı birden yapı profilleri için dönüşümleri Web.UAT.config, Web.Staging.config ve Web.Release.config

ben bina ve MSBuild kullanarak benim CI sunucusundan proje dağıtma am aşağıdaki argümanlarla: elementler iki kez görünen xdt:Transform="Insert" işaretli ile tam olarak bir üç projenin için

/t:Clean,Build /p:Configuration=UAT;DeployOnBuild=True;PublishProfile=UAT 

, web.config iki kez uygulanmıyor görünen dönüşümleri.

PreTransformWebConfig 
TransformWebConfigCore 
PostTransformWebConfig 
PreProfileTransformWebConfig 

Fakat sorunlu proje (hemen yukarıda sıralananlar sonra) bu hedefleri çalıştırır:

ProfileTransformWebConfigCore 
PostProfileTransformWebConfig 

cevap

5

.csproj dosyaları inşa çıktıda bakıldığında her üç proje aşağıdaki hedefleri çalıştırmak gibi görünüyor dönüş ithalat \Web\Microsoft.Web.Publishing.targets yılında

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> 

Bu dosyayı da VSToolsPath altında: web için projeler varsayılan olarak aşağıdakileri içerir (benim dev makinede, bu C:\Program Files (x86)\MSBuild\VisualStudio\v12.0'a karşılık gelir).

bu dosyanın ilginç segmenti benziyor aşağıdadır:

<ProjectProfileTransformFileName Condition="'$(ProjectProfileTransformFileName)'=='' And '$(PublishProfileName)' != '' ">$(_ProjectConfigFilePrefix).$(PublishProfileName)$(_ProjectConfigFileExtension)</ProjectProfileTransformFileName> 

<!--if $(TransformWebConfigEnabled) is also enabled and the ConfigTransform and ProfileTransform happen to have same filename, we default $(ProfilefileTransformWebCofnigEnabled) to false so it doesn't do double transform--> 
<ProfileTransformWebConfigEnabled Condition="'$(ProfileTransformWebConfigEnabled)'=='' And '$(TransformWebConfigEnabled)' == 'true' And ('$(ProjectProfileTransformFileName)' == '$(ProjectConfigTransformFileName)')">False</ProfileTransformWebConfigEnabled> 

false ProfileTransformWebConfigEnabled, sadece varsayılan şartına bağlıdır ProfileTransformWebConfigCore çalışan, sonucu oluyordu dönüşümü çift ProjectProfileTransformFileName ve ProjectConfigTransformFileName eğer eşittir. Bu hedef çıkışı aşağıdaki sorunlu proje için

<Target Name="DebugWebConfigTransform" AfterTargets="PreProfileTransformWebConfig"> 
    <Message Text="ProjectProfileTransformFileName: $(ProjectProfileTransformFileName)"/> 
    <Message Text="ProjectConfigTransformFileName: $(ProjectConfigTransformFileName)"/> 
    </Target> 

:

benim projelerin üçü için aşağıdaki hedef eklenen bu iki değer farklıydı yana

DebugWebConfigTransform: 
    ProjectProfileTransformFileName: Web.UAT.config 
    ProjectConfigTransformFileName: Web.Release.config 

, çift Yukarıda açıklanan nedenlerden dolayı dönüşüm meydana geldi.

ProjectConfigTransformFilename öğesinin Web.Release.config olarak ayarlanması, .sln dosyamdaki ProjectConfigurationPlatforms dosyasının yanlış olmasıydı. Bu proje için .sln dosyasının Yapılandırma | Platform çifti UAT|Any CPU eşleştirildi Release|Any CPU.

I (bu UAT iki kez dönüşümü uygulayarak farksızdı nedeniyle benim dönüşümler kesin doğası ve uygulandıkları sıraya) aslında UAT ve Yayın sonucu dönüşür uygulayarak düşünüyorum.

Çözüm dosyasındaki ProjectConfigurationPlatforms eşleştirmesi güncellemesi, benim için sorunu çözdü.

0

Bu sorun benim için oluşuyordu çünkü farklı yapılandırmalar kullanarak çözüm yapılandırmamda birden çok projem vardı.Birden fazla web.config koşuyordu

çünkü bu yapılandırmanın dönüşümleri:

Configuration Manager

artık benim web.config sorunları alınan aynı yapılandırmayı kullanmak projeler geçtikten sonra.