4

ターゲット プロジェクトに .config があり、MSBuild タスクを介してプログラムで行を追加する必要があります。

次のような疑似操作:

  • ターゲットの .config ファイルを見つける
  • 新しいノードの属性の値を決定します (例: 'package' ノードの 'id' と 'version')
  • 新しいノードを正しい親ノードに挿入する
  • 変更内容を保存

$TargetProjectDir\Config\packages.config の .config ファイル:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="ABC" version="1.1.0.4" />
  <package id="XYZ" version="2.0.0.0" />
</packages>

その後、次のようにする必要があります。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="ABC" version="1.1.0.4" />
  <package id="XYZ" version="2.0.0.0" />
  <package id="CarDataWidget" version="3.0.0.0" />
</packages>

これまでのところ、「インライン タスク」、「EXEC」タスク、および「XmlPoke」タスクの使用を検討しましたが、いずれも機能させることができませんでした。

XmlPoke と XmlPeek を使用した私の試みは次のとおりです。

packages.config ファイルにノードを追加する方法については、次の記事を参考にしました 。使い方ナント

  <Target Name="AfterBuild" DependsOnTargets="AddPackage">
  </Target>
  <Target Name="AddPackage">
    <!-- Load existing nodes into a Property -->
    <XmlPeek XmlInputPath="config/packages.config" Query="/packages/package" >
      <Output TaskParameter="Result" PropertyName="Peeked" />
    </XmlPeek>
    <Message Text="From Peek: $(Peeked)"></Message>

    <!-- Load new node into Property -->
    <PropertyGroup>
      <WidgetName>CarDataWidget</WidgetName>
      <WidgetVersion>2.0.0.0</WidgetVersion>
      <NewNode>&lt;package id&#61;&quot;$(WidgetName)&quot; version&#61;&quot;$(WidgetVersion)&quot; /&gt;</NewNode>

    <!-- Concatenate existing and new node into a Property -->
      <ConcatenatedNodes>$(Peeked)$(NewNode)</ConcatenatedNodes>
    </PropertyGroup>
    <Message Text="New pacakges: $(ConcatenatedNodes)"></Message>

    <!-- Replace existing nodes with concatenated nodes -->
    <XmlPoke Value="$(ConcatenatedNodes)" XmlInputPath="config/packages.config" Query="/packages">
    </XmlPoke>
  </Target>

上記のビルドからの出力は次のとおりです。

1>AddPackage:
1>  From Peek: <package id="ABC" version="1.1.0.4" />;<package id="XYZ" version="2.0.0.0" />
1>  New pacakges: <package id="ABC" version="1.1.0.4" />;<package id="XYZ" version="2.0.0.0" /><package id="CarDataWidget" version="2.0.0.0" />
1>  C:\_dev\CarDataWidget.csproj(184,14): 
    error MSB4094: "<package id="ABC" version="1.1.0.4" />;<package id="XYZ" version="2.0.0.0" /><package id="CarDataWidget" version="2.0.0.0" />" 
    is an invalid value for the "Value" parameter of the "XmlPoke" task. 
    Multiple items cannot be passed into a parameter of type "Microsoft.Build.Framework.ITaskItem".
1>
1>Build FAILED.

質問: 既存のパッケージ ノードを含む .config ファイルに追加するにはどうすればよいですか?

4

4 に答える 4

6

私も同じ問題を抱えていました。ここで解決策を見つけました。

問題は、XmlPoke がセミコロンを値の区切り記号と見なすことです。

これを置き換える必要があります:

<NewNode>&lt;package id&#61;&quot;$(WidgetName)&quot; version&#61;&quot;$(WidgetVersion)&quot; /&gt;</NewNode>

と:

<NewNode>&lt%3Bpackage id&#61%3B&quot%3B$(WidgetName)&quot%3B version&#61%3&quot%3$(WidgetVersion)&quot%3 /&gt%3</NewNode>

各セミコロンをシーケンス%3Bに置き換える必要があります

于 2015-02-26T20:01:05.967 に答える
3

MSBuild Extension Packを使用してそれを行う方法を次に示します。

パッケージとバージョンを NewPackage 項目グループに設定すると、それらが XML ファイルに追加されます。

<Project 
    ToolsVersion="4.0" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Import Project="$(MSBuildExtensionsPath)\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks" />

  <Target Name="Test" DependsOnTargets="AddPackage">
  </Target>

  <ItemGroup>
    <NewPackage Include="CarDataWidget">
        <Version>3.0.0.0</Version>
    </NewPackage>
    <NewPackage Include="FooBarWidget">
        <Version>1.2.3.4</Version>
    </NewPackage>
  </ItemGroup>

  <Target Name="AddPackage">

    <PropertyGroup>
        <InputFile>in.xml</InputFile>
        <OutputFile>out.xml</OutputFile>
    </PropertyGroup>

    <Copy SourceFiles="$(InputFile)" DestinationFiles="$(OutputFile)" />

    <MSBuild.ExtensionPack.Xml.XmlFile
      TaskAction="AddElement"
      File="$(OutputFile)"
      XPath="//packages"
      Element="package"
      Key="id"
      Value="%(NewPackage.Identity)" />

    <MSBuild.ExtensionPack.Xml.XmlFile
      TaskAction="AddAttribute"
      File="$(OutputFile)"
      XPath="//packages/package[@id='%(NewPackage.Identity)']"
      Key="version"
      Value="%(NewPackage.Version)" />
  </Target>
</Project>
于 2014-07-03T18:53:28.603 に答える
1

古いスレッドを起動することを望んでいません。web.config の appsettings セクションに新しいキーを追加する必要があるという正確なシナリオがありました。私はOPコードから始めましたが、同じ問題に悩まされていました。新しい連結された値が書き込まれるのを防ぎます。Replace 関数を使用して ; を削除することで修正しました。

          <ConcatenatedNodes>$(Peeked)$(NewNode)</ConcatenatedNodes>          
          <!--in the concatenatednode, remove semicolon-->
          <ChangedPeek>$(ConcatenatedNodes.Replace(";",""))</ChangedPeek>
          <!-- Replace existing nodes with concatenated nodes-->
          <XmlPoke XmlInputPath="%(WebConfigFilesSolutionDir.FullPath)" Query="//appSettings" Value="$(ChangedPeek)" />

MSBuild を使用して webconfig の appsetting セクションに新しいキーを追加する方法に関する完全な回答については、https: //stackoverflow.com/a/56760009/6664129 を参照してください。

于 2019-06-26T15:55:31.243 に答える
0

次の方法を比較する私のブログ投稿http://sedodream.com/2011/12/29/UpdatingXMLFilesWithMSBuild.aspxを見てください。

  1. SlowCheetah を使用してファイルを変換します
  2. TransformXml タスクを直接使用する
  3. 組み込み (MSBuild 4.0) XmlPoke タスクを使用する
  4. サードパーティのタスク ライブラリを使用する
于 2014-07-15T01:27:50.683 に答える