рджреЗрдЦреЗрдВ: https://github.com/firebase/firebase-functions/issues/172
3.17.3
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд╕реЗрдЯрдЕрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╛рдиреА deploy
рд░реВрдЯ рд╕реЗ рдкреИрдХреЗрдЬ рдЙрдард╛рддрд╛ рд╣реИ node_modules
, рднрд▓реЗ рд╣реА package.json
рд▓рд┐рдП api/
рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╕реНрдерд┐рдд рд╣реЛ ( рдореИрдВрдиреЗ functions/
рдмрдЬрд╛рдп рдПрдХ рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ)ред рдХреНрдпрд╛ рдпрд╣рд╛рдВ рдХреБрдЫ рдФрд░ рд╣реИ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ package.json
рдХреЛ api/dist
рдореЗрдВ deploy
рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдкреА рдХрд░рддрд╛ рд╣реВрдВред
// firebase.json
...
"functions": {
"source": "api/dist"
},
...
рддреЛ, рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ 2 рд╕реНрддрд░ рдЕрднреА рднреА рд░реВрдЯ node_modules
рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред
@dinvlad рдХреНрдпрд╛ рдЖрдк рд░реЗрдкреЛ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
@orouz рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЕрднреА рддрдХ рдирд╣реАрдВ, рдпрд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрдВрдж рд╕реНрд░реЛрдд рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛? рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
@audkar рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рд╕рд┐рд░реНрдл lerna.js.org рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ run
рдХрдорд╛рдВрдб рд╣реИ:
- service1/
| - .firebaserc
| - firebase.json
- service2/
| - .firebaserc
| - firebase.json
- app1/
| - .firebaserc
| - firebase.json
- app2/
| - .firebaserc
| - firebase.json
- firestore/
| - firestore.rules
| - firestore.indexes.json
- etc...
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП firebase.json
рдлрд╛рдЗрд▓реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рди рдереЛрдкреЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рд╕рдореВрд╣реЛрдВ рдФрд░ рдмрд╣реБ-рд╕рд╛рдЗрдЯ рдирд╛рдо рд▓рдХреНрд╖реНрдпреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд░рд▓ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрднреА рднреА рдлрд╛рдпрд░рд╕реНрдЯреЛрд░/рдЬреАрд╕реАрдПрд╕ рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ...
рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ - https://github.com/firebase/firebase-tools/issues/1116
@jthegedus рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЯрд┐рдХрдЯ рдХрд╛ рдореБрджреНрджрд╛ рдЕрд▓рдЧ рд╣реИред рдореИрдВ рдпрд╛рд░реНрди рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдЯреВрд▓ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рд╕рд┐рдореНрд▓рд┐рдВрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкрд┐рдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
рдЖрд╣ рдХрд╛рдлреА рд╣реИ, рдореИрдВрдиреЗ рдЦреБрдж рдЙрд╕ рдЦрд░рдЧреЛрд╢ рдХреЗ рдЫреЗрдж рд╕реЗ рдкрд░рд╣реЗрдЬ рдХрд┐рдпрд╛ рд╣реИ
рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ api
рдФрд░ app
рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдирдВрдЧреЗ рдпрд╛рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ yarn workspace api build && yarn workspace app build
( build
рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рддрд╛ рд╣реВрдВ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░)ред рдирд┐рд░реНрдорд╛рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рез) TS рдХреЛрдб рдХреЛ outDir
app/dist
рдХреНрд░рдорд╢рдГ api/dist
рдФрд░ app/dist
рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ
2) рд╕рдВрдмрдВрдзрд┐рдд package.json
рдлрд╛рдЗрд▓реЛрдВ рдХреЛ dist
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ
3) yarn.lock
рдХреЛ _root_ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ dist
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ
рдлрд┐рд░ рдореИрдВ _root_ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ yarn firebase deploy
рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХреА рдХреЗ api/dist
рдФрд░ app/dist
рджреЛрдиреЛрдВ рдХреЛ рдЙрдард╛рддрд╛ рд╣реИред рдореЗрд░рд╛ firebase.json
рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
"functions": {
"source": "api/dist"
},
"hosting": {
"public": "app/dist",
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдЕрднреА рднреА рдкреВрд░рд╛ рдХреЛрдб рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реЗрдЯрдЕрдк рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, afaikред
рд╕рд╛рде рд╣реА, рдореИрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ firebase deploy
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреА node_modules
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдХреЛрдб рдЙрдард╛рддрд╛ рд╣реИ, package.json
, рдФрд░ yarn.lock
dist
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ, рдФрд░ рдмрд╛рдХреА рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╕рдЪ рд╣реИред firebase.json рдореЗрдВ "functions.ignore" рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИ
["рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕"] рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдкрд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдЖрдк рдХреБрдЫ рд╕реНрдерд╛рдиреАрдп рдореЙрдбреНрдпреВрд▓ рд╢рд┐рдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╕реЛрдо рдХреЛ, рдЬреВрди резрен, реирежрезреп, рем:релрео рдЕрдкрд░рд╛рд╣реНрди рдбреЗрдирд┐рд╕ рд▓реЛрдЧрд┐рдиреЛрд╡ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:
рд╕рд╛рде рд╣реА, рдореИрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рддреИрдирд╛рддреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреА рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдЙрдард╛рддрд╛ рд╣реИ
рдХреЙрдб, рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди, рдФрд░ рдпрд╛рд░реНрди.рд▓реЙрдХ рдбрд┐рд╕реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ, рдФрд░ рдХрд░рддрд╛ рд╣реИ
рд╡рд┐рд╢реНрд░рд╛рдоред-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/firebase/firebase-tools/issues/653?email_source=notifications&email_token=ACATB2U73VS2KIILUVRFFB3P3A6NPA5CNFSM4EOR24GKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJJ
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ACATB2U3Q2TLVBICRJ3B5OLP3A6NPANCNFSM4EOR24GA
.
@dinvlad рд╣рд╛рдБ, рдЗрд╕рдХреЗ рд▓рд┐рдП package.json
рдФрд░ рдЬреЛ рднреА рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдХреНрд▓рд╛рдЙрдб рдкреЛрд╕реНрдЯ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдореЗрдВ рдбрд┐рдкреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рдореБрджреНрджреЗ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреЗ рднреАрддрд░ рдПрдХ рд╕рд╛рдЭрд╛ рдкреИрдХреЗрдЬ рдФрд░ рд╕реНрдХреЛрдк-рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдзрд╛рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рд╡рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдкрдврд╝рд╛ рд╣реИред
@samtstern @jthegedus рдзрдиреНрдпрд╡рд╛рдж,
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ yarn workspaces
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓реЗрдЖрдЙрдЯ
- utilities/
| - package.json
- functions/
| - package.json
- package.json
_./рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди_
{
"private": true,
"workspaces": ["functions", "utilities"]
}
_рдлрд╝рдВрдХреНрд╢рдВрд╕/рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди_
{
<...>
"dependencies": {
"utilities": "1.0.0",
<...>
}
}
рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐:
Deployment error.
Build failed: {"error": {"canonicalCode": "INVALID_ARGUMENT", "errorMessage": "`gen_package_lock` had stderr output:\nnpm WARN deprecated [email protected]: use String.prototype.padStart()\nnpm ERR! code E404\nnpm ERR! 404 Not Found: [email protected]\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /builder/home/.npm/_logs/2019-06-18T07_10_42_472Z-debug.log\n\nerror: `gen_package_lock` returned code: 1", "errorType": "InternalError", "errorId": "1971BEF9"}}
рдХрд╛рд░реНрдп рдПрдореНрдпреВрд▓реЗрдЯрд░ рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
node_modules
рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (_firebase.json_ рдореЗрдВ functions.ignore
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реИред
рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ utilities
_node-modules_ node_modules/utilities -> ../../utilities
рдореЗрдВ syslink рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдХреНрдпрд╛ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕-рдЯреВрд▓реНрд╕ рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╢рд╛рдорд┐рд▓ рди рд╣реЛ (рдХреЛрдИ рдбреАрд░реЗрдлреЗрд░реЗрдВрд╕рд┐рдВрдЧ рдирд╣реАрдВ)?
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдХреНрдпрд╛ рдЖрдк рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ firebase.json
рдХрд┐рд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ (рдФрд░ functions
рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЕрдиреБрднрд╛рдЧ рджрд┐рдЦрд╛рдПрдВ)?
_firebase.json_ рд░реВрдЯ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдерд╛ред рд╡рд┐рдиреНрдпрд╛рд╕ рдорд╛рдирдХ рдерд╛ред рдЗрд╕ рддрд░рд╣ рд╕реНрдорде:
"functions": {
"predeploy": [
"yarn --cwd \"$RESOURCE_DIR\" run lint",
"yarn --cwd \"$RESOURCE_DIR\" run build"
],
"source": "functions",
"ignore": []
},
<...>
рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (_node_modules_ рд╕рд╣рд┐рдд) node_modules/utilities
рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬреЛ рдХрд┐ рд╕рд┐рдореНрд▓рд┐рдВрдХ рд╣реИред
рдореИрдВ рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдХрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реВрдВ:
yarn pack
)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ _utilities.tgz_ рдмрдирд╛рддрд╛ рд╣реИредdependencies { "utilities": "1.0.0"
-> dependencies { "utilities": "file:./utilities.tgz"
рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдЙрдЯрдкреБрдЯ рдбреАрдЖрдИрдЖрд░ рд╕рд╛рдордЧреНрд░реА:
- dist
| - lib
| | -index.js
| - utilities.tgz
| - package.json <---------- This is modified to use *.tgz for workspaces
@audkar рдЖрдЬ рдореИрдВ рдЖрдкрдХреЗ рдЬреИрд╕реЗ рд╣реА рдореБрджреНрджреЗ рдореЗрдВ рдлрдВрд╕ рдЧрдпрд╛ред
рдореИрдВ Lerna рдФрд░ Yarn рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдБред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЖрдк рдХреЗрд╡рд▓ рд▓рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░реЗрдЧрд╛?
рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ ЁЯдФ
рдпрд╣ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ `--cwd "$RESOURCE_DIR" рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣реИ?
--cwd
рдЕрд░реНрде "рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╢реАрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛" рд╣реИ рдФрд░ $RESOURCE_DIR
рд╕реНрд░реЛрдд рдбреАрдЖрдИрдЖрд░ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рд░рдЦрддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ functions
)ред рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ yarn
рдХреЛ рд░реВрдЯ рдХреЗ рдмрдЬрд╛рдп functions
dir рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
@audkar рдЖрд╣ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдБред рддреЛ рдЖрдк yarn workspace functions lint
рдФрд░ yarn workspace functions build
рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
@dinvlad рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк dist/index.js
рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдлрд┐рд░ рдЖрдкрдХреЛ рдПрдкреАрдЖрдИ/рдЬрд┐рд▓рд╛ рдХреЗ рдмрдЬрд╛рдп рд╕реНрд░реЛрдд рдХреЛ рдПрдкреАрдЖрдИ рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
@dinvlad рдореИрдВрдиреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ yarn workspace
рдХрдорд╛рдВрдб рд╕реАрдЦрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?
рдпрд╣рд╛рдБ рд╡рд┐рд╖рдп рд╕реЗ рдереЛрдбрд╝рд╛ рд╣рдЯрдХрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рд╢реЛрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж SO рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВред
@ 0x80 рдореИрдВ package.json
рд╕реЗ api/dist
рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ firebase.json
рд╕реЗ api/dist
рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ "рдирд┐рд░реНрдорд┐рдд" рдлрд╝рд╛рдЗрд▓реЗрдВ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдкреИрдХ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ firebase.json
рдХреЛ api
рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ - рд╢рд╛рдпрдж рдпрд╣ рдЕрднреА рднреА рдХреЗрд╡рд▓ api/dist
( main
рдкрд░ рдЖрдзрд╛рд░рд┐рдд) рдХреЛ рдкреИрдХреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдЧрд╛ package.json
)ред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ api/dist
рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓реАрдирд░ рдерд╛ред
рдкреБрди yarn workspace
, рдореИрдВрдиреЗ SO рдкрд░ рдЬрд╡рд╛рдм рджрд┐рдпрд╛;)
@dinvlad рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рдЬрдбрд╝ рдХреЛ рдмрдВрдбрд▓ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рд╡рд╣ рд╕рдм рдХреБрдЫ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк firebase.json рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдЕрдм @audkar рдХреЗ рд╕рдорд╛рди рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред
{
"functions": {
"source": "packages/cloud-functions",
"predeploy": ["./scripts/pre-deploy-cloud-functions"],
"ignore": [
"src",
"node_modules"
]
}
}
рдлрд┐рд░ рдкреВрд░реНрд╡-рддреИрдирд╛рддреА-рдХреНрд▓рд╛рдЙрдб-рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ:
#!/usr/bin/env bash
set -e
yarn workspace @gemini/common lint
yarn workspace @gemini/common build
cd packages/common
yarn pack --filename gemini-common.tgz
mv gemini-common.tgz ../cloud-functions/
cd -
cp yarn.lock packages/cloud-functions/
yarn workspace @gemini/cloud-functions lint
yarn workspace @gemini/cloud-functions build
рдФрд░ рд╕рдВрдХреБрд▓/рдХреНрд▓рд╛рдЙрдб-рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд gitignore рдлрд╝рд╛рдЗрд▓ рд╣реИ:
yarn.lock
*.tgz
рдпрд╣рд╛рдБ рдореЗрд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ
- root/
| - .firebaserc
| - firebase.json
- packages/
| - package1/
| - functions/
| - dist/
| - src/
| packages.json
рдФрд░ root/firebase.json
:
```
{
"рдлрд╝рдВрдХреНрд╢рдВрд╕": {
"рдкреВрд░реНрд╡ рдирд┐рдпреЛрдЬрд┐рдд": "npm --prefix "$RESOURCE_DIR" рд░рди рдмрд┐рд▓реНрдб",
"рд╕реНрд░реЛрдд": "рдкреИрдХреЗрдЬ/рдлрд╝рдВрдХреНрд╢рдВрд╕"
}
}
````
@kaminskypavel рдкреИрдХреЗрдЬ/рдкреИрдХреЗрдЬ 1 (рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рднрд╛рдИ рдкреИрдХреЗрдЬ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ/рдХрд╛рд░реНрдп рд╣реИрдВ?
@0x80 рд╕рдХрд╛рд░рд╛рддреНрдордХред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЛрдиреЛрд░реЗрдкреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдХреБрдЫ рдореМрд▓рд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдкреИрдХреЗрдЬ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдРрдк рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдирдкреАрдПрдо рдХреЛ рд╕рд╛рдЭрд╛ рдкреИрдХреЗрдЬ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Firebase рдпрд╛ Now.sh рдЬреИрд╕реЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЖрдорддреМрд░ рдкрд░ рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд░реЗрдВрдЧреЗ рдФрд░ рдлрд┐рд░ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рдмрд┐рд▓реНрдб рдХрд░реЗрдВрдЧреЗред рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВрдБ?
@kaminskypavel рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдПрдирдкреАрдПрдо рдХреЛ рдЕрдкрдирд╛ рдкреИрдХреЗрдЬ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реАред рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреИрдХреЗрдЬ рдирд┐рдЬреА рд╣реИ, рдореБрдЭреЗ рд╢реБрд░реВ рдореЗрдВ "рдирд╣реАрдВ рдорд┐рд▓рд╛" рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЕрдкрдиреА .npmrc рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкреИрдХреЗрдЬ рдХреА рдЬрдбрд╝ рдореЗрдВ рднреА рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд
@audkar рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдХреЗрдЬ рдПрдирдкреАрдПрдо рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдореЗрд░реЗ рдЬреИрд╕реЗ рд╕рд╛рдЭрд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ?
@ 0x80 рдореИрдВ рдЗрд╕ рд╕рдордЭ рдкрд░ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реВрдВ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗрд╡рд▓ (рдЧрд▓рддреА рд╕реЗ) рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рд╣реИрдВ рдХрд┐ package.json рдореЗрдВ рдирд╛рдорд┐рдд рд╕рднреА рдкреИрдХреЗрдЬ npm рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ, рддреИрдирд╛рддреА рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рдирд╛рдо рдкрд░ред
рдЪреВрдВрдХрд┐ рдпрд╛рд░реНрди рд╡рд░реНрдХрд╕реНрдкреЗрд╕ рд╕реЗрдЯрдЕрдк рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдлрд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЦрд╛рд╕рдХрд░ рдЬрдм рддрдХ рд╡реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рддреИрдирд╛рдд рдХрд┐рдП рдЬрд╛рдиреЗ рддрдХ рдареАрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
npm рдХрд╛рд░реНрдпрд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдорд╛рдирдХ рд╣реИ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рдЕрдзрд┐рдХ рдкреБрд░рд╛рдиреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдпреЛрдЬрдирд╛рдУрдВ (рдпрд╛ рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдХрдореА) рдкрд░ рдлрд╛рдпрд░рдмреЗрд╕ рдХреА рдУрд░ рд╕реЗ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЕрд╡рд╕рд░ рд╣реИ - рдлрд╛рдпрд░рдмреЗрд╕ рдХреА рд╕реЗрд╡рд╛рдУрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдПрдХ рдЕрдЪреНрдЫреЗ рдореЛрдиреЛрд░реЗрдкреЛ рд╕реЗрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рднреАрдЦ рдорд╛рдБрдЧрддреА рд╣реИред
рдЗрд╕ рдкрд░ +1, рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЕрдиреНрдп рдРрдкреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб (рдЬреИрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕) рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ (рдЬреИрд╕реЗ рд▓рд░реНрдирд╛) рдпрд╛ рд╕реАрдзреЗ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдореИрдВрдиреЗ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд▓рд┐рдпрд╛ рдФрд░ рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ред рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ: рдореИрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд┐рдпрд╛:
```
content of `pre-deploy.js`
рдХреЙрдиреНрд╕реНрдЯ рдПрдлрдПрд╕ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("рдПрдлрдПрд╕-рдЕрддрд┐рд░рд┐рдХреНрдд");
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдЬрд╕рдирдкрд╛рде = "./package.json";
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдЬрд╕рди = рдЖрд╡рд╢реНрдпрдХрддрд╛ (рдкреИрдХреЗрдЬрдЬрд╕рдирдкрд╛рде);
(рдПрд╕рд┐рдВрдХ () => {
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ fs.remove( ./shared
);
рдкреНрд░рддреАрдХреНрд╖рд╛ fs.copy( ../shared
, ./shared
);
packageJson.dependencies["@project/shared"] = "file:./shared";
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
}) ();
content of `post-deploy.js`
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдЬрд╕рдирдкрд╛рде = "./package.json";
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдЬрд╕рди = рдЖрд╡рд╢реНрдпрдХрддрд╛ (рдкреИрдХреЗрдЬрдЬреЗрд╕рдирдкрд╛рде);
рдХреЙрдиреНрд╕реНрдЯ рдПрдлрдПрд╕ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("рдПрдлрдПрд╕-рдЕрддрд┐рд░рд┐рдХреНрдд");
(рдПрд╕рд┐рдВрдХ () => {
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ fs.remove ( ./shared
);
packageJson.dependencies["@project/shared"] = "file:../shared";
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
}) ();
Then update `firebase.json` like this (add the build script if you need, I build before in my pipeline)
"рдлрд╝рдВрдХреНрд╢рдВрд╕": {
"рд╕реНрд░реЛрдд": "рдХрд╛рд░реНрдп",
"рдкреВрд░реНрд╡-рддреИрдирд╛рддреА": [
"npm --prefix "$RESOURCE_DIR" рдкреВрд░реНрд╡-рддреИрдирд╛рддреА рдЪрд▓рд╛рдПрдВ"
],
"рддреИрдирд╛рддреА рдХреЗ рдмрд╛рдж": [
"npm --prefix "$RESOURCE_DIR" рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рдмрд╛рдж рдЪрд▓рд╛рдПрдБ"
]
},
```
рдпрджрд┐ рдЖрдк рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ dist
рдпрд╛ lib
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рдЕрдм рдЖрдкрдХреЗ рджреЛ рднрд╛рдИ-рдмрд╣рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП: рдХрд╛рд░реНрдп рдФрд░ рд╕рд╛рдЭрд╛ (рдпрд╣ рд╕рд╛рдЭрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ)ред рддреИрдирд╛рддреА рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП lib/functions/src/index.js
рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП package.json
main
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред
рдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдЯреВрд▓реНрд╕ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
@michelepatrassi рдЖрдкрдиреЗ рдореБрдЭреЗ рдЬреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдпрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░ рдореИрдВрдиреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП firelink
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдИ рд╣реИред рдпрд╣ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ rsync
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
https://github.com/rxdi/firelink
npm i -g @rxdi/firelink
рдореВрд▓ рдЙрдкрдпреЛрдЧ
рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореЛрдиреЛрд░реЗрдкреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ 2 рд╕реНрддрд░ рдиреАрдЪреЗ рд╕реНрдерд┐рдд рд╣реИрдВ рдЬрд╣рд╛рдВ package.json
рд╕реНрдерд┐рдд рд╣реИред
package.json
"fireDependencies": {
"@graphql/database": "../../packages/database",
"@graphql/shared": "../../packages/shared",
"@graphql/introspection": "../../packages/introspection"
},
рдирд┐рд╖реНрдкрд╛рджрд┐рдд firelink
рдпрд╣ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдЧрд╛ рдлрд┐рд░ рд╕реНрдерд╛рдиреАрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдореМрдЬреВрджрд╛ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдореИрдк рдХрд░реЗрдЧрд╛ "@graphql/database": "file:./.packages/database",
рдлрд┐рд░ рдХрдорд╛рдВрдб firebase
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдмрд╛рдХреА рддрд░реНрдХреЛрдВ рдХреЛ firelink
рд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛
рдореВрд▓ рд░реВрдк рд╕реЗ firelink
рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рд╣реИ firebase
CLI рдХреЗ рдмрд╛рдж рд╕реЗ рдпрд╣ spawns firebase
рдЕрдВрдд рдореЗрдВ рдЬрдм рд╕рдорд╛рдкреНрдд рдЕрдкрдиреА рдиреМрдХрд░реА рдХреЛ рдХреЙрдкреА packages
рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд package.json
!
рд╕рд╛рджрд░!
рд╣рдо рдЕрднреА-рдЕрднреА рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд╛рдЯреЗ рдЧрдП рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЛрдиреЛрд░реЗрдкреЛ рдорд╛рдирдХ рдмрди рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рджреЛрд╕реНрддреЛрдВ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЙрдб-рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдмрдВрдбрд▓ рдХреА рдЧрдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдПрдХ рдореВрд▓ рд╡реЗрдмрдкреИрдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд▓рдЧреНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдХреЛ рдкреИрдХ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдореЛрдиреЛ-рд░реЗрдкреЛ рдХреЗ рднреАрддрд░ рд╣рд▓ рдХреА рдЧрдИ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдПрдХ рдЯреЙрдкрд▓реЗрд╡рд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреА webpack/cloud-functions
, рдпрд╣ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ)
const path = require('path');
module.exports = {
target: 'node',
mode: 'production',
entry: './src/index.ts',
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/
}
]
},
resolve: {
extensions: ['.tsx', '.ts', '.js', '.json']
},
output: {
filename: 'index.js',
path: path.resolve(__dirname, '../../webpack/cloud-functions/dist'),
libraryTarget: 'commonjs'
},
externals: {
'firebase-admin': 'firebase-admin',
'firebase-functions': 'firebase-functions'
}
};
рдФрд░ рдЕрдВрдд рдореЗрдВ рдЕрдкрдиреА firebase.json
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рджреЗрдЦреЗрдВред
{
"functions": {
"source": "webpack/cloud-functions"
}
}
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ package.json
рдлрд╝рд╛рдЗрд▓ webpack/cloud-functions
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рднреА рд╣реЛред
{
"name": "cloud-functions",
"version": "1.0.0",
"scripts": {
"deploy": "firebase deploy --only functions"
},
"engines": {
"node": "10"
},
"main": "dist/index.js",
"dependencies": {
"firebase-admin": "8.9.1",
"firebase-functions": "3.3.0"
},
"devDependencies": {},
"private": true
}
рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ Google рдХреНрд▓рд╛рдЙрдб рдмрд┐рд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдВред
рдзрдиреНрдпрд╡рд╛рдж,
@sowdri рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдХреНрдпрд╛ рдЖрдк webpack рдмрд┐рд▓реНрдб рдХреЛ firebase.json functions.predeploy
рд╕реНрдЯреЗрдк рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдХреНрдпрд╛ рдЖрдк рдлрд╛рдпрд░рдмреЗрд╕ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдХреНрд▓рд╛рдЙрдб рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ?
@ 0x80 рдореИрдВ рдЗрд╕реЗ cloud build
рдЪрд░рдг рдореЗрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рддреЛ firebase cli
рдпрд╣ рдХреЗрд╡рд▓ JS рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ
@sowdri рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рдордиреЗ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд▓реИрдореНрдмрдбрд╛рд╕/рд╕рд░реНрд╡рд░рд▓реЗрд╕ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ: рдпрд╛рд░реНрди рдореЛрдиреЛрд░реЗрдкреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓реНрд╕ рдХреЛ рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ (рд╡реЗрдмрдкреИрдХ) рдмрдВрдбрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рдЖрд╕рд╛рди рдерд╛ред
рдореИрдВ рднреА рдЗрд╕рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдВ .... рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдПрдореБрд▓реЗрдЯрд░) рдЬрдм рддрдХ рдХрд┐ рдореИрдВрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╡реЗрдм рдРрдк рдмрд┐рд▓реНрдб рдареАрдХ рд╣реИ)ред :(рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдЯреАрдо рдЬрд▓реНрдж рд╣реА рдореЛрдиреЛрд░реЗрдкреЛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝ рд╕рдХрддреА рд╣реИред
рдореИрдВ рдЕрдкрдиреЗ рдореЛрдиреЛрд░реЗрдкреЛ рдореЗрдВ рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдЕрдЧрд░ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рддреЛ рдореИрдВ рд╡реЗрдмрдкреИрдХ рдЖрдЬрд╝рдорд╛ рд╕рдХрддрд╛ рд╣реВрдБ...рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдЗрд╕реЗ GitHub рдкреИрдХреЗрдЬ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рд╕рднреА рдкреИрдХреЗрдЬ рд╡рд╣рд╛рдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ travis
рдФрд░ functions
рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ( .npmrc
рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред ... рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣рд╛рдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рд╛: https://medium.com/gdgeurope/how-to-use-firebase-cloud-functions-and-yarn-workspaces-24ca35e941eb
рд╣рд╛рдБ, рдЗрд╕рдиреЗ рднреА рдХрд╛рдЯ рд▓рд┐рдпрд╛ред рд╕рдм рдХреБрдЫ firebase serve --only functions
рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЬрдм рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрд╛ред
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреИрдпрд╛рд░ рдХреАред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдореЗрд░реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╛рдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдирд╛рдо, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред
``` "fs" рд╕реЗ fs рдЖрдпрд╛рдд рдХрд░реЗрдВ;
"child_process" рд╕реЗ рдЪрд╛рдЗрд▓реНрдб_рдкреНрд░реЛрд╕реЗрд╕ рдЖрдпрд╛рдд рдХрд░реЗрдВ;
рдХреЙрдиреНрд╕реНрдЯ рдЗрдВрдЯрд░рдирд▓рдкреИрдХреЗрдЬрдлреБрд▓ = рдирдпрд╛ рдореИрдк ();
// рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рд┐рд╡рд░рдг рдЦреЛрдЬреЗрдВ
const getDepsForPackage = (рдкреИрдХреЗрдЬрдирд╛рдо) => {
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдбрд┐рд░ = рдкреИрдХреЗрдЬрдирд╛рдо.рд╕реНрдкреНрд▓рд┐рдЯ ("/") [1]; // рдЗрд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХрдлрд╛рдЗрд▓рдирд╛рдо = ../${packageDir}/package.json
;
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХрдлрд╛рдЗрд▓ = fs.readFileSync (рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХрдлрд╛рдЗрд▓рдирд╛рдо);
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХ = JSON.parse (рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХрдлрд╛рдЗрд▓);
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдЗрдВрдЯрд░рдирд▓рдбрд┐рдкреНрд╕ = рдСрдмреНрдЬреЗрдХреНрдЯ.рдХреА (
рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХ.рдирд┐рд░реНрднрд░рддрд╛
).filter((key) => key.includes("turing")); // рдЗрд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬTgzName = ${packageName.replace("@", "").replace("/", "-")}-v${
packageSpec.version
}.tgz
;
рдЖрдВрддрд░рд┐рдХ рдкреИрдХреЗрдЬрдлреБрд▓.рд╕реЗрдЯ (рдкреИрдХреЗрдЬрдирд╛рдо, {
рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХрдлрд╝рд╛рдЗрд▓рдирд╛рдо,
рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХ,
рдкреИрдХреЗрдЬрдбреАрдЖрдИрдЖрд░,
рдкреИрдХреЗрдЬрдЗрдВрдЯрд░рдирд▓рдбрд┐рдкреНрд╕,
рдкреИрдХреЗрдЬ рдЯреАрдЬреАрдЬреЗрдбрдирд╛рдо,
});
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдЯреЛрдкреНрд░реЛрд╕реЗрд╕ = рдкреИрдХреЗрдЬрдЗрдВрдЯрд░рдирд▓рдбрд┐рдкреНрд╕.рдлрд┐рд▓реНрдЯрд░ (
(internalDepName) => !internalPackagesFull.has(internalDepName)
);
packageToProcess.forEach((internalPackageName) =>
getDepsForPackage (рдЖрдВрддрд░рд┐рдХ рдкреИрдХреЗрдЬ рдирд╛рдо)
);
};
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдирд╛рдо = JSON.parse(fs.readFileSync(./package.json")).name;
Child_process.execSync( cp ./package.json ./package.json.org
);
getDepsForPackage (рдкреИрдХреЗрдЬрдирд╛рдо);
// рдЕрджреНрдпрддрди рдкреИрдХреЗрдЬ рд▓рд┐рдЦреЗрдВ - рд╕рд╛рдорд╛рдиреНрдп js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд╕рдВрджрд░реНрдн рд╕реНрдерд╛рдиреАрдп tgz рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ
[... рдЖрдВрддрд░рд┐рдХ рдкреИрдХреЗрдЬрдлреБрд▓ред рдорд╛рди ()]ред рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП ((рдЖрдВрддрд░рд┐рдХ рдбреАрдк) => {
рдХреЙрдиреНрд╕реНрдЯ {рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХ, рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХрдлрд╛рдЗрд▓рдирд╛рдо, рдкреИрдХреЗрдЬрдЗрдВрдЯрд░рдирд▓рдбрд┐рдкреНрд╕} = рдЗрдВрдЯрд░рдирд▓рдбрд┐рдк;
// рдкреИрдХреЗрдЬ рдкреНрд░рдХрд╛рд░ рдмрджрд▓реЗрдВ
packageSpec.type = "commonjs"; // рдЗрд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ
// рдкреИрдХреЗрдЬ рдХреА рдЧрдИ рдЬрд╝рд┐рдк рдлрд╝рд╛рдЗрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдкреЛ рдХрд╛ рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
packageInternalDeps.forEach((internalDepOfPackage) => {
рдХреЙрдиреНрд╕реНрдЯ {рдкреИрдХреЗрдЬ рдЯреАрдЬреАрдЬреЗрдбрдирд╛рдо} = рдЖрдВрддрд░рд┐рдХ рдкреИрдХреЗрдЬрдлреБрд▓ред рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЖрдВрддрд░рд┐рдХ рдбреАрдкрдСрдл рдкреИрдХреЗрдЬ);
packageSpec.dependencies[internalDepOfPackage] = ./${packageTgzName}
;
});
fs.writeFileSync(
рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХрдлрд╝рд╛рдЗрд▓рдирд╛рдо,
JSON.stringify (рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХ, рдирд▓, "")
);
});
// рдпрд╛рд░реНрди рдмрд┐рд▓реНрдб рдФрд░ рдкреИрдХ рдЪрд▓рд╛рдПрдВ
[... рдЖрдВрддрд░рд┐рдХ рдкреИрдХреЗрдЬрдлреБрд▓ред рдорд╛рди ()]ред рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП ((рдЖрдВрддрд░рд┐рдХ рдбреАрдк) => {
рдкреНрд░рдпрддреНрди {
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ( Buliding ${internalDep.packageDir}
);
child_process.execSync("рдпрд╛рд░реНрди рдмрд┐рд▓реНрдб", {
рд╕реАрдбрдмреНрд▓реНрдпреВрдбреА: ../${internalDep.packageDir}
,
});
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ( Packaging ${internalDep.packageDir}
);
child_process.execSync("рдпрд╛рд░реНрди рдкреИрдХ", {
рд╕реАрдбрдмреНрд▓реНрдпреВрдбреА: ../${internalDep.packageDir}
,
});
if (packageName !== internalDep.packageSpec.name) {
console.log(`Move to current directory ${internalDep.packageDir}`);
child_process.execSync(
`cp ../${internalDep.packageDir}/${internalDep.packageTgzName} .`,
{
cwd: ".",
}
);
}
} рдХреИрдЪ (рдИ) {
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рдИ);
}
});
// рдорд╛рдирдХ рдкреИрдХреЗрдЬ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ
[... рдЖрдВрддрд░рд┐рдХ рдкреИрдХреЗрдЬ рдкреВрд░реНрдгред рдорд╛рди ()]
.filter((internalDep) => packageName !== internalDep.packageSpec.name)
рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП ((рдЖрдВрддрд░рд┐рдХ рдбреАрдк) => {
рдХрд╛рд╕реНрдЯ {
рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХ,
рдкреИрдХреЗрдЬрд╕реНрдкреЗрдХрдлрд╝рд╛рдЗрд▓рдирд╛рдо,
рдкреИрдХреЗрдЬрдЗрдВрдЯрд░рдирд▓рдбрд┐рдкреНрд╕,
} = рдЖрдВрддрд░рд┐рдХ рдбреАрдк;
// change the package type
packageSpec.type = "module"; // THIS MAY NEED TO CHANGE FOR YOU
// specify the location of the dep to be the packaged zip file
packageInternalDeps.forEach((internalDepOfPackage) => {
packageSpec.dependencies[internalDepOfPackage] = "*";
});
fs.writeFileSync(
packageSpecFileName,
JSON.stringify(packageSpec, null, " ")
);
});
```
рдореИрдВрдиреЗ @sowdri рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!), рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЯреНрд╡реАрдХ рдХреЗ рд╕рд╛рде рддрд╛рдХрд┐ рдореИрдВ рдорд╛рдзреНрдпрдорд┐рдХ package.json
рд╕рд╣рд┐рдд рд╕рдВрдкреВрд░реНрдг dist/
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рдФрд░ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХреВрдВ :
const path = require('path');
const CopyPlugin = require('copy-webpack-plugin');
module.exports = {
...,
plugins: [
new CopyPlugin({
patterns: [{ from: 'package.dist.json', to: 'package.json' }],
}),
],
};
рдФрд░ рдлрд┐рд░ рдореИрдВ рдкреИрдХреЗрдЬ рд░реВрдЯ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд package.dist.json
рд░рдЦрддрд╛ рд╣реВрдВ:
{
"name": "@package/name",
"version": "0.0.1",
"engines": {
"node": "10"
},
"main": "index.js",
"dependencies": {
"firebase-admin": "8.9.1",
"firebase-functions": "3.3.0"
},
"private": true
}
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рднреА рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЗрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдЖрдкрдХреЗ рдореБрдЦреНрдп package.json
рд╕рд╛рде рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛рдХрд░), рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИред
рдореИрдВ рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдпрд╛ рдлрд╛рдпрд░рдмреЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП .firebaserc
рдФрд░ firebase.json
рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рднрдВрдбрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдПрдирдкреАрдПрдо рд╕реАрдкреАрдЖрдИ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреАрдЖрдИрдЖрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдореЗрд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдореМрдЬреВрдж рд╣реИред
рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдореВрд▓ package.json рд╕реЗ package.json
рдмрдирд╛рддрд╛ рд╣реВрдВред
рдпрд╣рд╛рдБ copyFiles.js
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ:
const cpy = require('cpy');
const fs = require('fs');
const package = require('./package.json');
(async () => {
await cpy(['./../package.json', './**/*.json', './**/.firebaserc'], '../out/', {
parents: true,
cwd: 'src'
});
const dirs = fs.readdirSync('./out/');
const newPkg = {
main: package.main,
dependencies: package.dependencies,
engines: package.engines,
}
dirs.forEach(dir => {
fs.writeFileSync(`./out/${dir}/package.json`, JSON.stringify({ name: dir, ...newPkg }));
})
console.log('Files copied!', dirs);
})();
рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП ./out/[project-name]/firebase deploy --only=functions
рдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА рд▓рд┐рдЦреЗрдВред
рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреБрдЫ рд╡реЗрдмрдкреИрдХ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВ:
/Users/me/Development/myproject/node_modules/firebase-functions/lib/config.js 61:23-42 рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА
рдЧрдВрднреАрд░ рдирд┐рд░реНрднрд░рддрд╛: рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ
рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛, рдпрд╛ рдЖрдк рдЗрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛/рджрдмрд╛ рд░рд╣реЗ рд╣реИрдВ?
рдореИрдВ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдореИрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрд╛рд╣рд░реА рдХреЗ рд▓рд┐рдП рд░реЗрдЧреЗрдХреНрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдмрд╛рд╣рд░реА рдореЗрдВ "рдлрд╛рдпрд░рдмреЗрд╕-рдлрд╝рдВрдХреНрд╢рдВрд╕" рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдмрдореЙрдбреНрдпреВрд▓ рд╕реЗ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдЖрдпрд╛рдд рдХрд╛ рдорд┐рд▓рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрднреА рднреА рдЖрдкрдХреЗ рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдмрдВрдбрд▓рд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЭреЗ рддреИрдирд╛рддреА рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдЧреБрдкреНрдд @grpc рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рднреА рднрд╛рдЧ рдЧрдпрд╛ред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд░рдЦрдирд╛ рднреВрд▓ рдЧрдпрд╛ред
const path = require("path");
const CopyPlugin = require("copy-webpack-plugin");
module.exports = {
target: "node",
mode: "production",
entry: "./src/index.ts",
devtool: "inline-source-map",
module: {
rules: [
{
test: /\.tsx?$/,
use: "ts-loader",
exclude: /node_modules/,
},
],
},
resolve: {
extensions: [".tsx", ".ts", ".js", ".json"],
alias: {
"~": path.resolve(__dirname, "src"),
},
},
output: {
filename: "index.js",
path: path.resolve(__dirname, "dist/bundled"),
libraryTarget: "commonjs",
},
externals: ["express", /^firebase.+$/, /^@google.+$/],
plugins: [
new CopyPlugin({
patterns: [{ from: "package.dist.json", to: "package.json" }],
}),
],
};
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрд▓рдЧ package.dist.json рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд░рдЦрдиреЗ рдХреА рдХрд╖реНрдЯрдкреНрд░рдж рдмрд╛рдд рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд╡рд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рд╕реА рднреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рддреЛ рдЗрд╕реЗ рднреВрд▓рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЙрди рд╕рднреА рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рд▓реЗ рдЬрд╛рдПрдБ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрдкрдиреЗ package.dist.json рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдмрд╕ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╡реЗрдмрдкреИрдХ рдХреЙрдкреА рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ . рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА package.json рд╣реИ
рд╕рд╛рде рд╣реА, рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдореЗрд░рд╛ рд╕реНрдерд╛рдиреАрдп рдиреЛрдбрдЬ рд╕рдВрд╕реНрдХрд░рдг рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рддреИрдирд╛рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛред рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЕрдм рдЖрдк firebase.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ functions.runtime
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП package.json рд╕реЗ engines
рдлрд╝реАрд▓реНрдб рдирд┐рдХрд╛рд▓реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рдлрд╛рдпрд░рдмреЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ functions.runtime
рд╕реЗ "10" рдпрд╛ "12" рд╕реЗрдЯ рдХрд░реЗрдВред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
{
"functions": {
"source": "packages/cloud-functions/dist/bundled",
"runtime": "12"
},
"firestore": {
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
},
"emulators": {
"functions": {
"port": 5001
},
"firestore": {
"port": 8080
},
"pubsub": {
"port": 8085
}
}
}
рдЖрдк рд╕реНрд░реЛрдд рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯ рд░рд╣реЗ рд╣реИрдВ? рдЕрдЧрд░ рдореИрдВ devtool: "inline-source-map"
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдмрдкреИрдХ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдВрдбрд▓ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рд╕реНрдЯреИрдХрдбреНрд░рд╛рдЗрд╡рд░ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдореЗрдВ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред @sowdri
рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдФрд░ рдпрд╣ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрдорд░ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рд╕рд╛рдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╣рд░ рдкреИрдХреЗрдЬ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдХрдИ package.json
рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд░рдЦрдирд╛ рдпрд╛ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдХрд╖реНрдЯрдкреНрд░рдж рдерд╛ред рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд╡рд┐рднрд╛рдЧреЛрдВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ Lerna рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рдЙрдард╛рдПрдЧрд╛ рдФрд░ Firebase рдЕрдкрд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЖрдкрдХреЛ рд╕рд┐рдВрдЧрд▓ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рд╕рд┐рдореНрд▓рд┐рдВрдХреНрдб рдбрд┐рдк рд╕рдкреЛрд░реНрдЯ рджреЗрдЧрд╛редjson!
рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди
{
"name": "@your-package-name/functions",
"version": "0.1.0",
"scripts": {
"build": "webpack"
},
"engines": {
"node": "10"
},
"main": "dist/index.js",
"dependencies": {
"firebase-admin": "^8.10.0",
"firebase-functions": "^3.6.1"
},
"optionalDependencies": {
"@your-package-name/shared": "^0.1.0",
"@your-package-name/utils": "^0.1.0"
}
}
webpack.config.js
const path = require('path')
// The cost of being fancy I suppose
// https://github.com/firebase/firebase-tools/issues/653
module.exports = {
target: 'node',
mode: 'production',
entry: './src/index.ts',
module: {
rules: [
{
test: /\.tsx?$/,
loader: 'ts-loader',
exclude: /node_modules/,
options: {
configFile: 'tsconfig.build.json',
},
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js', '.json'],
},
output: {
filename: 'index.js',
path: path.resolve(__dirname, 'dist'),
libraryTarget: 'commonjs',
},
externals: {
'firebase-admin': 'firebase-admin',
'firebase-functions': 'firebase-functions',
},
}
firebase.json
{
"firestore": {
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
},
"functions": {
"source": "packages/functions"
},
"emulators": {
"functions": {
"port": 5476
},
"firestore": {
"port": 4565
},
"ui": {
"enabled": true
}
}
}
рдореИрдВ рдпрд╛рд░реНрди рд╡рд░реНрдХрд╕реНрдкреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдиреНрдп рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдкреИрдХреЗрдЬ рдирд╛рдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдФрд░ рд╡рд░реНрд╕реЗрд▓ рджреЛрдиреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдкреИрдХреЗрдЬ рдореЗрдВ рдмрд╕ рдпрд╣ рдорд╛рдирдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред рдЬреЗрд╕рди:
"workspaces": {
"packages": [
"packages/*"
]
},
рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ /packages/* рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ package.json рд╣реЛрдиреЗ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдХреНрдпреЛрдВрдХрд┐ yarn upgrade-interactive
рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рдВрднрд╛рд▓ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреБрдЫ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рджрд╛рдпрд░реЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИред
---- рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ ----
рдореИрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЙрд╕рдХрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдВрдмрдВрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд░реНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рд╕рд╛рдЭрд╛ рдХреЛрдб рдХреЛ рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрдХреНрд╕реНрдЯ-рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓-рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдореИрдВ рдЗрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @ 0x80 рдФрд░ copy-webpack-plugin
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ generate-package-json-webpack-plugin
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдбрд┐рд╕реНрдЯ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдЬреЗрд╕рдиред рдпрд╣ рдореЗрд░реА рдирд┐рд░реНрднрд░рддрд╛ рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣ рдмрдВрдбрд▓ рдпрд╛ рдПрдХ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдкрд░рд┐рдгрд╛рдореА рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЬреЗрд╕рдиред
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕рд┐рдореНрд▓рд┐рдВрдХреНрдб рдореЛрдиреЛрд░реЗрдкреЛ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рдмрд╛рд╣рд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП webpack-node-externals
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдмрд╛рд╣рд░реА рд╕реЗрдЯ рднреА рдХрд┐рдП рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╛рдо рдЙрдкрд╕рд░реНрдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдЧреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рд╣рд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдкреИрдХреЗрдЬ @ 0x80 рдХреЗ рд▓рд┐рдП рд░реЗрдЧреЗрдХреНрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рднреА рдЬреЛрдбрд╝реЗ рд╣реИрдВред
рдпрд╣ рдореЗрд░рд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require("path");
const nodeExternals = require("webpack-node-externals");
const GeneratePackageJsonPlugin = require("generate-package-json-webpack-plugin");
const basePackage = {
name: "@project/functions",
version: "1.0.0",
main: "./index.js",
scripts: {
start: "yarn run shell"
},
engines: {
node: "12"
}
};
module.exports = {
target: "node",
mode: "production",
entry: "./src/index.ts",
devtool: "inline-source-map",
module: {
rules: [
{
test: /\.tsx?$/,
use: "ts-loader",
exclude: /node_modules/
}
]
},
resolve: {
extensions: [".tsx", ".ts", ".js", ".json"],
alias: {
"@": path.resolve(__dirname, "src"),
"@root": path.resolve(__dirname, "./"),
"@types": path.resolve(__dirname, "src/@types"),
"@utils": path.resolve(__dirname, "src/utils")
}
},
output: {
filename: "index.js",
path: path.resolve(__dirname, "dist"),
libraryTarget: "commonjs"
},
externals: [
/^firebase.+$/,
/^@google.+$/,
nodeExternals({
allowlist: [/^@project/]
})
],
plugins: [new GeneratePackageJsonPlugin(basePackage)]
};
рдХреЛрдб рдХреЛ рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреВрд╕рд░рд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдВрддрддрдГ рдореЙрдбреНрдпреВрд▓ рдЙрдкрдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ :)
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЗрд╕ рдкрд░ +1, рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЕрдиреНрдп рдРрдкреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб (рдЬреИрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕) рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ (рдЬреИрд╕реЗ рд▓рд░реНрдирд╛) рдпрд╛ рд╕реАрдзреЗ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдореИрдВрдиреЗ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд▓рд┐рдпрд╛ рдФрд░ рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ред рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ: рдореИрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд┐рдпрд╛:
```
| - .firebaserc
| - firebase.json
| -...
| - рд╕реНрд░реЛрдд/
| - рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди
| - рдкреВрд░реНрд╡-рддреИрдирд╛рддреА.рдЬреЗрдПрд╕
| - рдкреЛрд╕реНрдЯ-рддреИрдирд╛рддреА.рдЬреЗрдПрд╕
| - ....
| - рд╕реНрд░реЛрдд/
| - рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди
| - ....
рдХреЙрдиреНрд╕реНрдЯ рдПрдлрдПрд╕ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("рдПрдлрдПрд╕-рдЕрддрд┐рд░рд┐рдХреНрдд");
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдЬрд╕рдирдкрд╛рде = "./package.json";
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдЬрд╕рди = рдЖрд╡рд╢реНрдпрдХрддрд╛ (рдкреИрдХреЗрдЬрдЬрд╕рдирдкрд╛рде);
(рдПрд╕рд┐рдВрдХ () => {
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ fs.remove(
./shared
);рдкреНрд░рддреАрдХреНрд╖рд╛ fs.copy(
../shared
,./shared
);}) ();
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдЬрд╕рдирдкрд╛рде = "./package.json";
рдХреЙрдиреНрд╕реНрдЯ рдкреИрдХреЗрдЬрдЬрд╕рди = рдЖрд╡рд╢реНрдпрдХрддрд╛ (рдкреИрдХреЗрдЬрдЬреЗрд╕рдирдкрд╛рде);
рдХреЙрдиреНрд╕реНрдЯ рдПрдлрдПрд╕ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("рдПрдлрдПрд╕-рдЕрддрд┐рд░рд┐рдХреНрдд");
(рдПрд╕рд┐рдВрдХ () => {
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ fs.remove (
./shared
);}) ();
"рдлрд╝рдВрдХреНрд╢рдВрд╕": {
"рд╕реНрд░реЛрдд": "рдХрд╛рд░реНрдп",
"рдкреВрд░реНрд╡-рддреИрдирд╛рддреА": [
"npm --prefix "$RESOURCE_DIR" рдкреВрд░реНрд╡-рддреИрдирд╛рддреА рдЪрд▓рд╛рдПрдВ"
],
"рддреИрдирд╛рддреА рдХреЗ рдмрд╛рдж": [
"npm --prefix "$RESOURCE_DIR" рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рдмрд╛рдж рдЪрд▓рд╛рдПрдБ"
]
},
```
рдпрджрд┐ рдЖрдк рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ
dist
рдпрд╛lib
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рдЕрдм рдЖрдкрдХреЗ рджреЛ рднрд╛рдИ-рдмрд╣рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП: рдХрд╛рд░реНрдп рдФрд░ рд╕рд╛рдЭрд╛ (рдпрд╣ рд╕рд╛рдЭрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ)ред рддреИрдирд╛рддреА рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПlib/functions/src/index.js
рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПpackage.json
main
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВредрдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдЯреВрд▓реНрд╕ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП