首页 文章

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

提问于
浏览
1

摘要

我正在尝试将一个MVC5 Web应用程序部署到Azure . 我需要以编程方式设置WEBSITE_NODE_DEFAULT_VERSION以确保所有配置都原子地包含在repo中 . 当我尝试在 .deploymentdeploy.cmd 中设置该app setting / env变量时,它会被部署忽略 . 为什么?

背景

我的Web应用程序使用bower作为客户端库,以及一个简单的gulp脚本,用于将最小化的lib放在目标文件夹中 . 我的cshtml文件然后从所述目标文件夹中使用它们 .

根据this comment,我从Azure中删除了部署脚本( .deploymentdeploy.cmd ),并将其调整为安装bower .

然后下载自定义部署脚本 . 如果你去https://.scm.azurewebsites.net然后点击工具 - >下载自定义部署脚本或者只是从D:\ home \ deployment \ tools下载它

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

  • npm install(需要使gulp可用)

  • bower install(下拉客户端库)

  • gulp(管道客户端库)

Per this question,我面临的问题是使用的节点(因此是npm)是旧版本 . npm install 命令导致文件名太长,这是旧版npm中的已知问题 .

this set of Kudu runtime settings,我正在尝试将 WEBSITE_NODE_DEFAULT_VERSION 设置为 6.7.0 (此问题时的最新版本),因为这样可确保最新的npm也运行 .

Here's where my problem occurs.deploy.cmd 中,在运行 npm install 之前,我添加一行 set WEBSITE_NODE_DEFAULT_VERSION = 6.7.0 (我尝试过变体,包括带引号,等号周围没有空格,有 setlocal 等)I echo %WEBSITE_NODE_DEFAULT_VERSION% 在设置变量的任一侧 . 之前和之后的输出始终为 4.4.7 .

我也在_1380728中尝试过,但无济于事 . 我甚至尝试改变位置(有时在 command = deploy.cmd 之前,有时在之后) .

从我可以解读的网上,我上面的至少一种方法应该有效... Why can't I set this app setting / env variable in the deployment script?

更新

根据this question,我可以_1380732解释为什么SET不在deploy.cmd文件中工作 .

档案

.deployment

[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 https://stackoverflow.com/questions/39480274/how-do-i-run-gulp-js-in-my-asp-net-core-project-when-deploying-to-azure-using-gi)
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 https://stackoverflow.com/a/28591913/1876622)
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
)

2 回答

  • 0

    事实证明,当我创建Azure Web应用程序时,它会在门户网站(portal.azure.com)中预先设置WEBSITE_NODE_DEFAULT_VERSION . 因此,UI正在取代我设置应用程序设置的程序化请求 .

    在门户中删除该应用程序设置后(下面是删除设置后的屏幕截图),我尝试通过仅在.deployment文件中设置env var再次进行部署... success!

    enter image description here

    .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
    
  • 1

    原因来自CMD.EXE文档 .

    默认情况下,未启用延迟环境变量扩展 . / V:ON使用!启用延迟环境变量扩展!作为分隔符 . 例如,/ V:ON将允许!var!在执行时扩展变量var . var语法在输入时扩展变量,这在FOR循环中是完全不同的 .

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

相关问题