如何对 mailSettings 文件执行 XML 变量替换?

How to perform XML variable substitution on mailSettings file?

我们有一个具有以下 system.net mailSettings 属性的 Web.config 文件:

<system.net>
    <mailSettings>
      <smtp configSource="mailSettings.config" />
    </mailSettings>
  </system.net>

mailSettings.config 文件位于项目子根级别下,仅包含以下行:

<smtp from="reports@companyxyz.com" deliveryMethod="Network">
  <network enableSsl="true" host="smtp.sendgrid.net" port="587" userName="" password="" />
</smtp>

我们希望将用户名和密码属性作为变量(最终存储在 Azure Key vault 中,但不在此处的范围内)存储在发布管道中,并且在 Azure App Deployment 任务(下面的 yaml)中有一个选项对于 XML 变量 transformation/substitution.

steps:
- task: AzureRmWebAppDeployment@4
  displayName: 'Deploy Azure App Service'
  inputs:
    azureSubscription: '$(Parameters.ConnectedServiceName)'
    appType: '$(Parameters.WebAppKind)'
    WebAppName: '$(Parameters.WebAppName)'
    enableCustomDeployment: true
    TakeAppOfflineFlag: false
    RenameFilesFlag: false
    enableXmlTransform: true
    enableXmlVariableSubstitution: true

我启用了它,但它怎么知道要转换mailSettings.config模板文件?

这是 XmlVariableSubstitution 开关的说明:

构建或发布管道中定义的变量将与任何配置文件和 parameters.xml 的 appSettings、applicationSettings 和 connectionStrings 部分中的 'key' 或 'name' 条目匹配。配置转换后变量替换为 运行。

注意:如果在发布管道和环境中定义了相同的变量,那么环境变量将取代发布管道变量。

在您的情况下,标准替换将不起作用,因为您已经发现:

Variables defined in the build or release pipeline will be matched against the 'key' or 'name' entries in the appSettings, applicationSettings, and connectionStrings sections of any config file and parameters.xml. Variable Substitution is run after config transforms.

您仍然可以通过使用扩展来实现您的目标 - Replace Tokens

对于默认任务配置,您需要更改文件以将标记定义为 #{VARIABLE_NAME}#。所以在你的情况下它将是:

<smtp from="reports@companyxyz.com" deliveryMethod="Network">
  <network enableSsl="true" host="smtp.sendgrid.net" port="587" userName="#{USER_NAME}#" password="#{PASSWORD}#" />
</smtp>

还要确保放置正确的目标文件。