【问题标题】:VSTS/TFS set environment variable ASP.NET coreVSTS/TFS 设置环境变量 ASP.NET core
【发布时间】:2017-12-12 00:20:04
【问题描述】:

我正在尝试使用 VSTS 将 ASP.NET Core 应用程序部署到 IIS,并执行以下任务

但是,经过大量谷歌搜索和浏览 MS 文档后,我找不到为部署设置环境变量的方法。我在环境范围内的发布定义中设置的变量没有被设置为环境变量。

知道如何实现吗?

【问题讨论】:

  • 基于此线程developercommunity.visualstudio.com/content/problem/165842/…,您有一个解决方法,您可以发布答案并接受它作为答案。另一方面,如果尝试使用我的解决方案,详细日志是什么?
  • 部署成功,所以日志中没有错误。但是没有应用转换。不知道是不是因为xdt:Tranform不适用于environmentVariable节点?顺便说一句,Intellisense 将该属性标记为错误。

标签: c# asp.net asp.net-core azure-devops azure-pipelines-release-pipeline


【解决方案1】:

您在 VSTS 中设置的环境变量仅用于部署本身(即 VSTS 所做的任何事情,例如构建应用程序或运行单元测试),但运行时应用程序将使用托管它的服务器上的任何一个。

如果您希望部署的应用程序也使用环境变量,则需要在 VSTS 部署到的 IIS 服务器上设置环境变量。 Microsoft 文档显示如何根据您的服务器进行设置:Setting the environment

响应 cmets 的更新:

设置环境变量的推荐方法是在机器本身上 - 即。登录到您要部署到的 IIS 服务器并在 system properties -> advanced settings -> environment variables 中添加 ASPNETCORE_ENVIRONMENT 环境变量

如果由于某种原因您无法执行此操作,您可以在 Web.config 文件中设置它们(根据该文档)。如果您总是设置相同的值,您应该能够像这样将您需要的内容放在Web.config

<environmentVariables>
  <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>

如果您真的需要 XML 转换(老实说,我不确定您是否在这种情况下这样做 - 这是为了在部署时根据构建配置更改 Web.config 文件。正如其他人提到的那样,使用asp.net core 推荐的配置设置是appsettings[.environment].json 文件,这些文件是根据匹配的机器级别ASPNETCORE_ENVIRONMENT env 变量自动加载的),您需要使用正确的语法在转换文件中实际定义转换并让它替换你想改变的部分。这显然是更困难的选择。

请参阅:How to: Transform Web.config When Deploying a Web Application Project 用于创建转换文件,Web.config Transformation Syntax for Web Project Deployment Using Visual Studio 用于配置语法(如果您选择沿该路径)

类似这样的东西(目前无法测试,但这应该会给你一个想法——注意转换文件上的转换命名空间和xdt: 属性)。我相信加载的转换文件与您可能需要配置为 VSTS 任务的一部分的构建配置相匹配:

Web.config

<configuration>
  <system.webServer>
    <aspNetCore ...>
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

Web.Release.config(构建配置“Release”的转换文件)

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer>
    <aspNetCore ...>
      <environmentVariables>
        <environmentVariable xdt:Transform="Replace" xdt:Locator="Match(name)" name="ASPNETCORE_ENVIRONMENT" value="Production" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

【讨论】:

  • 谢谢 - 从您提供的链接看来,环境变量只能在 web.config 中设置。现在,如何根据环境转换 web.config 文件。例如如果我在web.config 文件中有&lt;environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" /&gt;,有没有办法在每个环境中覆盖它?我在 VSTS 任务 (docs.microsoft.com/en-us/vsts/build-release/tasks/deploy/…) 中勾选了 XML variable substitutionXML transformation 选项,但它们没有进行转换。
  • 我已经有一段时间没有使用 web.config 文件了,但我相信你会为每个环境创建一个文件,例如。 *.&lt;EnvironmentName&gt;.config 所以你可以创建一个 Web.config 和一个 Web.Development.config 和一个 Web.Production.config 并且 XML 转换设置将根据环境构建你的最终配置(我认为在这种情况下将由你的 VSTS 环境变量决定)。见:docs.microsoft.com/en-us/vsts/build-release/tasks/…
  • @ubi 对于 Asp.Net core 项目,最好使用 appsettings.json 和 appsettings.[环境名称].json 文件,之后可以用 appsettings 覆盖 appsettings.json 中的相关值。 [环境名称].json 每个环境 (ASPNETCORE_ENVIRONMENT)。另一方面,我建议在新的论坛主题中提出单独的问题。因此,论坛读者可以轻松识别问题和答案。
  • 实际上,我面临的问题是我在web.config 中设置的变量(ASPNETCORE_ENVIRONMENT)没有得到转换。
  • @starian chen-MSFT 我认为你误解了这里的问题。 Ubi 正在尝试在部署时设置 ASPNETCORE_ENVIRONMENT 变量(大概是为了加载正确的 appsettings.json 文件)
【解决方案2】:

对于带有 web.config 的 ASP.NET Core 1.x 项目,您可以使用以下内容。

由于您的部署具有“开发”环境,因此向您的项目提交以下配置文件:

web.Dev.config

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer>
    <aspNetCore>
      <environmentVariables xdt:Transform="InsertIfMissing" />
      <environmentVariables>
        <environmentVariable xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)" name="ASPNETCORE_ENVIRONMENT" />
        <environmentVariable xdt:Transform="Replace" xdt:Locator="Match(name)" name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>
  • 以上将在您的 web.config 中创建 environmentVariables 部分(如果它尚不存在)。
  • 根据需要将 web.Dev.config 中的“Dev”替换为其他环境名称。
  • ASPNETCORE_ENVIRONMENT 用作上面的示例,更改为其他 变量。
  • 如果您的 web.config 在configuration 元素上没有相同的命名空间属性,请从上面的configuration 元素中删除xmlns="" 属性。

在您的 project.json 中,在 publishOptions => 下添加:

"web.dev.config"

在 VSTS 部署中,确保选中 IIS Web App Deploy 任务下的“XML 转换”:

【讨论】:

    【解决方案3】:

    这是我在发布管道中使用的 powershell 脚本(我不喜欢在构建中设置 ASPNETCORE_ENVIRONMENT)

    参数:

    -p $(System.DefaultWorkingDirectory)\$(Build.DefinitionName)\drop\testbld-Test\web.config -e Development
    

    内联脚本:

    param ([string]$p,[string]$e)
    $doc = new-object System.Xml.XmlDocument
    $location = "$p"
    $doc.Load($location)
    $subNode = $doc.CreateElement("environmentVariable")
    $node = $doc.CreateElement("environmentVariables")
    $doc.SelectSingleNode("//aspNetCore").AppendChild($node)
    $doc.SelectSingleNode("//environmentVariables").AppendChild($subNode)
    foreach($nd in $subNode) {$nd.SetAttribute("name", "ASPNETCORE_ENVIRONMENT");$nd.SetAttribute("value", "$e");}
    $doc.Save($location)
    

    【讨论】:

      【解决方案4】:

      请参考以下步骤:

      1. 设置配置文件属性(例如 web.config、web.QA.config),复制到输出目录:如果较新则复制)
      2. .NET Core 任务(命令:restore
      3. .NET Core 任务(命令:build
      4. .NET Core 任务(命令:publish;检查 Publish Web Projects 选项;参数:--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory);检查Zip Published Projects 选项)
      5. 发布构建工件(发布路径:$(build.artifactstagingdirectory)
      6. 打开发布定义,更改环境名称(例如 QA,匹配配置文件名)
      7. IIS Web Deploy任务:(包或文件夹:$(System.DefaultWorkingDirectory)\**\*.zip;勾选XML transformation选项(根据环境名称查找转换源文件)
      8. 然后web.[environmentname].config文件(例如web.QA.config)将被转换为web.config文件。

      您也可以通过XDT transform任务来完成,(文件不能在zip文件中,所以取消勾选Zip Published Projects选项:第4步,并通过Archive Files任务在发布中归档文件)

      【讨论】:

        【解决方案5】:

        另一种设置环境变量的方法(除了使用XML transform 方法)是添加一个Powershell 任务,该任务使用appCmd 命令在ApplicationPool 范围内设置环境变量

        C:\Windows\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='XyzPool'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Dev']" /commit:apphost
        

        【讨论】:

          【解决方案6】:

          我在构建的“发布”步骤中将其作为参数添加:

          /p:EnvironmentName=Development
          

          然后它将被添加到构建输出的 web.config 中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-11-16
            • 1970-01-01
            • 2018-03-08
            • 2018-05-18
            • 2016-10-06
            • 2018-07-13
            • 1970-01-01
            相关资源
            最近更新 更多