摘要
我正在尝试将一个MVC5 Web应用程序部署到Azure . 我需要以编程方式设置WEBSITE_NODE_DEFAULT_VERSION以确保所有配置都原子地包含在repo中 . 当我尝试在 .deployment
或 deploy.cmd
中设置该app setting / env变量时,它会被部署忽略 . 为什么?
背景
我的Web应用程序使用bower作为客户端库,以及一个简单的gulp脚本,用于将最小化的lib放在目标文件夹中 . 我的cshtml文件然后从所述目标文件夹中使用它们 .
根据this comment,我从Azure中删除了部署脚本( .deployment
和 deploy.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 回答
事实证明,当我创建Azure Web应用程序时,它会在门户网站(portal.azure.com)中预先设置WEBSITE_NODE_DEFAULT_VERSION . 因此,UI正在取代我设置应用程序设置的程序化请求 .
在门户中删除该应用程序设置后(下面是删除设置后的屏幕截图),我尝试通过仅在.deployment文件中设置env var再次进行部署... success!
.deployment
原因来自CMD.EXE文档 .
因为
WEBSITE_NODE_DEFAULT_VERSION
已经设置,所以在执行echo语句时它不会重新表示它 . 将其添加到顶部SETLOCAL ENABLEDELAYEDEXPANSION
然后尝试echo !WEBSITE_NODE_DEFAULT_VERSION! after set
.