2011-08-31 18 views
1

我想使用MSBuild中的XmlMassUpdate任務來更新所有app.configs中的appSettings。我遇到的問題是一些app.configs沒有appSettings元素,我不能讓XmlMassUpdate跳過這些元素。使用XmlMassUpdate更新所有appSettings

這裏就是我這麼遠

<ProjectExtensions> 
    <appSettings xmlns:xmu="urn:msbuildcommunitytasks-xmlmassupdate"> 
    <add xmu:key="key" key="SettingName" value="newSetting" xmu:action="update" /> 
    </appSettings> 
</ProjectExtensions> 
<Target Name="Change"> 
    <ItemGroup> 
    <AppConfigFiles Include="$(SourceRoot)\**\App.config" /> 
    </ItemGroup> 
    <XmlMassUpdate 
     ContentFile="$(SourceRoot)\%(AppConfigFiles.RecursiveDir)App.config" 
     ContentRoot="/configuration/appSettings" 
     NamespaceDefinitions="msb=http://schemas.microsoft.com/developer/msbuild/2003" 
     SubstitutionsFile="$(MSBuildProjectDirectory)\SetConfig.proj" 
     SubstitutionsRoot="/msb:Project/msb:ProjectExtensions/msb:appSettings" /> 
</Target> 

在App.configs的一個說無法找到它失敗「/配置/的appSettings」

回答

1

你需要做的是,在2個步驟:

  • 查詢在app.config來檢查標籤/configuration/appSettings只跟TA文件存在
  • 呼叫XmlMassUpdate摹

<ProjectExtensions> 
    <appSettings xmlns:xmu="urn:msbuildcommunitytasks-xmlmassupdate"> 
    <add xmu:key="key" key="SettingName" value="newSetting" xmu:action="update" /> 
    </appSettings> 
</ProjectExtensions> 

<Target Name="UpdateIfNecessary"> 
    <!-- Check if appSettings exists--> 
    <XmlQuery XmlFileName="$(AppConfigFile)" 
      XPath = "/configuration/appSettings"> 
    <Output TaskParameter="Values" ItemName="appSettings" /> 
    </XmlQuery> 

    <!-- Replace if appSettings exists --> 
    <XmlMassUpdate Condition="%(appSettings._innerXml) != ''" 
    ContentFile="$(AppConfigFile)" 
    ContentRoot="/configuration/appSettings" 
    NamespaceDefinitions="msb=http://schemas.microsoft.com/developer/msbuild/2003" 
    SubstitutionsFile="$(MSBuildProjectDirectory)\SetConfig.proj" 
    SubstitutionsRoot="/msb:Project/msb:ProjectExtensions/msb:appSettings" /> 
</Target> 


<Target Name="MassUpdate"> 
    <ItemGroup> 
    <AppConfigFiles Include="$(SourceRoot)\**\App.config" /> 
    </ItemGroup> 

    <!-- Execute UpdateIfNecessary for each app.config file --> 
    <MSBuild Projects="$(MSBuildProjectFile)" 
      Targets="UpdateIfNecessary" 
      Properties="AppConfigFile=%(AppConfigFiles.Fullpath)"/> 
</Target> 
+0

真棒,那工作!一個小問題,我不得不將XmlMassUpdate中的ContentFile更新爲$(AppConfigFile)。 – Ray

+0

哦,是的......我的錯誤。現在已經糾正了。謝謝 –