gpt4 book ai didi

msbuild - 如何使用 MSBuild 'afterbuild' 任务编辑 .config 文件?

转载 作者:行者123 更新时间:2023-12-02 02:03:17 25 4
gpt4 key购买 nike

我的目标项目中有一个 .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文件的灵感: http://weblogs.asp.net/bsimser/appending-nodes-in-xml-files-with-xmlpeek-and-xmlpoke-using-nant

  <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 文件中???

最佳答案

我也遇到了同样的问题。我找到了解决方案here

问题在于 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 替换每个分号

关于msbuild - 如何使用 MSBuild 'afterbuild' 任务编辑 .config 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24487707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com