Firebase-tools: firebase serve-ํ•ซ ๋ฆฌ๋กœ๋”ฉ์ด ์•„๋‹Œ ์ „์šฉ ๊ธฐ๋Šฅ

์— ๋งŒ๋“  2018๋…„ 05์›” 01์ผ  ยท  43์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: firebase/firebase-tools

๋ฒ„์ „ ์ •๋ณด

firebase --version
3.18.4

ํ”Œ๋žซํผ ์ •๋ณด

Ubuntu 18.04 x64

์žฌํ˜„ ๋‹จ๊ณ„

  1. ์›์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” TypeScript๋กœ Firebase ํด๋ผ์šฐ๋“œ ํ•จ์ˆ˜ ํ”„๋กœ์ ํŠธ
  2. ์›์‚ฌ ๋นŒ๋“œ-์‹œ๊ณ„
  3. ๋ธŒ๋ผ์šฐ์ €์—์„œ HTTPS ๊ธฐ๋Šฅ๋ณด๊ธฐ
  4. ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ ์‘๋‹ต
  5. ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽ˜์ด์ง€ ์ƒˆ๋กœ ๊ณ ์นจ

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

๋ธŒ๋ผ์šฐ์ €์— ์—…๋ฐ์ดํŠธ ๋œ ์ฝ˜ํ…์ธ  ํ‘œ์‹œ

์‹ค์ œ ํ–‰๋™

ํŽ˜์ด์ง€๋Š” firebase serve ๋ช…๋ น์–ด๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„์— ๋งŒ โ€‹โ€‹์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. lib์˜ ์ถœ๋ ฅ์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Œ์„ โ€‹โ€‹ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

> 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 bug

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๊ธฐ์—์„œ ๋๋‚˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ 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 ์˜ ์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ ( lib )๋ฅผ๋ณด๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ดํ”„๋Š” ์‹ค์ œ๋กœ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  43 ๋Œ“๊ธ€

๋ฐฉ๊ธˆ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ (firebase init)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ (Debian Stretch)์—์„œ ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ์œผ๋ฉฐ hello world ํ•จ์ˆ˜์—์„œ๋„ ๋™์ผํ•œ ์ผ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ์ œ๊ณต ํ•  ์ค€๋น„๊ฐ€ ๋œ ํ›„ ํ•œ ๋ฒˆ ํ•ซ ๋ฆฌ๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ ํ•œ ๋‹ค์Œ ๋‹ค์‹œ ์ž‘๋™์„ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

Mac๊ณผ Linux ์ปดํ“จํ„ฐ์—์„œ ์ƒˆ ํ”„๋กœ์ ํŠธ (firebase init)๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ Linux๊ฐ€ ์•„๋‹Œ Mac์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ํ–ˆ๊ณ  JavaScript์—์„œ hello world ์˜ˆ์ œ๋ฅผ ํ•ซ ๋ฆฌ๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ TypeScript ์˜ˆ์ œ๋Š” ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. firebase serve ๋Š”`firebase.json์— ๊ตฌ์„ฑ๋œ ๋””๋ ‰ํ† ๋ฆฌ์˜ index.js ๋งŒ ๊ฐ์‹œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

TypeScript์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ๋กœ๋“œํ•˜๋ ค๋ฉด (๊ทธ๋ฆฌ๊ณ  index.js ์ด์ƒ์ด์žˆ๋Š” ๋” ๋ณต์žกํ•œ JavaScript ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค) Webpack์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ํŒŒ์ผ functions/lib/index.js ์„ (๋ฅผ) ์ถœ๋ ฅํ•˜๊ณ  Firebase๊ฐ€ ๋‚ด 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 functions / package.json์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ? 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. helloWorld ํ•จ์ˆ˜์˜ ์ฃผ์„ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.
  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์„ ๋ฐฉ๋ฌธํ•˜๋ฉด hello world ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. handler.ts์˜ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜ ๋œ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ firebase serve ๋ช…๋ น์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ "source": "functions/lib" ์— firebase.json ๋‹น์‹ ์ด ๋ฌด์—‡์ด๋“  ๋ณ€๊ฒฝํ•˜๋ฉด ์ฝ”๋“œ ๋œจ๊ฑฐ์šด ์žฌ ์žฅ์ „์„ functions/lib ๋‹ค์‹œ๋กœ๋“œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์ง€๋งŒ ๋””๋ ‰ํ† ๋ฆฌ ๋ ˆ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. touch lib/injex.js ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋‹ค์‹œ๋กœ๋“œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด src/index.ts ์—์„œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค์‹œ๋กœ๋“œ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€๋งŒ src/handlers/helloworld.ts ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@laurenzlong ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ๊ฐ€์ง„ ์ตœ๊ณ ๋Š” ( touch lib/index.js ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” firebase deploy ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

firebase.json

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

functions / 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 Linux์—์„œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์ œ ํ•  ์ˆ˜์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/safarmer/firebase-functions

์žฌํ˜„ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‹ค์Œ ์ฃผ์— ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ :)
๋‚˜์—๊ฒŒ firebase serve ๋Š” ํ˜„์žฌ Typescript๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...

์š”์ฒญํ•œ ํŒŒ์ผ์„ @safarmer๊ฐ€ ๋ณด๋‚ธ ํŒŒ์ผ๊ณผ ๋น„๊ตํ–ˆ์œผ๋ฉฐ ๋™์ผํ•œ ๊ตฌ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด TypeScript์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ณต์‹ ๊ตฌ์„ฑ์ด๋ฏ€๋กœ ๋†€๋ž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” firebase serve ํ•จ์ˆ˜ "source"๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ˆ˜์‹ ํ•˜์ง€ ์•Š๊ณ  firebase.json ์ •์˜ ๋œ ๋ฐฐํฌ ์ „ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :๋””

Ahh ๋ฐ firebase ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์‚ฌ์ „ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ด๋ฏ€๋กœ ํ…Œ์ŠคํŠธ์—์„œ tslint ์˜ˆ๋ฅผ ๋“ค์–ด ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. :)

@IchordeDionysos ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด TypeScript๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JavaScript์˜ ์˜ˆ์ œ์™€ ๋˜‘๊ฐ™์€ ์ผ์„ํ•˜๋ ค๊ณ ํ–ˆ๋Š”๋ฐ ๋˜‘๊ฐ™์€ ์ผ์„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์„œ๋ฒ„๊ฐ€ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ง„์ž… ์  ๋งŒ๋ณด๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์–ด๋ฒ ์ด์Šค ํŒ€์ด ๊ณง์ด ๋ฌธ์ œ๋ฅผ ๋ฐํž ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@laurenzlong ์ˆ˜๋™์œผ๋กœ @tstirrat ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค)

์ž์„ธํ•œ ์žฌํ˜„ @safarmer ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ์›์ธ์„ ์ถ”์ ํ•˜๊ณ  https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/207์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค

์—ฌ๊ธฐ์— ์˜ค๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด npm ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹Œ ์†Œ์Šค ๋˜๋Š” Linuxbrew ์—์„œ watchman ์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.

@laurenzlong Windows์—์„œ์ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํŠนํžˆ index.ts ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ tsc๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฐ์ง€๋˜๊ณ  ๊ธฐ๋Šฅ์ด ๋‹ค์‹œ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์ฐธ๊ณ  : ๋•Œ๋•Œ๋กœ ts์—์„œ info: Worker for helloWorld closed due to file changes. ๊ฐ€ ๊ฐ์ง€๋˜์ง€๋งŒ lib๋Š” ์ƒˆ๋กœ ๊ณ ์ณ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์ „ํ˜€ ๊ฐ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. tsc๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ํ•ญ์ƒ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

@tstirrat ์ง€์นจ ์— ๋”ฐ๋ผ Windows์— ๊ฒฝ๋น„์›์„ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Watchman์„ ์„ค์น˜ํ•  ๋•Œ ํŠน๋ณ„ํžˆ ์–ด๋–ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

๊ฐ์‹œ์›์„ ์„ค์น˜ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋น™ ๊ธฐ๋Šฅ์€ ๋œจ๊ฒ์ง€ ์•Š์Šต๋‹ˆ๋‹ค
์ƒˆ๋กœ ๊ณ ์นจ. ๋‚˜๋Š” ๋งค ๋ณ€๊ฒฝ ํ›„์— ๋ด‰์‚ฌ๋ฅผ ์ค‘๋‹จํ•˜๊ณ , ๊ฑด์ถ•ํ•˜๊ณ , ๋‹ค์‹œ ๋ด‰์‚ฌํ•ด์•ผํ•œ๋‹ค.

2018 ๋…„ 11 ์›” 21 ์ผ ์ˆ˜์š”์ผ ์˜ค์ „ 1:01 Kevin Jian [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Watchman์„ ์„ค์น˜ํ•  ๋•Œ ํŠน๋ณ„ํžˆ ์–ด๋–ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

โ€”
๋Œ“๊ธ€์„ ๋‹ฌ์•˜ ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/firebase/firebase-tools/issues/758#issuecomment-440460196 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AHgHbeA_iECsIMH3V9P7NQypsmudF_IQks5uxInggaJpZM4Tta12
.

Windows์—์„œ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์—ฌ๋Ÿฌ ๋ณด๊ณ ์„œ๋กœ ์ธํ•ด ๋‹ค์‹œ ์—ด๊ธฐ

Node.js v10.15.0์„ ์‚ฌ์šฉํ•˜๋Š” Ubuntu 18.04์—์„œ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ฌธ์ œ๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ƒ์„ธํ•œ ๋ณด๊ณ ์„œ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. @afuggini ํ•ด๋‹น ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด 404๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ณต๊ฐœ๋ณด๊ธฐ๋ฅผ ์œ„ํ•ด ํ•ด๋‹น ์ €์žฅ์†Œ์— ๊ถŒํ•œ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์™€ ์œ ์‚ฌํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/firebase/firebase-tools/issues/1022. ์ด ๋ฌธ์ œ๊ฐ€ Typescript๋กœ ๋กœ์ปฌ ๊ฐœ๋ฐœ์— ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๋‹ค๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ์ถ”์ ๊ธฐ์— ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค : 123266946.์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š”์‹œ๊ธฐ๋ฅผ ์•ฝ์† ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ถ”์ ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. PR์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

์ด ์˜ค๋ฅ˜๋„ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค ์ˆ˜ ์—†์—ˆ์œผ๋ฏ€๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@ondratra ๋Š” ํ˜„์žฌ CLI ๋ฒ„์ „, OS ํ”Œ๋žซํผ์„ ์ œ๊ณตํ•˜๊ณ  npm ์ด์™ธ์˜ ๋‹ค๋ฅธ ์ž‘์—…์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ (์˜ˆ : yarn )?

@bkendall ์ €๋Š” Debian (sid)์— ์žˆ์Šต๋‹ˆ๋‹ค. Typescript ์†Œ์Šค ํŒŒ์ผ์€ tsc -w ๋ฅผ ํ†ตํ•ด ๊ฐ์‹œ ๋ฐ ์ปดํŒŒ์ผ๋˜๊ณ  + ํ•จ์ˆ˜๋Š” firebase --only functions serve ๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. package.json ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
Node.js ์ถœ๋ ฅ ํŒŒ์ผ {"main": "dist/src/index.js", ...} . tsc-watch ํŒจํ‚ค์ง€์™€ ๋ช…์‹œ ์ ์œผ๋กœ touch ์ธ๋ฑ์Šค ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

$ firebase --version
6.3.1

์—ฌ๋Ÿฌ๋ถ„, ์ด์ „ ๋Œ“๊ธ€์„ ํ™•์ธํ•˜์„ธ์š”. ์ด ๋ฌธ์ œ๋Š” cloud-functions-emulator ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Linux์—์„œ ์•Œ๋ ค์ง„ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” fs watch ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ firebase-tools. ์—์„œ ์ง์ ‘ ์†”๋ฃจ์…˜์„ ๊ธฐ๋Œ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

@ribizli thx, ๋‹น์‹ ์ด ๊ณต์œ  ํ•œ ๋งํฌ ๋Š” ํ™•์‹คํžˆ ๋ฌธ์ œ์˜ ๋ณธ์งˆ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ๊ฐ์‹œํ•˜๊ณ  firebase๋ฅผ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ๋กœ๋“œ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@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, "firebase serve"์ž๋™ ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•

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, { ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

Firebase๋ฅผ typescript์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ„๋„์˜ ํ„ฐ๋ฏธ๋„ ( npm run build ์˜ ์‹œ๊ณ„ ๋ณ€ํ˜•)์—์„œ tsc -w ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ์•„ ์ฐจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์„ค์น˜ ํ•œ ๊ฒฝ์šฐ firebase ์„ธ๊ณ„๋ฅผ, ๋‹น์‹ ์€๋กœ ์ด๋™ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ cd $(npm root -g)/firebase-tools/node_modules/@google-cloud .

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„-

์ด ๋ฒ„๊ทธ๋Š” ๋ ˆ๊ฑฐ์‹œ Cloud Functions ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ํ•ซ ๋ฆฌ๋กœ๋”ฉ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›” '19 ๊ธฐ์ค€์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” google-cloud/functions-emulator ์— firebase-tools ์ด ๋ฒ„๊ทธ์˜ ์„ฑ๊ฒฉ์„ ๋ณ€๊ฒฝ ๊ทธ๋ž˜์„œ (๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด ์ž์—ฐ ๋ฏฟ์Šต๋‹ˆ๋‹ค).

์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•˜๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋‚ธ ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ ๋“œ๋ฆฌ๋ฉฐ, ๋งˆ์ง€๋ง‰์œผ๋กœ firebase serve ์™€ ๋ณ„๋„๋กœ watcher (์˜ˆ tsc -w )๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ•œ ์ƒˆ๋กœ์šด ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ํŠธ๋žœ์Šค ํŒŒ์ผ ๋œ ์–ธ์–ด๋ฅผ ํ•ซ ๋ฆฌ๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. .

์ƒˆ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์œผ๋ฉฐ ์ด์ œ์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์˜ค๋ž˜๋˜์—ˆ์œผ๋ฏ€๋กœ ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ซ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜๋„ํ•˜์ง€ ์•Š์€ ๋™์ž‘์ด ๊ณ„์† ๋‚˜ํƒ€๋‚˜๋ฉด ์ƒˆ ๋ฒ„๊ทธ๋ฅผ์—ฌ์‹ญ์‹œ์˜ค.

๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๊ธฐ์—์„œ ๋๋‚˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ 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 ์˜ ์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ ( 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 ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์‹œ๊ณ„๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

@ rami-alloush๋„ ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์›Œํฌ ํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค. ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜์ง€ ์•Š์ง€๋งŒ ๋นŒ๋“œ ๋œ ์ฝ”๋“œ๋ฅผ ํ•ซ ๋ฆฌ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฒ„์ „

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

์ด๊ฒƒ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์กฐ์šฉํžˆ tsc ์‹คํ–‰๋˜๋ฏ€๋กœ ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์žฌํ˜„ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‹ค์Œ ์ฃผ์— ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋งž๋‚˜์š”?

typescript์™€ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜์—ฌ ํ•ซ ๋ฆฌ๋กœ๋”ฉ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ผ ... ํ•ซ ๋ฆฌ๋กœ๋”ฉ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ „ํ˜€ ์ธ์‹ํ•˜๋„๋กํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค ...

@oluckyman์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ฃผ ์ข‹์•„

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

[์—…๋ฐ์ดํŠธ ๋จ]

  • 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

์ด๊ฒƒ์€ typescript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ firebase-tools ๋ฒ„์ „ 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 ๋“ฑ๊ธ‰