我正在尝试在托管前部署脚本中运行npm构建。
如果我要从命令行运行构建,则可以成功运行:
set NUXT_ENV_GCLOUD_PROJECT=whatever&&npm run build
那很好。但是,当我在以下firebase.json
文件中尝试相同操作时,它只是跳过了构建过程:
{
"hosting": {
"predeploy": ["set NUXT_ENV_GCLOUD_PROJECT=whatever&& npm run build"],
}
}
> firebase deploy --only hosting
=== Deploying to 'xxx'...
i deploying hosting
Running command: set NUXT_ENV_GCLOUD_PROJECT=whatever&& npm run build
+ hosting: Finished running predeploy script.
i hosting[dev-phojo-app]: beginning deploy...
i hosting[dev-phojo-app]: found 41 files in ./dist
它说,它已完成运行预部署脚本,但实际上从未如此。如果我删除了环境变量的设置,那么它将按预期工作(但是,由于环境变量不存在,所以构建失败了。)
这是怎么回事?
答案 0 :(得分:1)
建议不要将这些表达式放在firebase.json中,而应将它们放在单独的脚本文件中,然后从predeploy挂钩中调用该脚本。所以,像这样:
predeploy.sh:
#!/bin/bash
export NUXT_ENV_GCLOUD_PROJECT=whatever
npm run build
firebase.json:
"hosting": {
"predeploy": [ "./predeploy.sh" ],
}
确保predeploy.sh是可执行的:chmod a+x predeploy.sh
我怀疑Firebase CLI只想“执行”您给出的命令,并且它不能包含诸如&&
之类的shell表达式。
答案 1 :(得分:0)
我在Windows中工作,因此细节有些不同,但是实际上,这是可行的。我制作了一个build.bat文件,在那里我可以设置环境变量,然后由npm构建脚本使用。
对于任何想效仿的人,这就是我的最终结论:
firebase.json
"hosting": {
"predeploy": [ ".\\build.bat" ]
}
build.bat
echo off
2>NUL CALL :CASE_%GCLOUD_PROJECT% # jump to :CASE_x, :CASE_y, etc.
IF ERRORLEVEL 1 CALL :DEFAULT_CASE # If label doesn't exist
rmdir /s /q dist
npm run generate
EXIT /B
:CASE_dev-myapp-app
echo Building for hosted development, %GCLOUD_PROJECT%
set NUXT_ENV_GCLOUD_ENV=development
set NUXT_ENV_GCLOUD_HOSTED=true
GOTO END_CASE
:CASE_prod-myapp-app
echo ============= PRODUCTION BUILD FOR %GCLOUD_PROJECT% ===================
set NUXT_ENV_GCLOUD_ENV=development
set NUXT_ENV_GCLOUD_HOSTED=true
GOTO END_CASE
:DEFAULT_CASE
ECHO Unknown Google Cloud project "%GCLOUD_PROJECT%"
exit 666
:END_CASE
VER > NUL # reset ERRORLEVEL
GOTO :EOF # return from CALL
如果未设置传入的GCLOUD_PROJECT变量,则该操作将失败。如果将其设置为无法识别的项目,它将失败。如果npm命令失败,它将失败。