1

MSBuildのXmlMassUpdateタスクを使用して、すべてのapp.configsのappSettingsを更新したいと思います。私が抱えている問題は、一部のapp.configにappSettings要素がなく、XmlMassUpdateでそれらをスキップできないことです。

これが私がこれまでに持っているものです

<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の1つで失敗し、「/ configuration/appSettings」が見つかりません」と表示されます

4

1 に答える 1

1

あなたは2つのステップでそれをする必要があります:

  • app.configをクエリして、タグ/configuration/appSettingsが存在するかどうかを確認します
  • タグ付きのファイルでのみ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>
于 2011-08-31T11:59:34.110 に答える