Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file Azure功能/Azure网站自定义部署脚本提前结束_Batch File_Azure Web App Service_Continuous Deployment_Azure Functions - Fatal编程技术网

Batch file 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

我已经为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!\!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是一个批处理文件。