【问题标题】:Programatically set app setting / env variable during Azure (Kudu) deployment在 Azure (Kudu) 部署期间以编程方式设置应用程序设置/环境变量
【发布时间】:2016-10-12 20:03:05
【问题描述】:

总结

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

背景

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

根据 this comment,我已经从 Azure 中删除了部署脚本(.deploymentdeploy.cmd)并对其进行了调整以安装 bower。

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

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

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

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

根据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 之前,有时在之后)。

从我可以从网上破译的内容来看,我上面的方法中至少有一个应该可以工作... 为什么我不能在部署脚本中设置这个应用程序设置/环境变量?

更新

根据this question,我无法在 .deployment 文件中设置应用程序设置。这与网上其他文章有所不同,但仍然没有解释为什么 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
)

【问题讨论】:

    标签: azure npm asp.net-mvc-5 gulp bower


    【解决方案1】:

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

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

    .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
    

    【讨论】:

      【解决方案2】:

      原因来自CMD.EXE文档。

      默认情况下不启用延迟环境变量扩展。

      /V:ON 使用 ! 启用延迟的环境变量扩展作为 分隔符。例如,/V:ON 将允许 !var!扩大 变量 var 在执行时。 var 语法扩展变量 在输入时,这在 FOR 内部时完全不同 循环。

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

      【讨论】:

        猜你喜欢
        • 2012-09-14
        • 2012-10-16
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        相关资源
        最近更新 更多