Firebase-tools: рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП JSON рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ:рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди:рд╕реЗрдЯ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдЬреБрд▓ре░ 2017  ┬╖  37рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: firebase/firebase-tools

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, firebase functions:config:get рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ JSON рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдлрд╝рдВрдХреНрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди firebase functions:config:set рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрдирд▓рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрдкрдпреЛрдЧреА рдмрдирд╛рддрд╛ рд╣реИ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгред

рдЖрджрд░реНрд╢ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

firebase functions:config:get > config.json
firebase functions:config:set -f config.json

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рджред @laurenzlong
рдореИрдВ рдПрдХ рдлрд╛рдЗрд▓ рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХрдорд╛рдВрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

firebase functions:config:set service_account="$(cat service-account.json)"

рдореИрдВрдиреЗ рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдЬреЗрд╕рди рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХреА, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдПрдбрдорд┐рди рдПрд╕рдбреАрдХреЗ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдмрдВрдзрди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рд╕рднреА 37 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ @jpreynat рд╕реЗ рд╕рд╣рдордд рдбрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рд╣рдо рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рддреИрдирд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ config var рд╕реЗрдЯ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред config.json рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ config:set рдХреЛ рдмрд╛рдВрдзрдирд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреАред
рдХреНрдпрд╛ рдЕрднреА рдХреЛрдИ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИрдВ, рд╢рд╛рдпрдж рдХреЙрдиреНрдлрд┐рдЧ рдореЗрдВ рдкрд╛рдЗрдкрд┐рдВрдЧ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ firebase functions:config:clone рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛?

рдХреБрдЫ рд╕рдВрджрд░реНрдн рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЬрд╛рдирдмреВрдЭрдХрд░ рдлрд╝рд╛рдЗрд▓-рдЖрдзрд╛рд░рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рджреВрд░ рд╣реЛ рдЧрдП рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЦрд░рд╛рдм рдкреНрд░рдерд╛рдУрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рддреН, рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рд░рд╣рд╕реНрдпреЛрдВ рд╕реЗ рднрд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд░рдЦрдирд╛, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд╕реНрд░реЛрдд рднрдВрдбрд╛рд░ рдореЗрдВ рднреА рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред

"рдЖрд╡рд╢реНрдпрдХ" рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд┐рд╕реА рддрд░рд╣ (рдпрд╛рдВрддреНрд░рд┐рдХреА рдЯреАрдмреАрдбреА) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪреЗрдВрдЧреЗ - рдФрд░ рдпрджрд┐ рдЖрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рдПрдЧреАред рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдЖрдкрдХреА рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдЖрдкрдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдХреНрдпреЛрдВ рд╣реИ?

@mbleeigh рдпрд╣реА рд╡рд╣реА рд╣реИ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЕрдЫрд╛ рд╕реБрдЭрд╛рд╡!
рд╕рдВрднрд╡рддрдГ рдПрдХ рджрд┐рдпрд╛ рдЧрдпрд╛/рдЖрдкрдХрд╛ рдорддрд▓рдм 'рдореИрдХреЗрдирд┐рдХреНрд╕ рдЯреАрдмреАрдбреА' рд╕реЗ рд╣реИ, рд▓реЗрдХрд┐рди: рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ/рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛, рддрд╛рдХрд┐ рдпрд╣ рдЕрдиреНрдп рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреА рддрд░рд╣ git/PR рд╕рдореАрдХреНрд╖рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЧреБрдЬрд╝рд░реЗред
@jpreynat рдЕрдкрд╣рд░рдг рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ

@laurenzlong рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╣рдорд╛рд░реА рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рд╣рдорд╛рд░реЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЪрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рд╣реИред
рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐ рдкрд░реНрдпрд╛рд╡рд░рдг (рджреЗрд╡, рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рдФрд░ рдкреНрд░реЛрдб) рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдФрд░ рдХреНрд░рдорд╢рдГ рдлрд╛рдпрд░рдмреЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд░реЗрдВ (рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП, рдорд╛рд╕реНрдЯрд░ рдФрд░ рдЯреИрдЧ рдкрд░ рдкреБрд╢ рдХрд░реЗрдВ)ред

@mbleeigh рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрди рд╕рднреА envs рдХреЛ рдХреЙрдиреНрдлрд┐рдЧ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рд░рд▓рддрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП JSON рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ functions:config:set рдХрдорд╛рдВрдб рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА/рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВред
рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдБ рдХрд┐ рдпрд╣ JSON рдлрд╝рд╛рдЗрд▓ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред
рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдХреЛрдИ рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИ?

@ahaverty рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ, рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдпрд╣рд╛рдВ рдмрд╣рд╕ рд╣реЛ рд╕рдХрддреА рд╣реИред

@jpreynat рдЬрдм рдЖрдк functions:config:set рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП firebase use рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реНрдерд╛рдпреА рд░рд╣реЗрдЧрд╛ред рддреЛ рдЖрдк рдкреНрд░рддрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХ рдмрд╛рд░ set рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рд░рд╣реЗрдЧрд╛ред рдпрд╣ "рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди" рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд╣реАрдВ рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ?

@jpreynat рдореИрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдорд╛рдЗрдХрд▓ рдФрд░ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред

@laurenzlong @mbleigh рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдЬрд▓реНрджреА рд╕реЗ рдЙрддреНрддрд░ рдирд╣реАрдВ рджрд┐рдпрд╛ред
рд╣рдореЗрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдВрджрд░реНрдн рджрд┐рдП рдЧрдП рд╣реИрдВ:

рд╣рдо рдЯреНрд░реИрд╡рд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдРрдк рдХреЛ рддреИрдирд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рд╕реАрдЖрдИ рдпрд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛)ред рдЪреВрдВрдХрд┐ рд╣рдо рд╢рд╛рдЦрд╛ рдФрд░ рдЯреИрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рдРрдк рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдореЗрдВ рддреИрдирд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЕрд▓рдЧ JSON рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рд╢рд░реНрдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╛ рддреЛ firebase config:set -f staging.json рдпрд╛ firebase config:set -f prod.json рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд╣рдорд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдиреЛрдб рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ firebase рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдЕрдкрдиреЗ JSON рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИред

рдЕрд░реЗ @jpreynat рдореИрдВ рдЕрднреА рднреА рдЖрдкрдХреЗ рдЙрддреНрддрд░ рд╕реЗ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рд╣реВрдБред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдПрдХ рдмрд╛рд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╡рд╣рд╛рдВ рд░рд╣рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рддреИрдирд╛рддреА рдХреЗ рджреМрд░рд╛рди рднреА, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдлрд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛рдХрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рдиреЛрдВ рдХреЛ рдЕрдирд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ

рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИ? %) @jpreynat @mbleeigh рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдЧрд╛рдпрдм рд╣реИред рдПрдЯреАрдПрдо рдореЗрд░реЗ рдкрд╛рд╕ рд▓рдЧрднрдЧ 15 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд░ (рдФрд░ рдЕрдзрд┐рдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ) рд╣реИрдВ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдпрджрд┐ functions:config:set рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ JSON рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

"рдЖрд╡рд╢реНрдпрдХ" рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдкрд░ @mbleeigh рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╣рдорд╕реЗ рдмрдбрд╝рд╛ рд╡реЛрдЯ - рдФрд░ рдпрджрд┐ рдЖрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рдПрдЧреАред
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рднреА рдПрдХ рджрд░реНрдж рдмрд┐рдВрджреБ рдмрдирдирд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рднреА рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг/рд╕рдореАрдХреНрд╖рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рдлрд┐рдЯ рд╣реЛрдЧрд╛

https://medium.com/@AllanHasegawa/setting -config-for-firebase-cloud-functions-with-json-136f455e7c69

рдЕрд░реЗ @yaronyosef рдЖрдк рд╕реАрдзреЗ : config : рд╕реЗрдЯ рдХрдорд╛рдВрдб, рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

firebase functions:config:set foo='{"bar":"something","faz":"other"}'

рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рджред @laurenzlong
рдореИрдВ рдПрдХ рдлрд╛рдЗрд▓ рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХрдорд╛рдВрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

firebase functions:config:set service_account="$(cat service-account.json)"

рдореИрдВрдиреЗ рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдЬреЗрд╕рди рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХреА, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдПрдбрдорд┐рди рдПрд╕рдбреАрдХреЗ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдмрдВрдзрди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдХреВрд▓ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛! рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╣рдо рдЧрд┐рдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреИрд░-рдЧреБрдкреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рднреА рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдкреНрд░рддрд┐рдмрджреНрдз JSON рд░рдирдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ (рдПрдХрд╛рдзрд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП) рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╣реЛрдВрдЧреА рдФрд░ рд╕реАрдЖрдИ рдкрд░реНрдпрд╛рд╡рд░рдг рддрдм рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рд╛рдЗрд▓ рд╕реЗ functions:config:set рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ (рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡реЗрд╢ рдПрдХ рдЕрд▓рдЧ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ)ред

рдпрджрд┐ рдЖрдк рдЧрд┐рдЯ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реИред рдмрд╕ рдЙрдиреНрд╣реЗрдВ configs/<project_id>.json рдФрд░ рдлрд┐рд░:

let config = {};
try {
  config = require(`./configs/${process.env.GCLOUD_PROJECT}.json`);
} catch (e) {
  console.log('No config found for project', process.env.GCLOUD_PROJECT);
}

рдлрд╛рдпрд░рдмреЗрд╕ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд░рдирдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрд┐рдЯ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪреЗрдХ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░рд╣рд╕реНрдпреЛрдВ рдХреЗ рд╕рд╛рде) рд╣рдордиреЗ рдЗрд╕реЗ рдПрдХ рдкреИрдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдпрд╛ рд╣реИ рдЬреЛ рд╣рд▓ рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рддрдм рд╣рдо рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд┐рдЧ рдПрдкреАрдЖрдИ рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреЙрдиреНрдлрд┐рдЧ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдбреЙрдХреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ) рдФрд░ рд╕реНрд░реЛрдд-рдирд┐рдпрдВрддреНрд░рд┐рдд рдФрд░ рдЯреНрд░реИрдХ рди рдХрд┐рдП рдЧрдП рджреЛрдиреЛрдВ рдорд╛рдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдЯреАрдХ рддрд░реАрдХреЗ рд╕реЗ рд▓реЛрдб рдХрд░реЗрдВ (рдпрд╛рдиреА config() рдорд╛рдзреНрдпрдо рд╕реЗ) firebase-functions рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛)ред

рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рдВрдкреВрд░реНрдг .runtimeconfig рд╕реЗ functions:config:set рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ-рд▓рд╛рдЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

firebase functions:config:set $(jq -r 'to_entries[] | [.key, (.value | tojson)] | join("=")' < .runtimeconfig/${FIREBASE_ENV}.json)

рдЬрд╣рд╛рдВ FIREBASE_ENV рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдкрд░рд┐рд╡реЗрд╢ рдХрд╛ рдирд╛рдо рд╣реИ (рдЙрджрд╛. dev )ред рдЗрд╕реЗ рдФрд░ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ

firebase functions:config:set -f .runtimeconfig/${FIREBASE_ENV}.json

рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХреЙрдиреНрдлрд┐рдЧ рдПрдкреАрдЖрдИ рдиреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рдСрдбрд┐рдЯ рдЯреНрд░реЗрд▓реНрд╕ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рд╣реИ (рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕рд╣реА рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ)ред

рддреЛ рдпрд╣ рдХреИрд╕реЗ рд╕рд╛рде рдЖ рд░рд╣рд╛ рд╣реИ? рдореИрдВ

@mbleeigh рд╕реБрдЭрд╛рд╡ рдХреЛ рдЕрднреА рднреА рд▓рд╛рдЧреВ рд╣реЛрддреЗ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ! рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЧреИрд░-рджреЗрд╡ рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд░рдирд╛ рднреВрд▓рдиреЗ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖ рд░рд╣реА рд╣реИрдВ

рдереНрд░реЗрдб рдмрдВрдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреА рдпреЛрдЬрдирд╛ рдмреИрдардХреЛрдВ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдКрдВрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рдкрд░ рдХреБрдЫ рдкреНрд░рдЧрддрд┐ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JSON рд╕реНрдХреАрдорд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рднреА рдорд╛рди рд╣реИрдВред рдпрд╣ рд╕рддреНрдпрд╛рдкрди рдореЗрд░реА рд╕реАрдЖрдИ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рддреЛ рддреИрдирд╛рддреА рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдпрджрд┐ рдореЗрд░реА рддрд░рд╣ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ JSON рд╕реНрдХреАрдорд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдХреАрдорд╛ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рди рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдмреВрд▓рд┐рдпрди рдХреЗ рд▓рд┐рдП рдпрд╣ рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдорд╛рдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ "true" рдФрд░ "false" рд╕рд╛рде рдПрдХ рдПрдирдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдореЗрд░реА рд╕рд░реНрдХрд┐рд▓рд╕реАрдЖрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдпрд╣ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВред

@hgwood рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реАрдЖрдИ рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВрдЧреЗред

рдмрд╕ рдЗрд╕ "рд╕рдорд╕реНрдпрд╛" рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдЪрд░реНрдЪрд╛ рдкрд░ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░:

  1. рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЧреБрдкреНрдд/рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░реЗрдкреЛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдЧреИрд░-рдЧреБрдкреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред рдЧреБрдкреНрдд рдорд╛рди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рдиреЛрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЙрди рдЧреБрдкреНрдд рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрджреНрднреБрдд рд╣реЛрдЧрд╛ред
  2. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдпрд╣ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рдиреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рдПрдХ PITA рд╣реИ, рдФрд░ рдПрдХ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рджреЗрдЦрдиреЗ/рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рдХрдо рдкрд░реЗрд╢рд╛рдиреА рд╡рд╛рд▓реА рд╣реЛ рдЬрд╛рддреА рд╣реИред
  3. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдм рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрдкрд╛рджрдХ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдПрдХ рд╕рд╛рде рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреЗрдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛ, рддрд╛рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХреЗрдВред
  4. рдореИрдВ рд╣рдореЗрд╢рд╛ рд╕реЗ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдХреЛ рдПрдХ рд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рднреАрддрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реИ, рддреЛ рдПрдХ рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рднреАрддрд░ рдХрдИ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдПрдХ рд╕рд╛рде рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
  5. рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╢рд╛рдпрдж рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдореЗрд░реЗ рдХреЛрдб рд╢рдмреНрджрд╢рдГ рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд╕рдВрдж рд╣реИред

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди

рдореИрдВ рдХреИрд╕реНрдХреЗрдбрд┐рдВрдЧ yaml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдФрд░ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкрд░рд┐рд╡реЗрд╢ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред

./config/default.yml

app:
  name: My App
featureFlags:
  someFeature:
    enabled: false

./config/dev.yml (рдЕрдиреНрдп рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ)

imports:
  - {resource: default.yml}
app:
  environmentName: Development
services:
  someOtherService:
    baseUrl: https://dev.someotherservice.com/api
featureFlags:
  someFeature:
    enabled: true

рдлрд┐рд░, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯреА рдиреЛрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА рд╣реИ рдЬреЛ рд╣рд▓ рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИ, рдФрд░ рдХреБрдВрдЬреА = рд╡реИрд▓ рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рд╕реНрдкреЗрд╕-рд╕реАрдорд╛рдВрдХрд┐рдд рд╕реВрдЪреА рд▓реМрдЯрд╛рддреА рд╣реИ

yaml_to_keyval.ts

import * as configYaml from "config-yaml"
import * as flat from "flat"


const yamlFile = process.argv[2]
const config = configYaml(yamlFile)
const flatConfig = flat(config)

const key_val_list = Object.keys(flatConfig).map(function(key){
    return `${key}=${flatConfig[key]}`
})

console.log(key_val_list.join(' '))

рд╕реАрдЖрдИ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рдХреБрдВрдЬреА = рд╡реИрд▓ рдЬреЛрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдмреИрд╢ рд╢реИрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ

# env is set to the desired deployment environment (eg "dev"), which is passed as an argument to the CI script command
config_in="$(readlink -f ./config/$env.yml)"
key_vals="$(ts-node ./scripts/node/yaml_to_keyval.ts $config_in)"
firebase functions:config:set $key_vals

@kanemotos рдореБрдЭреЗ рдЖрдкрдХрд╛ cat рд╕рдорд╛рдзрд╛рди рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЕрдкрдиреА рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп Precondition check failed рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛?

рд╣рдордиреЗ рдЗрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред

рд╣рдо рдбреАрдПрдо рдХреЗ рд▓рд┐рдП "рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдпрдорд▓" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рдбреАрдПрдо рдЙрдкрдпреБрдХреНрдд рд░рдирдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд┐рдЧ рдФрд░ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ firebase deploy рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ firebase config:set рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рддреИрдирд╛рддреА рд╕рдордп рдкрд░ рдЙрдирдХреЗ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рдЬреИрд╕реЗ рдмрд╛рд▓реНрдЯреА рдФрд░ рдЙрдирдХреЗ рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг) рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдЖрдкреВрд░реНрддрд┐ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд░рд╕реА рдореЗрдВ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрд╣ рд╣рдореЗрдВ camelCase рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдЪрд░ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЬрдм рд╣рдо рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдПрдХ рдорд╛рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рд╣рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ (рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб) тАЛтАЛтАЛтАЛрд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдХреБрдВрдЬреА рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреАрдПрдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдЙрд╕рдХреЗ рд▓рд┐рдП gcloud beta runtime-config configs variables set рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (DM рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рдмрд╛рдж рдФрд░ firebase deploy ) рдФрд░ firebase config:set , рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрд╡ KMS рд╕реЗ рд╕реНрдЯрдбрдЖрдЙрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдмрд╕ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ - рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдиреЗ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдП рдЬрд┐рд╕рд╕реЗ рдХреБрдЫ рднреНрд░рдо рдкреИрджрд╛ рд╣реЛ рдЧрдпрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рднреА рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

рдореВрд▓ рд░реВрдк рд╕реЗ, functions.config() _deployments_ рдХреЗ рдмреАрдЪ рдореЗрдВ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдпрд░рдмреЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрд▓рдЧ рд╕реЗ рднреА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рджреЗрд╡, рдордВрдЪрди рдФрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рд╕рдорд╛рди рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ (рдмрд╣реБ-рд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╛ рдПрдХ рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП... ) рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд░рдЦрддрд╛ рд╣реИред .

рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЙрдкрдирд╛рдо рд╕реЗрдЯ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ (рдпрд╛ рдХреЗрд╡рд▓ firebase use рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ) рддреЛ рдЖрдк рдПрдХ рд╣реА рд░реЗрдкреЛ рдХреЛ рдПрдХрд╛рдзрд┐рдХ, рдЕрд▓рдЧ рдлрд╛рдпрд░рдмреЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдпрд░рдмреЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ - рдЗрд╕ рддрд░рд╣ рдЖрдк рдПрдХ рджреЗрд╡ рд╡рд╛рддрд╛рд╡рд░рдг, рдордВрдЪрди рдФрд░ рдЙрддреНрдкрд╛рджрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдлрд┐рд░, рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдкрд░рд┐рд╡реЗрд╢ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
firebase -P dev config:set - рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЪрд░ рд╕реЗрдЯ рдХрд░реЗрдВ env
firebase -P prod config:set - рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рджрди рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рдЪрд░ рд╕реЗрдЯ рдХрд░реЗрдВ...

рдлрд┐рд░, рдЖрдк рдПрдХ рд╣реА рд░реЗрдкреЛ рдХреЛ рджреЛ рдмрд╛рд░ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
firebase deploy -P dev
firebase deploy -P prod
рдФрд░ рд╡реЗ рджреЛрдиреЛрдВ рдЕрдкрдиреЗ-рдЕрдкрдиреЗ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЙрдирдХрд╛ рдЕрдкрдирд╛, рдЕрд▓рдЧ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрдЧрд╛ рдЬреЛ рддреИрдирд╛рддреА рдХреЗ рдмреАрдЪ рдореЗрдВ рдмрдирд╛ рд░рд╣реЗрдЧрд╛ред

рд╣рд╛рдВ, рд╣рдо рднреА рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВред рджреЗрд╡/рдкрд░реАрдХреНрд╖рдг/рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВред

рдмрд╕ рдореЗрд░реЗ рд╡реЗрдирд┐рд▓рд╛ рдЬреЗрдПрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо (рд╡рд┐рдВрдбреЛрдЬ, рдореИрдХрдУрдПрд╕, рд▓рд┐рдирдХреНрд╕) рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рджреЗрд╡/рдкрд░реАрдХреНрд╖рдг/рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

/.рдлрд╛рдпрд░рдмреЗрд╕рд░

{
  "projects": {
    "dev": "my-project-name-dev",
    "test": "my-project-name-test",
    "prod": "my-project-name-prod"
  }
}

рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╝рд╛рдЗрд▓реЗрдВ

/functions/config рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ JSON-рдлрд╝рд╛рдЗрд▓реЗрдВ:

/functions/config/config.dev.json 
/functions/config/config.test.json 
/functions/config/config.prod.json 
/functions/config/config.SAMPLE.json <-- only file tracked in git

Example content:
{
    "google": {
        "key": "my-api-key",
        "storage_bucket": "firebase-storage-bucket"
    },
    "another_vendor": {
        "my_prop": "my value"
    },
    ...
}

/functions/set-config.js

const fs = require('fs');
const env = process.argv[2];

const configPath = `./config/config.${env}.json`;

if (!(configPath && fs.existsSync(configPath))) {
    return;
}

const collectConfigLines = (o, propPath, configLines) => {
    propPath = propPath || '';
    configLines = configLines || [];
    for (const key of Object.keys(o)) {
        const newPropPath = propPath + key;
        if (typeof o[key] === 'object') {
            collectConfigLines(o[key], newPropPath + '.', configLines);
        } else if (o[key] != null && o[key] !== '') {
            configLines.push(`${newPropPath}=${JSON.stringify(o[key])}`);
        }
    }
}

const config = require(configPath);
const configLines = [];
collectConfigLines(config, '', configLines);

const cp = require('child_process');
cp.execSync(`firebase -P ${env} functions:config:set ${configLines.join(' ')}`);

/functions/package.json

...
"scripts": {
    "config:set:dev": "node set-config dev",
    "config:set:test": "node set-config test",
    "config:set:prod": "node set-config prod",
    ...
},
...

рдЕрдЧрд░ рдХреЛрдИ рдЕрднреА рднреА рджреЗрдЦ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЗрд╕ рдорд╛рдзреНрдпрдо рд▓реЗрдЦ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рд╣реИ https://medium.com/indielayer/deploying-environment-variables-with-firebase-cloud-functions-680779413484ред рдореЗрд░реЗ рдЬреАрд╡рди рдХреА рд░рдХреНрд╖рд╛ рдХреАред

рдЬреЛ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рддреИрдирд╛рддреА рдХреЗ рдмрд┐рдирд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ CICD рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд░рддреА рд╣реИ рдФрд░ рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдХреЛрдИ рдбреЗрд╡рд▓рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреЛрдб рдмрдирд╛рдП рдФрд░ рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд░реЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЗрд╕ рддрд░рд╣ рдЪреАрдЬреЗрдВ рдЯреВрдЯ рдЬрд╛рддреА рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╣рдо рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдЪрд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреБрдЫ рдлреАрдЪрд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЕрднреА рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдВрддрд┐рдо рдЬрд╛рд░реА рдЯреИрдЧ рдЪреЗрдХрдЖрдЙрдЯ рд╣реИ, рдЗрд╕реЗ рдмрдирд╛рдПрдВ, рддреИрдирд╛рдд рдХрд░реЗрдВ, рдЕрдкрдиреА рдлреАрдЪрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЪреЗрдХрдЖрдЙрдЯ рдХрд░реЗрдВ, рдЬрд╛рд░реА рд░рдЦреЗрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдЕрдиреБрдкрдпреЛрдЧреА рдмрдирд╛рддрд╛ рд╣реИред

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣рдо рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рджреВрд░рд╕реНрде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ

@bezysoftware рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ (рдкрд░реНрдпрд╛рд╡рд░рдг рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрдЬрд╛рдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдк рдлрд╛рдпрд░рдмреЗрд╕ рдкрд░рдд рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ Google рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рджреЗрдЦреЗрдВ https://cloud.google.com/functions/docs/env- рд╡рд░

рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рджред @laurenzlong
рдореИрдВ рдПрдХ рдлрд╛рдЗрд▓ рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХрдорд╛рдВрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

firebase functions:config:set service_account="$(cat service-account.json)"

рдореИрдВрдиреЗ рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдЬреЗрд╕рди рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХреА, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдПрдбрдорд┐рди рдПрд╕рдбреАрдХреЗ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдмрдВрдзрди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛

@рдордж-рдЕрдмреНрджреБрд▓-рд╣рд▓реАрдо-рд░рдлреА

рдлрд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рди: рдХреЙрдиреНрдлрд┐рдЧ : рд╕реЗрдЯ service_account = "$ (рдмрд┐рд▓реНрд▓реА рд╕реЗрд╡рд╛-рдЦрд╛рддрд╛.рдЬреЗрд╕рди)"

рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рдореИрдВ config var рдХреЛ firebase functions:config:get рд╕рд╛рде рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред
рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд╣реАрдВ рдерд╛ рдФрд░ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рдЬрд┐рд╕ рдкрд░ рдХреЙрдиреНрдлрд┐рдЧ рд╡реЗрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ, рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП firebase use --add , рд╕реАрдПрд▓рдЖрдИ рдЖрдкрдХреЛ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдЖрдкрдХреЗ рдлрд╛рдпрд░рдмреЗрд╕ рдХрдВрд╕реЛрд▓ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рд╕реВрдЪреА (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдк CLI рдореЗрдВ firebase login рд╕рд╛рде рд▓реЙрдЧ рдЗрди рд╣реИрдВ)

@dnhyde

рдлрд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рди: рдХреЙрдиреНрдлрд┐рдЧ : рд╕реЗрдЯ service_account = "$ (рдмрд┐рд▓реНрд▓реА рд╕реЗрд╡рд╛-рдЦрд╛рддрд╛.рдЬреЗрд╕рди)"

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреА json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ (рдЬреИрд╕реЗ рдмреВрд▓рд┐рдпрди рдпрд╛ рд╕рдВрдЦреНрдпрд╛) рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:

{
   "test": {
        "hmm": true
    }
}

рдЗрд╕рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓:

Error: HTTP Error: 400, Invalid value at 'variable.text' (TYPE_STRING), true

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

firebase functions:config:get > config.json

рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ:

firebase functions:config:set < config.json

рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЗрди рджреЛ рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдкреВрд░рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реЛрдиреЗ рд╕реЗ рдореБрдЭреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордп рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрднреА рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ ( env=$(cat config.json) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) config.json рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рди рд░рдЦрдиреЗ рдХреА рдореЗрд░реА рдХреНрд╖рдорддрд╛ рдХреЛ рднреА рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ { env: ... } рдореЗрдВ рд▓рдкреЗрдЯ рдирд╣реАрдВ рд╕рдХрддрд╛ред

рдЕрдкрдиреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рджреЗрдВ: рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдлреАрдЪрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: https://github.com/firebase/firebase-tools/blob/b17611a4ff0d36e157ed06a24f6c81d4e146d9e2/src/functionsConfig.js#L142

рдмрд╕ рдореЗрд░реЗ рд╡реЗрдирд┐рд▓рд╛ рдЬреЗрдПрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо (рд╡рд┐рдВрдбреЛрдЬ, рдореИрдХрдУрдПрд╕, рд▓рд┐рдирдХреНрд╕) рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рджреЗрд╡/рдкрд░реАрдХреНрд╖рдг/рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

/.рдлрд╛рдпрд░рдмреЗрд╕рд░

{
  "projects": {
    "dev": "my-project-name-dev",
    "test": "my-project-name-test",
    "prod": "my-project-name-prod"
  }
}

рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╝рд╛рдЗрд▓реЗрдВ

/functions/config рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ JSON-рдлрд╝рд╛рдЗрд▓реЗрдВ:

/functions/config/config.dev.json 
/functions/config/config.test.json 
/functions/config/config.prod.json 
/functions/config/config.SAMPLE.json <-- only file tracked in git

Example content:
{
    "google": {
        "key": "my-api-key",
        "storage_bucket": "firebase-storage-bucket"
    },
    "another_vendor": {
        "my_prop": "my value"
    },
    ...
}

/functions/set-config.js

const fs = require('fs');
const env = process.argv[2];

const configPath = `./config/config.${env}.json`;

if (!(configPath && fs.existsSync(configPath))) {
    return;
}

const collectConfigLines = (o, propPath, configLines) => {
    propPath = propPath || '';
    configLines = configLines || [];
    for (const key of Object.keys(o)) {
        const newPropPath = propPath + key;
        if (typeof o[key] === 'object') {
            collectConfigLines(o[key], newPropPath + '.', configLines);
        } else if (o[key] != null && o[key] !== '') {
            configLines.push(`${newPropPath}=${JSON.stringify(o[key])}`);
        }
    }
}

const config = require(configPath);
const configLines = [];
collectConfigLines(config, '', configLines);

const cp = require('child_process');
cp.execSync(`firebase -P ${env} functions:config:set ${configLines.join(' ')}`);

/functions/package.json

...
"scripts": {
    "config:set:dev": "node set-config dev",
    "config:set:test": "node set-config test",
    "config:set:prod": "node set-config prod",
    ...
},
...

рдмрд╕ рдореЗрд░реЗ рд╡реЗрдирд┐рд▓рд╛ рдЬреЗрдПрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо (рд╡рд┐рдВрдбреЛрдЬ, рдореИрдХрдУрдПрд╕, рд▓рд┐рдирдХреНрд╕) рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рджреЗрд╡/рдкрд░реАрдХреНрд╖рдг/рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

/.рдлрд╛рдпрд░рдмреЗрд╕рд░

{
  "projects": {
    "dev": "my-project-name-dev",
    "test": "my-project-name-test",
    "prod": "my-project-name-prod"
  }
}

рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╝рд╛рдЗрд▓реЗрдВ

/functions/config рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ JSON-рдлрд╝рд╛рдЗрд▓реЗрдВ:

/functions/config/config.dev.json 
/functions/config/config.test.json 
/functions/config/config.prod.json 
/functions/config/config.SAMPLE.json <-- only file tracked in git

Example content:
{
    "google": {
        "key": "my-api-key",
        "storage_bucket": "firebase-storage-bucket"
    },
    "another_vendor": {
        "my_prop": "my value"
    },
    ...
}

/functions/set-config.js

const fs = require('fs');
const env = process.argv[2];

const configPath = `./config/config.${env}.json`;

if (!(configPath && fs.existsSync(configPath))) {
    return;
}

const collectConfigLines = (o, propPath, configLines) => {
    propPath = propPath || '';
    configLines = configLines || [];
    for (const key of Object.keys(o)) {
        const newPropPath = propPath + key;
        if (typeof o[key] === 'object') {
            collectConfigLines(o[key], newPropPath + '.', configLines);
        } else if (o[key] != null && o[key] !== '') {
            configLines.push(`${newPropPath}=${JSON.stringify(o[key])}`);
        }
    }
}

const config = require(configPath);
const configLines = [];
collectConfigLines(config, '', configLines);

const cp = require('child_process');
cp.execSync(`firebase -P ${env} functions:config:set ${configLines.join(' ')}`);

/functions/package.json

...
"scripts": {
    "config:set:dev": "node set-config dev",
    "config:set:test": "node set-config test",
    "config:set:prod": "node set-config prod",
    ...
},
...

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЖрдк " config:set :dev" рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдм рдЪрд▓рд╛рддреЗ рд╣реИрдВ? рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛... рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

chen86860 picture chen86860  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

satishverma143 picture satishverma143  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chwzr picture chwzr  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

roosi picture roosi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

repentsinner picture repentsinner  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ