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>
参考以下步骤:
- 设置配置文件属性(例如 web.config、web.QA.config),复制到输出目录:如果较新则复制)
- .NET Core 任务(命令:
restore
)
- .NET Core 任务(命令:
build
)
- .NET Core 任务(命令:
publish
;选中发布 Web 项目选项;参数:--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)
;选中 Zip Published Projects
选项)
- 发布构建工件(发布路径:
$(build.artifactstagingdirectory)
)
- 打开发布定义,更改环境名称(例如QA,匹配配置文件名称)
- IIS Web Deploy任务:(包或文件夹:
$(System.DefaultWorkingDirectory)\**\*.zip
;勾选XML transformation
选项(根据环境名称寻找转换源文件)
- 然后
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。
我正在尝试通过以下任务使用 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>
参考以下步骤:
- 设置配置文件属性(例如 web.config、web.QA.config),复制到输出目录:如果较新则复制)
- .NET Core 任务(命令:
restore
) - .NET Core 任务(命令:
build
) - .NET Core 任务(命令:
publish
;选中发布 Web 项目选项;参数:--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)
;选中Zip Published Projects
选项) - 发布构建工件(发布路径:
$(build.artifactstagingdirectory)
) - 打开发布定义,更改环境名称(例如QA,匹配配置文件名称)
- IIS Web Deploy任务:(包或文件夹:
$(System.DefaultWorkingDirectory)\**\*.zip
;勾选XML transformation
选项(根据环境名称寻找转换源文件) - 然后
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。