firebase-tools icon indicating copy to clipboard operation
firebase-tools copied to clipboard

Can't use arbitrary value as Vite mode to build non-production code

Open yegorius opened this issue 1 year ago • 3 comments

Environment info

firebase-tools: 13.16.0

Platform: Linux

Test case

Any Vite based project which uses modes.

Steps to reproduce

We disable AppCheck in local dev environments. We only enable it in prod or staging environments.

if (!dev) initializeAppCheck();

We also store FB configs in .env files for prod and staging FB projects (.env.production and .env.development). Building production code is fine, firebase deploy calls vite build --mode production by default. But how do we build staging code? I checked the code of firebase-tools and it seems we can use FIREBASE_FRAMEWORKS_BUILD_TARGET to override build target, so let's set it to development. Now comes the problem: when FIREBASE_FRAMEWORKS_BUILD_TARGET is set to development it also causes NODE_ENV to be development which, in its own turn, causes dev from $app/environment to be true (SvelteKit uses benmccann/esm-env). So now we have code built for staging env with dev set to true. OK, let's try setting FIREBASE_FRAMEWORKS_BUILD_TARGET to staging. Unfortunately it's not possible because this variable only supports two values production and development and firebase deploy bails out if anything else is supplied. Eventually, we might find a workaround by once again monkey-patching src/frameworks/vite/index.ts but the problem is wider. What if someone has multiple Vite modes like: production-us, production-eu, staging-us and staging-eu? How do we pass arbitrary values to vite build --mode? Or what if someone has additional build step after the code is built but before it's deployed? The problem here is that firebase deploy not only deploys, but also builds the code. It tries to do this auto-magically. And while doing so it takes away some freedom from the developers. After many rounds of discussions and patches, It might, eventually, get it right, but this is going to be another layer of abstraction to deal with. My proposal is simple: don't build the code in firebase deploy. Let developers build the code correctly and just deploy it. It's a win-win situation: firebase-tools devs have less work to do, and fb-tools users have less things to figure out. As in Unix philosophy:

Make each program do one thing well. To do a new job, build afresh rather than complicate old programs by adding new "features".

Expected behavior

dev is false

Actual behavior

dev is true

yegorius avatar Sep 08 '24 21:09 yegorius

Same here. +1

plungarini avatar Oct 11 '24 21:10 plungarini

Hey @yegorius, thanks for reporting your issue. In this case you should be able to use a parameterized configuration to achieve your goal. Please take a look at this comment: https://github.com/firebase/firebase-tools/issues/7207#issuecomment-2168321754 which is related to a similar issue.

In this case you should modify your .env files to be named with the related project ids.

Let me know if that solves your main issue.

leoortizz avatar May 16 '25 20:05 leoortizz

We have moved this service to Cloud Run, but looking at the documentation, parametrized configuration could have solved this for us, although I would still prefer to be able to pass Vite mode or firebase deploy not to build the project.

yegorius avatar May 22 '25 20:05 yegorius