将环境变量传递给 Firebase 预部署脚本会静默失败
Pass environment variables to Firebase predeploy scripts fails silently
我正在尝试 运行 在托管预部署脚本期间构建 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
它说它完成了运行预部署脚本,但实际上从未完成。如果我删除环境变量的设置,那么它会按预期工作(但是,当然,构建失败,因为环境变量不存在..)
这是怎么回事?
我建议不要在 firebase.json 中使用 shell 表达式,而是将这些表达式放入单独的脚本文件中,然后从预部署挂钩调用该脚本。所以,像这样:
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 只是想 "exec" 你给出的命令,它不能包含 shell 表达式,例如 &&
.
我在 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 命令失败,它将失败。
我正在尝试 运行 在托管预部署脚本期间构建 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
它说它完成了运行预部署脚本,但实际上从未完成。如果我删除环境变量的设置,那么它会按预期工作(但是,当然,构建失败,因为环境变量不存在..)
这是怎么回事?
我建议不要在 firebase.json 中使用 shell 表达式,而是将这些表达式放入单独的脚本文件中,然后从预部署挂钩调用该脚本。所以,像这样:
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 只是想 "exec" 你给出的命令,它不能包含 shell 表达式,例如 &&
.
我在 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 命令失败,它将失败。