【问题标题】:Azure Pipelines not substituting XML an empty value with a non-empty valueAzure Pipelines 没有用非空值替换 XML 空值
【发布时间】:2021-03-05 23:31:31
【问题描述】:

我在 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


    【解决方案1】:

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

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

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

    <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 扩展方便。

    【讨论】:

    • 感谢您的建议。但这与我在上面为Test4 所做的那样输入虚拟值具有相同的问题。我需要记住为新值输入虚拟值并更新管道以替换该值,除了替换我一直想要的非空值之外,如果我能让替换正常工作,我会放我的配置文件中的一个空值,只添加我需要的非空替换,就是这样。
    • 你不需要记住新值的虚拟值,因为你不需要改变#{var}#,你只需要为变量var设置值。
    • 如果您不想记住变量/虚拟名称,您可以尝试使用转换文件,如[这种情况][stackoverflow.com/questions/11033001/… 提到的。但是我觉得用这种方式不太方便。
    猜你喜欢
    • 2021-06-27
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多