Firebase-tools: рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдореЗрдВ рдореЛрдиреЛ-рд░реЗрдкреЛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 31 рдЬрдире░ 2018  ┬╖  47рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: firebase/firebase-tools

рджреЗрдЦреЗрдВ: https://github.com/firebase/firebase-functions/issues/172

рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдирдХрд╛рд░реА

3.17.3

рдкреНрд░рдЬрдирди рдХреЗ рдЪрд░рдг

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░

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

рдЗрд╕ рдкрд░ +1, рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЕрдиреНрдп рдРрдкреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб (рдЬреИрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕) рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ (рдЬреИрд╕реЗ рд▓рд░реНрдирд╛) рдпрд╛ рд╕реАрдзреЗ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдореИрдВрдиреЗ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд▓рд┐рдпрд╛ рдФрд░ рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ред рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ: рдореИрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд┐рдпрд╛:
```

  • рдЬрдбрд╝/
    | - .firebaserc
    | - firebase.json
    | -...
  • рдХрд╛рд░реНрдп/
    | - рд╕реНрд░реЛрдд/
    | - рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди
    | - рдкреВрд░реНрд╡-рддреИрдирд╛рддреА.рдЬреЗрдПрд╕
    | - рдкреЛрд╕реНрдЯ-рддреИрдирд╛рддреА.рдЬреЗрдПрд╕
    | - ....
  • рд╕рд╛рдЭрд╛/
    | - рд╕реНрд░реЛрдд/
    | - рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди
    | - ....
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 рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдЯреВрд▓реНрд╕ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд╕реЗрдЯрдЕрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╛рдиреА 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_ рдмрдирд╛рддрд╛ рд╣реИред
  • рд╕рднреА рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреАрдЖрдИрдЖрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ред
  • рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП tgz рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _package.json_ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 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, рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЕрдиреНрдп рдРрдкреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб (рдЬреИрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕) рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ (рдЬреИрд╕реЗ рд▓рд░реНрдирд╛) рдпрд╛ рд╕реАрдзреЗ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдореИрдВрдиреЗ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд▓рд┐рдпрд╛ рдФрд░ рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ред рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ: рдореИрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд┐рдпрд╛:
```

  • рдЬрдбрд╝/
    | - .firebaserc
    | - firebase.json
    | -...
  • рдХрд╛рд░реНрдп/
    | - рд╕реНрд░реЛрдд/
    | - рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди
    | - рдкреВрд░реНрд╡-рддреИрдирд╛рддреА.рдЬреЗрдПрд╕
    | - рдкреЛрд╕реНрдЯ-рддреИрдирд╛рддреА.рдЬреЗрдПрд╕
    | - ....
  • рд╕рд╛рдЭрд╛/
    | - рд╕реНрд░реЛрдд/
    | - рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди
    | - ....
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 рдмрдирд╛рддрд╛ рд╣реВрдВред
image

рдпрд╣рд╛рдБ 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)]
};

рдХреЛрдб рдХреЛ рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреВрд╕рд░рд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдВрддрддрдГ рдореЙрдбреНрдпреВрд▓ рдЙрдкрдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ :)

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

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

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

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

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

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

adam-remotesocial picture adam-remotesocial  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ