Batch file Azure功能/Azure网站自定义部署脚本提前结束
我已经为Azure函数定制了一个批部署脚本,它将提前结束而不会出错。我希望有人能帮我理解发生了什么事 问题部分出现在脚本的“预部署”部分:Batch file Azure功能/Azure网站自定义部署脚本提前结束,batch-file,azure-web-app-service,continuous-deployment,azure-functions,Batch File,Azure Web App Service,Continuous Deployment,Azure Functions,我已经为Azure函数定制了一个批部署脚本,它将提前结束而不会出错。我希望有人能帮我理解发生了什么事 问题部分出现在脚本的“预部署”部分: for /F %%f in ('git.exe diff --name-only %PREVIOUS_SCM_COMMIT_ID% %SCM_COMMIT_ID% ^| grep package.json') do ( SET PACKAGEJSON=%%~f SET PKGFOLDER=!DEPLOYMENT_SOURCE!\!PACKAG
for /F %%f in ('git.exe diff --name-only %PREVIOUS_SCM_COMMIT_ID% %SCM_COMMIT_ID% ^| grep package.json') do (
SET PACKAGEJSON=%%~f
SET PKGFOLDER=!DEPLOYMENT_SOURCE!\!PACKAGEJSON:package.json=!
echo "NPM Install: !PKGFOLDER!package.json"
pushd "!PKGFOLDER!"
npm install --production --progress=false --cache-min=432000
npm install --save json-loader --progress=false --cache-min=432000
IF !ERRORLEVEL! NEQ 0 goto error
popd
)
如果在最后两次提交之间未修改package.json,脚本将按预期跳过此部分,并继续执行“部署”部分
如果一个package.json被修改,那么代码在开始时会按照预期工作,并运行npm安装。但是,之后,它将以无错误的方式结束,并且不会继续到部署部分。在最后一次npm安装运行后,脚本没有其他输出
有谁能帮我理解出了什么问题吗?在我看来这是正确的
完整脚本如下所示,它是以下项目的一部分:
问题的根源在于
npm
是一个批处理文件。当一个批处理文件(您的批处理文件)调用另一个批处理文件时,执行流被传输到被调用的批处理文件,并且一旦它结束工作,执行流就不会返回到调用方
如果使用call
命令完成调用,则此行为会发生变化
call npm ....
执行控制被传输到被调用的批处理文件,最后执行流返回给调用方
注意:暴露的行为是未暴露过程的简化。批处理文件在内存“上下文”中执行。在没有call
命令的情况下,被调用的批处理文件将用call
命令替换调用者的“上下文”,创建一个新的“上下文”
这就留下了另一个问题:如果批处理npm
批处理文件传输执行流的调用没有返回,为什么要执行第二个npm
命令
在执行批处理文件(或命令行)时,代码块(括在括号中的代码)被加载到内存中并作为一个整体进行解析。您的for
命令被放置在内存中,其do
子句中包含的所有命令将继续运行,直到循环结束
注意:在这种情况下不相关,但一旦调用了第一个
npm
(无调用
),并且调用方批处理“context”被丢弃(由调用的context替换),则执行for
循环中的其余命令(它们仍在内存中)在命令行上下文中,而不是在批处理上下文中,由于“上下文”被丢弃,因此setlocal
被还原,变量更改、directoy更改和延迟扩展被丢弃。问题的根源在于npm
是批处理文件。当一个批处理文件(您的批处理文件)调用另一个批处理文件时,执行流被传输到被调用的批处理文件,并且一旦它结束工作,执行流就不会返回到调用方
如果使用call
命令完成调用,则此行为会发生变化
call npm ....
执行控制被传输到被调用的批处理文件,最后执行流返回给调用方
注意:暴露的行为是未暴露过程的简化。批处理文件在内存“上下文”中执行。在没有call
命令的情况下,被调用的批处理文件将用call
命令替换调用者的“上下文”,创建一个新的“上下文”
这就留下了另一个问题:如果批处理npm
批处理文件传输执行流的调用没有返回,为什么要执行第二个npm
命令
在执行批处理文件(或命令行)时,代码块(括在括号中的代码)被加载到内存中并作为一个整体进行解析。您的for
命令被放置在内存中,其do
子句中包含的所有命令将继续运行,直到循环结束
注意:在这种情况下不相关,但一旦调用了第一个
npm
(无调用
),并且调用方批处理“context”被丢弃(由调用的context替换),则执行for
循环中的其余命令(它们仍在内存中)在命令行上下文中,而不是在批处理上下文中,由于“上下文”被丢弃,因此setlocal
被还原,变量更改、directoy更改和延迟扩展被丢弃。结束需要多长时间?总是一样吗?另外,你的应用程序是处于消费模式还是应用程序服务计划模式?消费模式,而且速度非常快。运行NPM命令大约需要60-90秒。它并不总是相同的精确时间段。我还将SCM\u命令\u空闲\u超时时间增加到900秒。不确定发生了什么。需要检查的一件事是Kudu w3wp是否以某种方式崩溃。您可以在前后查看Kudu process manager以查看PID是否发生变化(对于scm)。您是否可以测试将npm安装…
更改为call npm install…
是否会产生影响?因为npm是一个批处理文件。如果不调用它,它将停止批处理上下文。但是缓存的代码块仍然可以执行它需要多长时间才能结束?总是一样吗?另外,你的应用程序是处于消费模式还是应用程序服务计划模式?消费模式,而且速度非常快。运行NPM命令大约需要60-90秒。它并不总是相同的精确时间段。我还将SCM\u命令\u空闲\u超时时间增加到900秒。不确定发生了什么。需要检查的一件事是Kudu w3wp是否以某种方式崩溃。您可以在前后查看Kudu process manager以查看PID是否发生变化(对于scm)。您是否可以测试将npm安装…
更改为call npm install…
是否会产生影响?因为npm是一个批处理文件。