VSTS/TFS 设置环境变量 ASP.NET 内核

VSTS/TFS set environment variable ASP.NET core

我正在尝试通过以下任务使用 VSTS 将 ASP.NET 核心应用程序部署到 IIS

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

知道如何实现吗?

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

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

更新回复评论:

设置环境变量的推荐方法是在机器本身上 - 即。登录到您要部署到的 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 核心,推荐的配置设置是 appsettings[.environment].json 文件,这些文件根据匹配的机器级别 ASPNETCORE_ENVIRONMENT env 变量自动加载),您需要实际定义使用正确的语法在转换文件中进行转换,并用它替换您要更改的部分。这显然是更难的选择。

请参阅:How to: Transform Web.config When Deploying a Web Application Project for creating the transformation files and 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>

参考以下步骤:

  1. 设置配置文件属性(例如 web.config、web.QA.config),复制到输出目录:如果较新则复制)
  2. .NET Core 任务(命令:restore
  3. .NET Core 任务(命令:build
  4. .NET Core 任务(命令:publish;选中发布 Web 项目选项;参数:--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选项:step4,并通过[=21存档文件=] 发布中的任务)

另一种设置环境变量的方法(除了使用 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

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

由于您的部署有一个 "Dev" 环境,请向您的项目提交以下配置文件:

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 下添加 => include:

"web.dev.config"

在 VSTS 部署中确保检查 IIS Web 应用程序部署任务下的 "XML transformation":

这是我在发布管道中使用的 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)

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

/p:EnvironmentName=Development

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