asp.net - 指定 Azure 应用服务构建的 MSBuild 版本

标签 asp.net azure msbuild azure-web-app-service kudu

我正在尝试将两个 Web 应用程序从同一 Git 存储库部署到两个不同的 Azure 应用服务应用程序。我在每个应用服务应用程序中使用部署控制台来构建和部署应用程序。为了选择将哪个应用程序部署到哪个应用程序服务应用程序,我在 Azure 门户内为每个应用程序指定一个应用程序设置,称为 PROJECT。然后指向要构建和部署的应用程序的 csproj。这很好用!

但是,我的问题在于告诉构建服务使用最新版本的 MSBuild。它默认为 v.14,不适用于 SDK 样式的 csproj 文件。我尝试将另一个名为 MSBUILD_PATH 的应用程序设置设置为 %MSBUILD_1670_DIR%\MSBuild.exe,但 Kudu 生成的部署脚本仅使用 MSBUILD_PATH构建步骤,而不是 NuGet 恢复步骤,因此它仍然失败,输出:

Command: "D:\home\site\deployments\tools\deploy.cmd"
Using custom deployment setting for MSBUILD_PATH custom value is '%MSBUILD_1670_DIR%\MSBuild.exe'.
Handling .NET Web Application deployment.
MSBuild auto-detection: using msbuild version '14.0.23107.0 built by: D14REL' from 'D:\Program Files (x86)\MSBuild\14.0\Bin'.
Invalid restore input. Missing required property 'OutputPath' for project type 'PackageReference'. Input files: D:\home\site\repository\ProReception.UnitTest\ProReception.UnitTest.csproj.
Failed exitCode=1, command=nuget restore "D:\home\site\repository\ProReception.sln"
An error has occurred during web site deployment.
Invalid restore input. Missing required property 'OutputPath' for project type 'PackageReference'. Input files: D:\home\site\repository\ProReception.UnitTest\ProReception.UnitTest.csproj.\r\nD:\Program Files (x86)\SiteExtensions\Kudu\98.40824.5897\bin\Scripts\starter.cmd "D:\home\site\deployments\tools\deploy.cmd"

构建脚本的模板是这样的:https://github.com/projectkudu/KuduScript/blob/master/lib/templates/deploy.batch.aspnet.wap.template#L10 - 并且 NuGet 恢复命令未指定 -MSBuildPath

因此,建议的修复方法是将您自己的deploy.cmd 脚本添加到您的存储库中,但是如何在不硬编码要构建的项目的情况下实现这一点呢? (因为我有两个项目)。

让这变得更加困难:其中一个 Web 应用程序是在 .NET 4.7.1 上运行的旧 ASP.NET MVC 站点,另一个是在 .NET 6 上运行的较新 ASP.NET Core 站点。所以理想情况下他们需要不同的部署脚本。

如何为每个应用程序使用不同的部署脚本?

最佳答案

好的,我想出了一个临时解决方案,并创建了一个能够部署任一应用程序的 deploy.cmd 脚本。它会查看 PROJECT 环境变量,以确定要部署哪个应用程序。

这是完整的脚本,以防对其他人有帮助:

@if "%SCM_TRACE_LEVEL%" NEQ "4" @echo off

:: ----------------------
:: KUDU Deployment Script
:: Version: 1.0.17
:: ----------------------

:: Prerequisites
:: -------------

:: Verify node.js installed
where node 2>nul >nul
IF %ERRORLEVEL% NEQ 0 (
  echo Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment.
  goto error
)

:: Setup
:: -----

setlocal enabledelayedexpansion

SET ARTIFACTS=%~dp0%..\artifacts

IF NOT DEFINED DEPLOYMENT_SOURCE (
  SET DEPLOYMENT_SOURCE=%~dp0%.
)

IF NOT DEFINED DEPLOYMENT_TARGET (
  SET DEPLOYMENT_TARGET=%ARTIFACTS%\wwwroot
)

IF NOT DEFINED NEXT_MANIFEST_PATH (
  SET NEXT_MANIFEST_PATH=%ARTIFACTS%\manifest

  IF NOT DEFINED PREVIOUS_MANIFEST_PATH (
    SET PREVIOUS_MANIFEST_PATH=%ARTIFACTS%\manifest
  )
)

IF NOT DEFINED KUDU_SYNC_CMD (
  :: Install kudu sync
  echo Installing Kudu Sync
  call npm install kudusync -g --silent
  IF !ERRORLEVEL! NEQ 0 goto error

  :: Locally just running "kuduSync" would also work
  SET KUDU_SYNC_CMD=%appdata%\npm\kuduSync.cmd
)
IF NOT DEFINED DEPLOYMENT_TEMP (
  SET DEPLOYMENT_TEMP=%temp%\___deployTemp%random%
  SET CLEAN_LOCAL_DEPLOYMENT_TEMP=true
)

IF DEFINED CLEAN_LOCAL_DEPLOYMENT_TEMP (
  IF EXIST "%DEPLOYMENT_TEMP%" rd /s /q "%DEPLOYMENT_TEMP%"
  mkdir "%DEPLOYMENT_TEMP%"
)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Deployment
:: ----------

IF /I "%PROJECT%" EQU "ProReception/ProReception.csproj" (
  call :DeployMvc
  goto end
)

IF /I "%PROJECT%" EQU "ProReception.Api/ProReception.Api.csproj" (
  call :DeployApi
  goto end
)

echo Did not match any of the configured apps :( - please review the deploy.cmd script in the root of the repo to add '%PROJECT%' there.
goto error

:DeployMvc
echo Handling .NET Web Application deployment.

:: 1. Restore NuGet packages
IF /I "ProReception.sln" NEQ "" (
  call :ExecuteCmd nuget restore "%DEPLOYMENT_SOURCE%\ProReception.sln" -MSBuildPath "%MSBUILD_1670_DIR%"
  IF !ERRORLEVEL! NEQ 0 goto error
)

:: 2. Build to the temporary path
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
  call :ExecuteCmd "%MSBUILD_1670_DIR%\MSBuild.exe" "%DEPLOYMENT_SOURCE%\ProReception\ProReception.csproj" /nologo /verbosity:m /t:Build /t:pipelinePreDeployCopyAllFilesToOneFolder /p:_PackageTempDir="%DEPLOYMENT_TEMP%";AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS%
) ELSE (
  call :ExecuteCmd "%MSBUILD_1670_DIR%\MSBuild.exe" "%DEPLOYMENT_SOURCE%\ProReception\ProReception.csproj" /nologo /verbosity:m /t:Build /p:AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS%
)

IF !ERRORLEVEL! NEQ 0 goto error

:: 3. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
  call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_TEMP%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
  IF !ERRORLEVEL! NEQ 0 goto error
)

:DeployApi
echo Handling ASP.NET Core Web Application deployment.

:: 1. Restore, Build and publish
call :ExecuteCmd "%MSBUILD_1670_DIR%\MSBuild.exe" /restore "%DEPLOYMENT_SOURCE%\ProReception.Api\ProReception.Api.csproj" /p:DeployOnBuild=true /p:configuration=Release /p:publishurl="%DEPLOYMENT_TEMP%" %SCM_BUILD_ARGS%
IF !ERRORLEVEL! NEQ 0 goto error

:: 2. KuduSync
call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_TEMP%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
IF !ERRORLEVEL! NEQ 0 goto error

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Execute command routine that will echo out when error
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%

:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul

:exitSetErrorLevel
exit /b 1

:exitFromFunction
()

:end
endlocal
echo Finished successfully.

关于asp.net - 指定 Azure 应用服务构建的 MSBuild 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74136986/

相关文章:

c# - Angular.js - CORS - ASP.NET - Rest API - 在 Access-Control-Allow-Origin header 中找不到来源

c# - 根据下拉列表在 gridview 中显示结果数?

Azure 应用服务、移动应用或 Api 应用;有什么不同?

msbuild - 如何将 MSB3245(无法解析引用)警告视为错误?

c# - "GenerateAppxPackageRecipe"任务没有为所需参数 "AppxManifestXml"赋值

asp.net - 将 ASP.NET 应用程序拆分为两个应用程序 - 处理共享页面/用户控件/脚本

ASP.NET MVC 是否已准备好用于业务应用程序(集成第 3 方控件/组件)?

Azure 本地 git - 部署 Node.js 应用程序时出现问题

node.js - Azure 存储 TableQuery Where 子句与 node.js

visual-studio - CruiseControl.NET、Visual Studio 和 SubVersion