【问题标题】:App.Exe Config Transform with Azure Devops and Release Variables使用 Azure Devops 和发布变量的 App.Exe 配置转换
【发布时间】:2019-08-21 12:47:41
【问题描述】:

我目前正在使用带有本地构建代理的 Azure Devops 将 Windows 服务部署到内部服务器,并正在寻找有关如何使用我的发布任务中定义的变量转换我的 MyApp.Exe.config 文件的信息。

对于 Web 应用程序,这似乎相当简单。我有一个parameters.xml 文件,它在我的IIS Web Deploy 任务中与SetParameters File 一起使用。这会从发布任务中提取变量并相应地更新 web.config。

但是,我找不到关于如何使用可执行文件的配置文件执行此操作的明确答案。 This document 建议应该可以,但看起来我需要提供一个已设置变量的转换文件。

总之,我要做的是使用Parameters.xml 文件来使用我的发布变量转换可执行文件的配置文件。这如何实现?

【问题讨论】:

  • 你有没有找到一种方法来使用 SetParameters,而不是像下面的答案中建议的那样标记 app.config?
  • @devqon no - 我只是回答了下面的问题。这似乎不太理想,但自去年以来我再也没有考虑过。

标签: azure-devops azure-pipelines azure-pipelines-release-pipeline


【解决方案1】:

您的问题不清楚您要在目标文件中替换哪些值,因此请注意:

". . . 变量替换仅对配置文件的 applicationSettings、appSettings、connectionStrings 和 configSections 元素生效。如果您要替换这些元素之外的值,您可以使用 (parameters.xml) 文件,但是您需要使用 3rd 方管道任务 来处理变量替换。 . . ."

如果找不到第 3 方任务

当然,Document 并没有向我们指出任何偏爱的第 3 方任务。因此,如果您找不到直接对 parameters.xml 文件进行操作的任务,那么您可以使用 File Transform task 将 .config 中的值添加/替换为令牌,然后使用 Replace Tokens 任务插入您的变量值。

示例:

在我的沙箱中,我可以通过在我的管道中添加适当的变量来替换上面引用文本中指定部分中的 xml 值。

鉴于这是我的配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSection>
        <section name="entityFramework" />
    </configSection>
    <connectionStrings>
        <add name="DefaultConnection"
             connectionString="Data Source=(LocalDB)\LocalDB;FileName=Local.mdf" />
    </connectionStrings>
    <appSettings>
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobstructiveJavascriptEnabled" value="true" />
        <add key="AdminUserName" value="__AdminUserName__" />
        

<!-- Change AdminPassword in this line: --> 
        <add key="AdminPassword" value="__AdminPassword__" />


    </appSettings>
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.LocalDbConnectionFactory">
            <parameters></parameters>
        </defaultConnectionFactory>
        <providers>
            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer" />
        </providers>
    </entityFramework>    
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <staticContent>
      <remove fileExtension=".woff" />
      <remove fileExtension=".woff2" />
      <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
      <mimeMap fileExtension=".woff2" mimeType="application/font-woff" />
    </staticContent>
    <security>
      <requestFiltering>


<!-- change this value -->
        <requestLimits maxAllowedContentLength="1073741824" />


      </requestFiltering>
    </security>
  </system.webServer>
</configuration>

并在 yaml 中给出这些变量:

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  AdminPassword: 'fake password'
  maxAllowedContentLength: '25'

鉴于这是 yaml 任务:

- task: FileTransform@1
  inputs:
    folderPath: '$(System.DefaultWorkingDirectory)/src'
    enableXmlTransform: false
    fileType: 'xml'
    targetFiles: '*.config'

结果是这样的:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSection>
        <section name="entityFramework"/>
    </configSection>
    <connectionStrings>
        <add name="DefaultConnection" connectionString="Data Source=(LocalDB)\LocalDB;FileName=Local.mdf"/>
    </connectionStrings>
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobstructiveJavascriptEnabled" value="true"/>
        <add key="AdminUserName" value="__AdminUserName__"/>


        <add key="AdminPassword" value="fake password"/>


    </appSettings>
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.LocalDbConnectionFactory">
            <parameters/>
        </defaultConnectionFactory>
        <providers>
            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer"/>
        </providers>
    </entityFramework>    
    <system.webServer>        
        <security>
            <requestFiltering>


                <requestLimits maxAllowedContentLength="1073741824"/>


            </requestFiltering>
        </security>
    </system.webServer>

注意未替换的值!!

如文档中所述,我想更改的值 &lt;requestLimits maxAllowedContentLength="1073741824"/&gt; 未更改 b/c 它不是由 configSection 定义的,并且不是预定义节点的一部分。

在默认值之外使用第 3 方替换

采用相同的配置文件,但将 yaml 任务更改为包含对以下 transform.config 的转换

给定相同的配置文件

transform.config

<?xml version="1.0" encoding="utf-8"?>

<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.webServer>    
    <security>
      <requestFiltering>


        <!-- change this value -->
        <requestLimits maxAllowedContentLength="${maxAllowedContentLength}$" xdt:Transform="Replace" />


      </requestFiltering>
    </security>
</system.webServer>
</configuration>

新任务设置

- task: FileTransform@1
  inputs:
    folderPath: '$(System.DefaultWorkingDirectory)/src'
    enableXmlTransform: true
    xmlTransformationRules: '-transform transform.config -xml app.config'
    fileType: 'xml'
    targetFiles: '*.config'

- task: replacetokens@3
  inputs:
    rootDirectory: '$(build.sourcesdirectory)/src'
    targetFiles: 'app.config'
    encoding: 'auto'
    writeBOM: false
    actionOnMissing: 'warn'
    keepToken: false
    tokenPrefix: '${'
    tokenSuffix: '}$'

结果是:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSection>
        <section name="entityFramework"/>
    </configSection>
    <connectionStrings>
        <add name="DefaultConnection" connectionString="Data Source=(LocalDB)\LocalDB;FileName=Local.mdf"/>
    </connectionStrings>
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobstructiveJavascriptEnabled" value="true"/>
        <add key="AdminUserName" value="__AdminUserName__"/>


        <add key="AdminPassword" value="fake password"/>


    </appSettings>
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.LocalDbConnectionFactory">
            <parameters/>
        </defaultConnectionFactory>
        <providers>
            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer"/>
        </providers>
    </entityFramework>    
    <system.webServer>        
        <security>
            <requestFiltering>


                <requestLimits maxAllowedContentLength="25"/>


            </requestFiltering>
        </security>
    </system.webServer>

【讨论】:

  • 对于延迟回复非常抱歉,非常感谢您的详细回复。您说“有一个选项可以使用“标记”您的 .config 文件然后使用替换标记任务的文件进行转换”。这个选项在哪里/是什么?
  • @Joe 我不确定有什么不清楚的地方。我已经链接了Replace Tokens 任务,并给出了如何使用它的示例。或许你被“选项”这个词所吸引。这不仅仅是一个复选框。那是一个“行动方案”。基本上:您将创建一个用于标记您的配置的转换文件,然后使用链接任务将这些标记替换为变量值。
猜你喜欢
  • 2019-04-29
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多