Firebase-tools: firebase рд╕рд░реНрд╡ - рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд╣реАрдВ рд╣реЙрдЯ рд░реАрд▓реЛрдбрд┐рдВрдЧ

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

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

рдлрд╛рдпрд░рдмреЗрд╕ - рд╡рд┐рд╕рд░реНрдЬрди
3.18.4

рдордВрдЪ рдХреА рдЬрд╛рдирдХрд╛рд░реА

рдЙрдмрдВрдЯреВ 18.04 x64

рдкреНрд░рдЬрдирди рдХрд░рдиреЗ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛

  1. рдпрд╛рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдлрд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ
  2. рдпрд╛рд░реНрди рдмрд┐рд▓реНрдб - рд╡реЙрдЪ
  3. рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ HTTPS рдлрд╝рдВрдХреНрд╢рди рджреЗрдЦреЗрдВ
  4. рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ
  5. рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреЗрдЬ рдХреЛ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░реЗрдВ

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

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдкрдбреЗрдЯ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ

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

рдкреГрд╖реНрда рдХреЗрд╡рд▓ рдлрд╛рдпрд░рдмреЗрд╕ рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреБрд╖реНрдЯрд┐ рдХреА рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд╛рдж рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

> firebase serve --only functions --debug                                                                                                                                                             [17:29:27]
[2018-05-01T00:29:30.975Z] ----------------------------------------------------------------------
[2018-05-01T00:29:30.978Z] Command:       /home/shane/.nvm/versions/node/v6.11.5/bin/node /home/shane/.yarn/bin/firebase serve --only functions --debug
[2018-05-01T00:29:30.978Z] CLI Version:   3.18.4
[2018-05-01T00:29:30.979Z] Platform:      linux
[2018-05-01T00:29:30.979Z] Node Version:  v6.11.5
[2018-05-01T00:29:30.979Z] Time:          Mon Apr 30 2018 17:29:30 GMT-0700 (PDT)
[2018-05-01T00:29:30.979Z] ----------------------------------------------------------------------

[2018-05-01T00:29:30.986Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2018-05-01T00:29:30.986Z] > authorizing via signed-in user
[2018-05-01T00:29:30.988Z] >>> HTTP REQUEST GET https://admin.firebase.com/v1/projects/nativ-dev  

 Mon Apr 30 2018 17:29:30 GMT-0700 (PDT)
[2018-05-01T00:29:31.433Z] <<< HTTP RESPONSE 200 server=nginx, date=Tue, 01 May 2018 00:29:31 GMT, content-type=application/json; charset=utf-8, content-length=128, connection=close, x-content-type-options=nosniff, strict-transport-security=max-age=31536000; includeSubdomains, cache-control=no-cache, no-store
[2018-05-01T00:29:31.437Z] >>> HTTP REQUEST GET https://admin.firebase.com/v1/database/nativ-dev/tokens  

 Mon Apr 30 2018 17:29:31 GMT-0700 (PDT)
[2018-05-01T00:29:31.926Z] <<< HTTP RESPONSE 200 server=nginx, date=Tue, 01 May 2018 00:29:31 GMT, content-type=application/json; charset=utf-8, content-length=256, connection=close, x-content-type-options=nosniff, strict-transport-security=max-age=31536000; includeSubdomains, cache-control=no-cache, no-store
[2018-05-01T00:29:31.927Z] >>> HTTP REQUEST GET https://cloudresourcemanager.googleapis.com/v1/projects/nativ-dev  

 Mon Apr 30 2018 17:29:31 GMT-0700 (PDT)
[2018-05-01T00:29:32.335Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Tue, 01 May 2018 00:29:32 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=hq=":443"; ma=2592000; quic=51303433; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="43,42,41,39,35", accept-ranges=none, connection=close

=== Serving from '/home/shane/source/firebase'...

i  functions: Preparing to emulate functions.
[2018-05-01T00:29:32.733Z] Fetching environment
[2018-05-01T00:29:32.736Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/766196581577:getServerAppConfig

 Mon Apr 30 2018 17:29:32 GMT-0700 (PDT)
[2018-05-01T00:29:33.255Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Tue, 01 May 2018 00:29:33 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=hq=":443"; ma=2592000; quic=51303433; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="43,42,41,39,35", accept-ranges=none, connection=close
[2018-05-01T00:29:33.256Z] Starting @google-cloud/functions-emulator
[2018-05-01T00:29:34.318Z] Parsing function triggers
i  functions: No HTTPS functions found. Use firebase functions:shell if you would like to emulate other types of functions.
i  functions: No HTTPS functions found. Use firebase functions:shell if you would like to emulate other types of functions.
тЬФ  functions: createCustomerOnCall: http://localhost:5000/nativ-dev/us-central1/createCustomerOnCall
тЬФ  functions: createCustomerHttps: http://localhost:5000/nativ-dev/us-central1/createCustomerHttps
info: User function triggered, starting execution
info: Execution took 19 ms, user function completed successfully
info: User function triggered, starting execution
info: Execution took 1 ms, user function completed successfully

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

рдпрджрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдпрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдБ functions/package.json рдЗрд╕рд▓рд┐рдП tsc -w firebase serve рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ:

{
  "name": "functions",
  "scripts": {
...
    "serve": "tsc -w | firebase serve --only functions",
...
  },

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, tsc -w рдЪрд▓рд╛рдПрдВ рдФрд░ firebase serve рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкрд╛рдЗрдк рдХрд░реЗрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкрд╛рдЗрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рднреЗрдЬрддрд╛ рд╣реИ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╕реНрд░реЛрдд рдмрджрд▓рддрд╛ рд╣реИ, tsc рдлрд┐рд░ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ firebase serve tsc 's рдЖрдЙрдЯрдкреБрдЯ рдбрд╛рдпрд░ ( lib ) рджреЗрдЦ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреБрдирдГ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред рддреЛ рдкрд╛рдЗрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╣реА рд╣реИред

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

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

рдореИрдВрдиреЗ рдореИрдХ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдорд╢реАрди рдкрд░ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдлрд╛рдпрд░рдмреЗрд╕ рдЗрдирд┐рдЯ) рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдпрд╣ рдореИрдХ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рди рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдкрд░ред

рдореИрдВрдиреЗ рдХреБрдЫ рдкреНрд░рдпреЛрдЧ рдХрд┐рдП рдФрд░ рдореБрдЭреЗ рдЧрд░реНрдо рдкреБрдирдГ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реИрд▓реЛ рджреБрдирд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ firebase serve рдХреЗрд╡рд▓ index.js рдХреЛ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдореЗрдВ `firebase.json рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реИред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░ рдореИрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдЖрдЙрдЯ рдорд╛рдирддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ index.js ) рдореБрдЭреЗ рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рдлрд╝рд╛рдЗрд▓ functions/lib/index.js рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдпрд░рдмреЗрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛрдб functions/list ред рдпрд╣ рддрдм рджреЛрдиреЛрдВ firebase functions:shell рдФрд░ firebase serve рд▓рд┐рдП рдЧрд░реНрдо рдкреБрдирдГ рд▓реЛрдб рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдЬрдм рдореИрдВ tsc ( firebase init рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдХреЛрдб рдХреЗрд╡рд▓ рддрднреА рдкреБрдирдГ рд▓реЛрдб рд╣реЛрдЧрд╛ рдЬрдм рдореИрдВрдиреЗ рдкрд░рд┐рдгрд╛рдореА index.js рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ред рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ webpack --watch рдХреЛ firebase serve --only functions рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдореБрдЭреЗ рдЕрдм рдЧрд░реНрдо рдкреБрдирдГ рд▓реЛрдб рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореИрдВ firebase init рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВред

рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ firebase.json

{    
  "functions": {
    "predeploy": "npm --prefix functions run build",
    "source": "functions/list"
  }
}

@safarmer рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ / main рдлрд╝реАрд▓реНрдб рд╣реИ?

рдореИрдВрдиреЗ firebase init рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc --project tsconfig.json",
    "serve": "yarn run build && firebase serve --only functions",
    "shell": "yarn run build && firebase functions:shell",
    "start": "yarn run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "main": "lib/index.js",
  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  },
  "private": true
}

рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рд╣реИ:

  1. firebase init && cd functions && yarn
  2. рд╣реЗрд▓реЛрд╡рд░реНрд▓реНрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░реЗрдВ
  3. mkdir src/handlers && mv src/index.ts src/handlers/helloworld.ts
  4. echo "export * from './handlers/helloworld';" > src/index.ts
  5. рдЯрд░реНрдорд┐рдирд▓ 1 рдореЗрдВ: yarn build --watch
  6. рдЯрд░реНрдорд┐рдирд▓ 2 рдореЗрдВ: firebase serve --only functions

рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ URL рджреЗрдЦрдиреЗ рдкрд░, рдЖрдкрдХреЛ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╣реИрдВрдбрд▓рд░ рд╕реЗ рд▓реМрдЯреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ firebase serve рдХрдорд╛рдВрдб рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реИред

рдпрджрд┐ рдЖрдк functions/lib рдореЗрдВ рдХреБрдЫ рднреА рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ "source": "functions/lib" firebase.json рдХреЛрдб рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдирд┐рдореНрди рд▓реАрд╡рд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреБрдирдГ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП touch lib/injex.js рдЪрд▓рд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, src/index.ts рдЯреНрд░рд┐рдЧрд░ рдореЗрдВ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░рдирд╛, рд▓реЗрдХрд┐рди src/handlers/helloworld.ts рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ @laurenzlong (рдлрд╛рдпрд░рдмреЗрд╕ рдЗрдирд┐рдЯ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛) рдиреАрдЪреЗ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдЕрднреА рднреА touch lib/index.js рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде Antoher рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ firebase deploy рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

firebase.json

{
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint",
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ],
    "source": "functions/lib"
  }
}

рдХрд╛рд░реНрдп / package.json

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "main": "lib/index.js",
  "dependencies": {
    "firebase-admin": "~5.12.0",
    "firebase-functions": "^1.0.1"
  },
  "devDependencies": {
    "tslint": "^5.8.0",
    "typescript": "^2.5.3"
  },
  "private": true
}

@laurenzlong рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдЖрдк рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ
https://github.com/safarmer/firebase-functions

рд░реЗрдкреНрд░реЛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдЕрдЧрд▓реЗ рд╣рдлреНрддреЗ рджреЗрдЦреВрдВрдЧрд╛ред

рдпрд╣рд╛рдБ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ :)
рдореЗрд░реЗ рд▓рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ firebase serve рдЕрдм рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ ...

рдореИрдВрдиреЗ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдиреЗ @safarmer рдХреЗ рд╕рд╛рде рднреЗрдЬрд╛ рдерд╛ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ firebase serve рдХрд╛рд░реНрдп "рд╕реНрд░реЛрдд" рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╕реБрди рд░рд╣рд╛ рд╣реИ рдФрд░ firebase.json рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреВрд░реНрд╡-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдЪрд▓рд╛рдПрдЧрд╛ред

рдпрд╣ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рддреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред : рдбреА

рдЖрд╣ рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореИрдВ рдлрд╛рдпрд░рдмреЗрд╕ рдХреА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдкреВрд░реНрд╡-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ tslint рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рджреЗрдирд╛ рд╣реЛрдЧрд╛ :)

@IchordeDionysos рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИред рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдРрд╕рд╛ рд╣реА рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╣реИ рдЬреЛ рдПрдВрдЯреНрд░реАрдкреЙрдЗрдВрдЯ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ, рдмрд╛рдХреА рдХреЛрдб рдХреЛ рдирд╣реАрдВред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдЯреАрдо рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓ рд╕рдХрддреА рд╣реИред

рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЪреМрдХреАрджрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ @laurenzlong рдЪреАрдЬреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ (рдзрдиреНрдпрд╡рд╛рдж @ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡)

рд╡рд┐рд╕реНрддреГрдд repro @safarmer рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреАред рдореИрдВ рдореБрджреНрджреЗ рдХреА рдЬрдбрд╝ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдФрд░ https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/207 рджрд╛рдпрд░ рдХрд┐рдпрд╛

рдпрд╣рд╛рдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕реНрд░реЛрдд рдпрд╛ Linuxbrew рд╕реЗ watchman рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рди рдХрд┐ npm рдкреИрдХреЗрдЬ

@laurenzlong I рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ index.ts рдореЗрдВ рдкреБрди: рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ tsc рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдБред рддрдм рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкреБрдирдГ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдореБрдЭреЗ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП?

рддреНрд╡рд░рд┐рдд рдиреЛрдЯ: рдХрднреА-рдХрднреА info: Worker for helloWorld closed due to file changes. ts рдкрд░ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди lib isnt рддрд╛рдЬрд╝рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрдиреНрдп рдмрд╛рд░ рдЗрд╕рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ред рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЪрд▓ рд░рд╣рд╛ tsc рд╣рдореЗрд╢рд╛ рдлрдВрдХреНрд╢рди рдХреЛ рд░реАрд▓реЛрдб рдХрд░рддрд╛ рд╣реИред

@tstirrat рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдкрд░ рдЪреМрдХреАрджрд╛рд░ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рд▓рдЧрддрд╛

рдЪреМрдХреАрджрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЖрдк рдХрд┐рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рднрд╛рдЧ рд░рд╣реЗ рд╣реИрдВ?

рдЪреМрдХреАрджрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдп рдЧрд░реНрдо рдирд╣реАрдВ рд╣реИ
рдкреБрдирдГ рд▓реЛрдб рдХрд░реЗрдВред рдореБрдЭреЗ рд╣рд░ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рдж рдлрд┐рд░ рд╕реЗ рд╕реЗрд╡рд╛, рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╕реЗрд╡рд╛ рдХрд░рдирд╛ рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдмреБрдз рдкрд░, 21 рдирд╡рдВрдмрд░, 2018 рдХреЛ рджреЛрдкрд╣рд░ 1:01 рдмрдЬреЗ рдХреЗрд╡рд┐рди рдЬрд┐рдпрд╛рди рд╕реВрдЪрдирд╛рдПрдБ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдЪреМрдХреАрджрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЖрдк рдХрд┐рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рднрд╛рдЧ рд░рд╣реЗ рд╣реИрдВ?

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/firebase/firebase-tools/issues/758#issuecomment-44040010196 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AHgHbeA_iECsIMH3V9P7NQypsmudF_IQks5uxInggaJpZM4Tta12
ред

рдЗрд╕ рдХреА рдХрдИ рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХреЗ рдХрд╛рд░рдг рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рдЕрднреА рднреА рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдЕрднреА рднреА Ubuntu 18.04 рдкрд░ Node.js v10.15.0 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдореЗрд░рд╛ рдореБрджреНрджрд╛ рдПрдореБрд▓реЗрдЯрд░ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛:
https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196

рд╣рд╛рдп рд╕рдм, рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред @afuggini рдореБрдЭреЗ 404 рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬрдм рдореИрдВ рдЙрд╕ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдЬрдирддрд╛ рдХреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рд░реЗрдкреЛ рдкрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рдХреА рдЧрдИ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реИрдВ? рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рд╣реИ: https://github.com/firebase/firebase-tools/issues/1022ред рдореИрдВ рд╕реБрдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд░реНрдж рдмрд┐рдВрджреБ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрдВрддрд░рд┐рдХ рдЯреНрд░реИрдХрд░ рдореЗрдВ рдПрдХ рдмрдЧ рджрд░реНрдЬ рдХрд┐рдпрд╛ рд╣реИ: 123266946ред рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред PRs рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

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

@ondratra рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ рд╡рд░реНрддрдорд╛рди CLI рд╕рдВрд╕реНрдХрд░рдг, OS рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ npm (рдЙрджрд╛ yarn ) рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@bkendall рдореИрдВ рдбреЗрдмрд┐рдпрди (рд╕рд┐рдб) рдкрд░ рд╣реВрдВред рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рджреЗрдЦрд╛ рдФрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ tsc -w + рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрд╡рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ firebase --only functions serve ред package.json рдореЗрдВ рд╕рд╣реА рдкрде рд╣реИ
рдЬреЗ рдПрд╕ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ {"main": "dist/src/index.js", ...} ред рдореИрдВрдиреЗ tsc-watch рдкреИрдХреЗрдЬ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ touch рдЗрдВрдбреЗрдХреНрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдлрд▓рддрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред

$ firebase --version
6.3.1

рджреЛрд╕реНрддреЛрдВ, рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдореБрджреНрджрд╛ cloud-functions-emulator ред рдпрд╣ fs рд╡реЙрдЪ рдлреАрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдПрдХ рдЬреНрдЮрд╛рдд рдореБрджреНрджрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП firebase-tools. рд╕реЗ рд╕реАрдзреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЙрдореНрдореАрдж рди рдХрд░реЗрдВ

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

@ondratra рдХрд╛рдВрдЯрд╛ @google-cloud/functions-emulator , node-watch рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА рдЬреБрдбрд╝реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, npm link рдкреИрдХреЗрдЬред firebase-tools рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ: рдЗрд╕рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ @google-cloud/functions-emulator , рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдФрд░ рдЕрдВрдд рдореЗрдВ: рдЖрдк https://github.com/GoogleCloudPlatform/cloud-functions-emulator рдкрд░ PR рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЬрд▓реНрдж рд╣реА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЬрд╛рд░реА рдХрд░реЗрдВрдЧреЗред (рдореИрдВ рдЕрдкрдиреЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде рд░рд╣ рд╕рдХрддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпреЛрдЧрджрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛)

рдлрд╝рдВрдХреНрд╢рди -> index.js рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдСрдЯреЛрд░рди "рдлрд╛рдпрд░рдмреЗрд╕ рд╕рд░реНрд╡рд┐рд╕" рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

Https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196 рд╕реЗ рд╕рд╛рднрд╛рд░ (рдзрдиреНрдпрд╡рд╛рдж @dirkjot):

рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рдпрд╣рд╛рдБ рдкреВрд░реНрдг рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ рдФрд░ @ribizli рдХреЗ рдЫреЛрдЯреЗ рдЯрд╛рдЗрдкреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕:

  • рдЕрдкрдиреЗ @google-cloud рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ, рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЗ node_modules (рдлрд╛рдпрд░рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)
  • cd functions-emulator
  • рдиреЛрдб-рд╡реЙрдЪ рдЬреЛрдбрд╝реЗрдВ: npm install --save node-watch
  • рдлрд╝рд╛рдЗрд▓ src/supervisor/worker.js рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
  • рд▓рд╛рдЗрди 180 рдХреЗ рдЖрд╕рдкрд╛рд╕, рдЖрдкрдХреЛ fs.watch(localdir, { рдорд┐рд▓реЗрдВрдЧреЗред рдЗрд╕реЗ require('node-watch')(localdir, { рдмрджрд▓реЗрдВред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдлрд╛рдпрд░рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдмрд╕ рдПрдХ рдЕрд▓рдЧ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ tsc -w рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ ( npm run build рдХрд╛ рдШрдбрд╝реА рд╕рдВрд╕реНрдХрд░рдг)ред рдЕрдм рдореИрдВ рдЕрдкрдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдПрдореБрд▓реЗрдЯрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдиреЗ рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ firebase рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ cd $(npm root -g)/firebase-tools/node_modules/@google-cloud рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдХреЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рджреЛрд╕реНрддреЛрдВ -

рдпрд╣ рдмрдЧ рд▓реАрдЧреЗрд╕реА рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдореБрд▓реЗрдЯрд░ рдХреА рд╣реЙрдЯ-рд░реАрд▓реЛрдбрд┐рдВрдЧ рдХреНрд╖рдорддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдордИ '19 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдм рд╣рдо google-cloud/functions-emulator firebase-tools рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрдЧ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ (рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдирдИ рдкреНрд░рдХреГрддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдирд╣реАрдВ рд╣реИ)ред

рдореИрдВ рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЖрдЦрд┐рд░рдХрд╛рд░ рд╣рдорд╛рд░реЗ рдирдП рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рдХрд┐рд╕реА рднреА рдЯреНрд░рд╛рдВрд╕рдкреНрд▓реИрдб рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХреЛ рд╣реЙрдЯ-рд░реАрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрдм рддрдХ рдЖрдк рдЕрдкрдиреЗ рд╡реЙрдХрд░ (рдЬреИрд╕реЗ tsc -w ) firebase serve рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╣реАрдВ рдЪрд▓ рд░рд╣реЗ рд╣реЛрдВред ред

рдирдП рдПрдореБрд▓реЗрдЯрд░ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рд╣рдордиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрдм рдЗрд╕ рдереНрд░реЗрдб рдХреЗ рд╕рднреА рд╡рд░реНрдХрдЖрд░реНрдбрд░ рдкреБрд░рд╛рдиреЗ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдереНрд░реЗрдб рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдХреЛрдИ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдирдпрд╛ рдмрдЧ рдЦреЛрд▓реЗрдВред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!

рдпрджрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдпрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдБ functions/package.json рдЗрд╕рд▓рд┐рдП tsc -w firebase serve рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ:

{
  "name": "functions",
  "scripts": {
...
    "serve": "tsc -w | firebase serve --only functions",
...
  },

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, tsc -w рдЪрд▓рд╛рдПрдВ рдФрд░ firebase serve рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкрд╛рдЗрдк рдХрд░реЗрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкрд╛рдЗрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рднреЗрдЬрддрд╛ рд╣реИ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╕реНрд░реЛрдд рдмрджрд▓рддрд╛ рд╣реИ, tsc рдлрд┐рд░ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ firebase serve tsc 's рдЖрдЙрдЯрдкреБрдЯ рдбрд╛рдпрд░ ( lib ) рджреЗрдЦ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреБрдирдГ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред рддреЛ рдкрд╛рдЗрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╣реА рд╣реИред

рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛:

"build:watch": "tsc -w && cp src/*.json lib",
"serve": "firebase serve --only functions",
"start": "concurrently \"npm run build:watch\" \"npm run serve\"",

рдореЗрд░реЗ рд▓рд┐рдП [email protected] рд╣реЙрдЯ рд░реАрд▓реЛрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ build functions/package.json рдХреЛ tsc -w рд░реВрдк рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛

{
  "name": "functions",
  "scripts": {
   ...
      "build": "tsc -w",
   ...
  },

рдпрд╣ рдШрдбрд╝реА рдХреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░рдЦреЗрдЧрд╛ рдЬрдм рдореИрдВ npm run build , рддрдм another terminal рдореИрдВ firebase emulators:start рднрд╛рдЧрд╛ред

@ рд░рдореА- alloush рд╣реИ рдХрд┐ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдореИрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдПрдореБрд▓реЗрдЯрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╡реЗ рдирд┐рд░реНрдорд┐рдд рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг

{
    "build": "tsc -w &>/dev/null &",
    "shell": "npm run build && firebase functions:shell",
}

рдпрд╣ рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рд╢рд╛рдВрдд рдореЗрдВ tsc рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рджреВрд╕рд░реЗ рдЯрд░реНрдорд┐рдирд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд░реЗрдкреНрд░реЛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдЕрдЧрд▓реЗ рд╣рдлреНрддреЗ рджреЗрдЦреВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣?

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣реЙрдЯ-рд░реАрд▓реЛрдбрд┐рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╡рд╣реА ... рд╣реЙрдЯ рд░реАрд▓реЛрдбрд┐рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рддрд╛рдХрд┐ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рди рд╕рдХреЗрдВ ...

@oluckyman рдорд╕рд▓рд╛ рд╣рд▓ред рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛

https://github.com/firebase/firebase-tools/issues/758#issuecomment -61895252

[рдЕрдкрдбреЗрдЯ]

  • firebase-tools => 8.7.0

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

package.json

...
 "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc -w --preserveWatchOutput",
    "serve": "tsc && firebase emulators:exec --ui --only functions,firestore 'yarn build'",
    "shell": "yarn run build && firebase functions:shell",
    "start": "yarn run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
...

yarn serve рдЪрд▓рд╛рдПрдБ

рдбреЗрдореЛ

Aug-06-2020 14-05-38

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдлрд╛рдпрд░рдмреИрд╕-рдЯреВрд▓реНрд╕ рд╕рдВрд╕реНрдХрд░рдг 8.8.1 рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдордп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИред рдЯрд┐рдкреНрд╕ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдереИрдВрдХреНрдпреВ @moifort @garyo @safarmer @abeisgoat : 1st_place_medal:

"scripts": {
    ...
    ...
    "serve": "yarn build | firebase emulators:start --only functions",
    "build": "./node_modules/.bin/tslint --project tsconfig.json && ./node_modules/.bin/tsc --watch --preserveWatchOutput"
  },
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

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