将环境变量传递给Firebase预部署脚本会自动失败

时间:2020-02-09 08:06:07

标签: firebase firebase-hosting firebase-cli

我正在尝试在托管前部署脚本中运行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

,它已完成运行预部署脚本,但实际上从未如此。如果我删除了环境变量的设置,那么它将按预期工作(但是,由于环境变量不存在,所以构建失败了。)

这是怎么回事?

2 个答案:

答案 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命令失败,它将失败。

相关问题