在 Azure (Kudu) 部署期间以编程方式设置应用程序设置/环境变量

Programatically set app setting / env variable during Azure (Kudu) deployment

总结

我正在尝试将 MVC5 Web 应用程序部署到 Azure。我需要以编程方式设置 WEBSITE_NODE_DEFAULT_VERSION 以确保所有配置都自动包含在回购协议中。当我尝试在 .deploymentdeploy.cmd 中设置该应用程序设置/环境变量时,它会被部署忽略。为什么?

背景

我的网络应用程序使用 Bower 作为客户端库,并使用一个简单的 gulp 脚本将最小化的库放在目标文件夹中。我的 cshtml 文件然后从所述目标文件夹中使用它们。

根据 ,我已经从 Azure 下载部署脚本(.deploymentdeploy.cmd)并调整它以安装 bower。

Then download your custom deployment script. if you go to https://.scm.azurewebsites.net then click on Tools -> Download custom deployment script or just download it from D:\home\deployment\tools

然后我的研究表明,npm 在 Azure Web 应用程序部署中默认可用,并且 bower 包是预安装的,但 gulp 不是。所以我需要在部署脚本中添加 3 个自定义命令:

  1. npm install(需要 gulp 可用)
  2. bower 安装(下拉客户端库)
  3. gulp(流水线客户端库)

根据 ,我面临的问题是正在使用的节点(以及 npm)是旧版本。 npm install 命令导致文件名太长,这是旧版本 npm 中的一个已知问题。

Per this set of Kudu runtime settings,我正在尝试将 WEBSITE_NODE_DEFAULT_VERSION 设置为 6.7.0(在这个问题出现时是最新的),因为这将确保最新的 npm 也运行。

这是我的问题所在。deploy.cmd 中,在 运行 npm install 之前,我添加了一行 set WEBSITE_NODE_DEFAULT_VERSION = 6.7.0 (我已经尝试过变体,包括带引号、等号周围没有空格、带 setlocal 等)我在设置变量的任一侧 echo %WEBSITE_NODE_DEFAULT_VERSION%。前后输出总是4.4.7.

我也在.deployment试过了,没用。我什至尝试改变位置(有时在 command = deploy.cmd 之前,有时在之后)。

根据我可以从网上破译的信息,我上面的方法中至少 一个 应该有效... 为什么我不能设置这个应用程序设置/ 部署脚本中的环境变量?

更新

根据 ,我无法在 .deployment 文件中设置应用程序设置。这与网络上的其他文章不同,但它仍然没有解释为什么 SET 在 deploy.cmd 文件中不起作用。

文件

.部署

[config]
;Change node version to change npm version to avoid long-file-name situations
WEBSITE_NODE_DEFAULT_VERSION = 6.7.0
command = deploy.cmd

deploy.cmd

(REDACTED - default stuff)
echo :: 4. NPM Install (borrowing from 
IF EXIST "%DEPLOYMENT_TARGET%\package.json" (
  :: Set the node version. Tried this in .deployment, but that didn't work.
  :: HELP! Why isn't this working???
  echo %WEBSITE_NODE_DEFAULT_VERSION% before set
  :: Output: "4.4.7 before set"
  SET WEBSITE_NODE_DEFAULT_VERSION=6.7.0
  echo %WEBSITE_NODE_DEFAULT_VERSION% after set
  :: Output: "4.4.7 after set"
  pushd "%DEPLOYMENT_TARGET%"
  call :ExecuteCmd npm install
  IF !ERRORLEVEL! NEQ 0 goto error
  popd
)

echo :: 5. Bower Install (borrowing from 
IF EXIST "%DEPLOYMENT_TARGET%\bower.json" (
  pushd "%DEPLOYMENT_TARGET%"
  call :ExecuteCmd bower install
  IF !ERRORLEVEL! NEQ 0 goto error
  popd
)

echo :: 6. Run Gulp (borrowed from https://blogs.msdn.microsoft.com/azureossds/2016/08/12/run-npm-bower-composer-gulp-grunt-in-azure-app-services-during-deployment/)
IF EXIST "%DEPLOYMENT_TARGET%\gulpfile.js" (
  pushd "%DEPLOYMENT_TARGET%"
  call :ExecuteCmd gulp
  IF !ERRORLEVEL! NEQ 0 goto error
  popd
)

事实证明,当我创建 Azure Web 应用程序时,它在门户中预先设置了 WEBSITE_NODE_DEFAULT_VERSION (portal.azure.com)。所以 UI 取代了我设置应用程序设置的程序化请求。

在门户中删除该应用程序设置后(下面是删除设置后的屏幕截图),我尝试通过仅在 .deployment 文件中设置环境变量来再次部署...成功!

.部署

[config]
;Change node version to change npm version to avoid long-file-name situations https://blogs.msdn.microsoft.com/azureossds/2016/04/20/nodejs-and-npm-versions-on-azure-app-services/
;Make sure to delete the value in portal.azure.com > Application settings > App settings... because that will override this
WEBSITE_NODE_DEFAULT_VERSION = 6.7.0
command = deploy.cmd

原因来自CMD.EXE文档。

Delayed environment variable expansion is NOT enabled by default.

/V:ON Enable delayed environment variable expansion using ! as the delimiter. For example, /V:ON would allow !var! to expand the variable var at execution time. The var syntax expands variables at input time, which is quite a different thing when inside of a FOR loop.

因为 WEBSITE_NODE_DEFAULT_VERSION 已经设置,所以在执行 echo 语句时不会重新解释它。将其添加到顶部 SETLOCAL ENABLEDELAYEDEXPANSION 然后尝试 echo !WEBSITE_NODE_DEFAULT_VERSION! after set