首页 > 解决方案 > Azure Pipelines 没有用非空值替换 XML 空值

问题描述

我在 Azure 中设置了一个管道,它在运行时使用变量替换 XML 配置文件中的值。我将应用程序中的一个错误追溯到没有正确值的配置文件,我可以从管道日志中看到预期值没有被替换。

我最初认为这是因为我使用了自闭合标签,但是用完整标签替换它们并不能解决问题,用空白值替换它们并不能解决问题。

在其他方面,管道运行良好。我的测试表明它将用空值或非空值替换非空值。但我不能让它用任何东西替换和清空值。所以我认为这并不明显,例如它没有完全跳过替换,它可以匹配变量,变量在applicationSettings部分中,等等。搜索似乎只显示几年前的东西,并且通常替换非空值有一个空值,这与我正在尝试的相反。

我可以在默认配置文件中放入虚拟值并根据需要用空/非空值替换它们,但这将涉及向管道添加一堆变量,只是在大多数情况下用空值替换它们。这也意味着我需要记住在配置文件中添加任何具有虚拟值的新条目并相应地更新管道。

有没有其他人遇到过这个问题?如果是这样,您是否解决了它以及如何解决?

我的配置文件示例:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  ...
  <applicationSettings>
    <App.Namespace>
      <setting name="Test1" serializeAs="String">
        <value />
      </setting>
      <setting name="Test2" serializeAs="String">
        <value></value>
      </setting>
      <setting name="Test3" serializeAs="String">
        <value> </value>
      </setting>
      <setting name="Test4" serializeAs="String">
        <value>dummy</value>
      </setting>
    </App.Namespace>
  </applicationSettings>
  ...
</configuration>      

管道变量

Test1 -> Value1
Test2 -> Value2
Test3 -> Value3
Test4 -> Value4

输出配置

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  ...
  <applicationSettings>
    <App.Namespace>
      <setting name="Test1" serializeAs="String">
        <value />             <!-- Expected Value1 -->
      </setting>
      <setting name="Test2" serializeAs="String">
        <value></value>       <!-- Expected Value2 -->
      </setting>
      <setting name="Test3" serializeAs="String">
        <value> </value>      <!-- Expected Value3 -->
      </setting>
      <setting name="Test4" serializeAs="String">
        <value>Value4</value> <!-- Correct -->
      </setting>
    </App.Namespace>
  </applicationSettings>
  ...
</configuration>      

标签: azure-pipelines

解决方案


您可以使用Replace Tokens扩展。使用此扩展,您可以将令牌替换为空值或非空值。例如,将值设置为#{var}#,如果要使用空字符串,请将变量设置var(empty)

  <setting name="Test" serializeAs="String">
    <value>#{var}#</value>
  </setting>

如果您不想记住变量/虚拟名称,您可以尝试使用这种情况下提到的转换文件。例如:

<applicationSettings xdt:Transform="Replace">
    <App.Namespace>
      <setting name="Test1" serializeAs="String">
        <value>value1</value>
      </setting>
      <setting name="Test2" serializeAs="String">
        <value>value2</value>
      </setting>
      <setting name="Test3" serializeAs="String">
        <value>value3</value>
      </setting>
      <setting name="Test4" serializeAs="String">
        <value>value4</value>
      </setting>
    </App.Namespace>
  </applicationSettings>

但我认为这个解决方案并不比使用 Replace Tokens 扩展方便。


推荐阅读