在 Azure (Kudu) 部署期间以编程方式设置应用程序设置/环境变量
Programatically set app setting / env variable during Azure (Kudu) deployment
总结
我正在尝试将 MVC5 Web 应用程序部署到 Azure。我需要以编程方式设置 WEBSITE_NODE_DEFAULT_VERSION 以确保所有配置都自动包含在回购协议中。当我尝试在 .deployment
或 deploy.cmd
中设置该应用程序设置/环境变量时,它会被部署忽略。为什么?
背景
我的网络应用程序使用 Bower 作为客户端库,并使用一个简单的 gulp 脚本将最小化的库放在目标文件夹中。我的 cshtml 文件然后从所述目标文件夹中使用它们。
根据 ,我已经从 Azure 下载部署脚本(.deployment
和 deploy.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 个自定义命令:
- npm install(需要 gulp 可用)
- bower 安装(下拉客户端库)
- 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
。
总结
我正在尝试将 MVC5 Web 应用程序部署到 Azure。我需要以编程方式设置 WEBSITE_NODE_DEFAULT_VERSION 以确保所有配置都自动包含在回购协议中。当我尝试在 .deployment
或 deploy.cmd
中设置该应用程序设置/环境变量时,它会被部署忽略。为什么?
背景
我的网络应用程序使用 Bower 作为客户端库,并使用一个简单的 gulp 脚本将最小化的库放在目标文件夹中。我的 cshtml 文件然后从所述目标文件夹中使用它们。
根据 .deployment
和 deploy.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 个自定义命令:
- npm install(需要 gulp 可用)
- bower 安装(下拉客户端库)
- gulp(流水线客户端库)
根据 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
之前,有时在之后)。
根据我可以从网上破译的信息,我上面的方法中至少 一个 应该有效... 为什么我不能设置这个应用程序设置/ 部署脚本中的环境变量?
更新
根据
文件
.部署
[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
。