Say I have the following four functions in my Firebase projects:
openDoor(europe-west1)
closeDoor(europe-west1)
openWindow(europe-west1)
closeWindow(europe-west1)
Now, these functions live in two separate Node packages, i.e. one that contains openDoor
and closeDoor
and another one that contains openWindow
and closeWindow
.
Error
If I try to run firebase deploy
from the package with the door functions, the following error will be thrown (in non-interactive mode):
Error: The following functions are found in your project but do not exist in your local source code:
openWindow(europe-west1)
closeWindow(europe-west1)
This is a problem because it will cancel any CD workflow that tries to deploy these functions.
Force delete
There is an option to force-delete any existing functions:
-f, --force delete Cloud Functions missing from the current
working directory without confirmation
However, I want the opposite. I want to keep all existing functions.
Theoretical workaround
There is one workaround that I found would work in theory, which is:
yes N | firebase deploy --interactive
Piping N
into the interactive deploy command, which will answer N
to the deletion prompt:
The following functions are found in your project but do not exist in your local source code:
openWindow(europe-west1)
closeWindow(europe-west1)
If you are renaming a function or changing its region, it is recommended that you create the new function first before deleting the old one to prevent event loss. For more info, visit https://firebase.google.com/docs/functions/manage-functions#modify
? Would you like to proceed with deletion? Selecting no will continue the rest of the deployments. (y/N)
The problem now is that I am using https://github.com/w9jds/firebase-action to deploy the functions, which means that I need to have a built-in Firebase solution.
2
Answers
You can make use of the new codebases feature in Firebase.
By specifying a
codebase
in yourfirebase.json
functions
configuration, this problem is solved. The Firebase CLI will no longer prompt you to delete other functions as it only considers the functions of the samecodebase
.If your
firebase.json
previously looked like this:You only need to add
"codebase": "<name>"
to the config:The deploy will now look like this:
Note that the actual function name does not change, i.e. the function will still only be called
openWindow
(without the prefix) in the Firebase / Google Cloud Console. So this is basically the perfect solution to the problem.Alternatively, you can also specify the function names when performing deployment.