Firebase-tools: ๊ธฐ๋Šฅ ๋ฐฐํฌ๊ฐ€ ๋งค์šฐ ๋Š๋ฆผ

์— ๋งŒ๋“  2017๋…„ 11์›” 14์ผ  ยท  94์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: firebase/firebase-tools

๋ฒ„์ „ ์ •๋ณด

3.15.0

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

๋‹จ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ๊ฐ„๋‹จํ•œ functions ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

exports.ping = functions.https.onRequest((req, res) => {
  res.status(200).send('pong');
}

์ด์ œ firebase deploy --only functions ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

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

๋” ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•˜์„ธ์š”. ์ด์ œ ์ž‘์€ ๊ธฐ๋Šฅ ํŒŒ์ผ์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํ˜ธ์ŠคํŒ… ์—…๋กœ๋“œ/๋ฐฐํฌ์™€ ๋น„๊ตํ•˜๋ฉด ๊ทธ ํŒŒ์ผ์€ ๋งค์šฐ ๋น ๋ฅด๊ณ  ํ•˜๋‚˜์˜ ํŒŒ์ผ๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ํ–‰๋™

์—…๋กœ๋“œ/๋ฐฐํฌํ•˜๋Š” ๋ฐ ๋งค์šฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. preparing functions directory for uploading... ๋‹จ๊ณ„์—์„œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

image

firebase deploy --only functions ์— ๋Œ€ํ•œ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ:
_์žฌ์ƒ ๋‹จ๊ณ„์—์„œ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๋™์ผํ•œ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋งŒ ์žˆ๋Š” ์ž‘์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค._

> firebase deploy --only functions --debug
[2017-11-14T10:03:55.799Z] ----------------------------------------------------------------------
[2017-11-14T10:03:55.804Z] Command:       C:\Program Files\nodejs\node.exe C:\Program Files\nodejs\node_modules\firebase-tools\bin\firebase deploy --only functions --debug
[2017-11-14T10:03:55.806Z] CLI Version:   3.15.0
[2017-11-14T10:03:55.806Z] Platform:      win32
[2017-11-14T10:03:55.806Z] Node Version:  v6.11.1
[2017-11-14T10:03:55.807Z] Time:          Tue Nov 14 2017 04:03:55 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:03:55.807Z] ----------------------------------------------------------------------

[2017-11-14T10:03:55.826Z] > 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"]
[2017-11-14T10:03:55.827Z] > authorizing via signed-in user
[2017-11-14T10:03:55.831Z] >>> HTTP REQUEST GET https://admin.firebase.com/v1/projects/marktec-itesm
 Tue Nov 14 2017 04:03:55 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:03:56.230Z] <<< HTTP RESPONSE 200 server=nginx, date=Tue, 14 Nov 2017 10:03:57 GMT, content-type=application/json; charset=utf-8, content-length=108, connection=close, x-content-type-options=nosniff, strict-transport-security=max-age=31536000; includeSubdomains, cache-control=no-cache, no-store
[2017-11-14T10:03:56.232Z] >>> HTTP REQUEST GET https://admin.firebase.com/v1/database/marktec-itesm/tokens
 Tue Nov 14 2017 04:03:56 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:03:56.622Z] <<< HTTP RESPONSE 200 server=nginx, date=Tue, 14 Nov 2017 10:03:57 GMT, content-type=application/json; charset=utf-8, content-length=262, connection=close, x-content-type-options=nosniff, strict-transport-security=max-age=31536000; includeSubdomains, cache-control=no-cache, no-store

=== Deploying to 'marktec-itesm'...

i  deploying functions
[2017-11-14T10:03:57.040Z] > [functions] package.json contents: {
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "serve": "firebase serve --only functions",
    "shell": "firebase experimental:functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "dependencies": {
    "firebase-admin": "~5.4.2",
    "firebase-functions": "^0.7.1"
  },
  "private": true
}
i  functions: ensuring necessary APIs are enabled...
i  runtimeconfig: ensuring necessary APIs are enabled...
[2017-11-14T10:03:57.043Z] >>> HTTP REQUEST GET https://servicemanagement.googleapis.com/v1/services/cloudfunctions.googleapis.com/projectSettings/marktec-itesm?view=CONSUMER_VIEW
 Tue Nov 14 2017 04:03:57 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:03:57.044Z] >>> HTTP REQUEST GET https://servicemanagement.googleapis.com/v1/services/runtimeconfig.googleapis.com/projectSettings/marktec-itesm?view=CONSUMER_VIEW
 Tue Nov 14 2017 04:03:57 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:03:57.479Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:03:58 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
+  functions: all necessary APIs are enabled
[2017-11-14T10:03:57.488Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:03:58 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
+  runtimeconfig: all necessary APIs are enabled
[2017-11-14T10:03:57.489Z] >>> HTTP REQUEST GET https://appengine.googleapis.com/v1/apps/marktec-itesm
 Tue Nov 14 2017 04:03:57 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:03:57.490Z] >>> HTTP REQUEST GET https://apikeys.googleapis.com/v1/projects/marktec-itesm/apiKeys
 Tue Nov 14 2017 04:03:57 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:03:57.775Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:03:58 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:03:57.950Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:03:58 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
i  functions: preparing functions directory for uploading...
[2017-11-14T10:05:52.258Z] >>> HTTP REQUEST GET https://runtimeconfig.googleapis.com/v1beta1/projects/marktec-itesm/configs
 Tue Nov 14 2017 04:05:52 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:05:52.676Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:05:53 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
i  functions: packaged functions (22.1 KB) for uploading
[2017-11-14T10:06:01.593Z] >>> HTTP REQUEST GET https://www.googleapis.com/storage/v1/b/staging.marktec-itesm.appspot.com
 Tue Nov 14 2017 04:06:01 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:01.940Z] <<< HTTP RESPONSE 200 x-guploader-uploadid=AEnB2UpSfip_C_K1wvCJaLNVW1q05_zW3D3fph0U7sYHr6_9M5InFI0Pi_X1VFc8B5PpbZImDdZiAaZZLqWXdl-JxdzedIZeExTeX4ifDbfvg7G8tsjPm1Y, etag=CAE=, vary=Origin, X-Origin, content-type=application/json; charset=UTF-8, expires=Tue, 14 Nov 2017 10:06:02 GMT, date=Tue, 14 Nov 2017 10:06:02 GMT, cache-control=private, max-age=0, must-revalidate, no-transform, content-length=548, server=UploadServer, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", connection=close
[2017-11-14T10:06:01.942Z] >>> HTTP REQUEST POST https://www.googleapis.com/upload/storage/v1/b/staging.marktec-itesm.appspot.com/o?uploadType=media&name=firebase-functions-source ReadStream {
  _readableState:
   ReadableState {
     objectMode: false,
     highWaterMark: 65536,
     buffer: BufferList { head: [Object], tail: [Object], length: 1 },
     length: 22627,
     pipes: null,
     pipesCount: 0,
     flowing: null,
     ended: true,
     endEmitted: false,
     reading: false,
     sync: false,
     needReadable: false,
     emittedReadable: true,
     readableListening: false,
     resumeScheduled: false,
     defaultEncoding: 'utf8',
     ranOut: false,
     awaitDrain: 0,
     readingMore: false,
     decoder: null,
     encoding: null },
  readable: true,
  domain: null,
  _events: { end: [Function] },
  _eventsCount: 1,
  _maxListeners: undefined,
  path: 'C:\\Users\\benja\\AppData\\Local\\Temp\\firebase-functions-69565Vb7CkPZp0rr.zip',
  fd: 6,
  flags: 'r',
  mode: 438,
  start: undefined,
  end: undefined,
  autoClose: true,
  pos: undefined,
  bytesRead: 22627 }
 Tue Nov 14 2017 04:06:01 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:02.601Z] <<< HTTP RESPONSE 200 x-guploader-uploadid=AEnB2UqV_ml27ZAt9W3ouCst97NUKPW4MeltDmxl06PA4sGBy6A8fqo0bAbEKHT0vokHMXo0t0yhOY0ve3XT0RrLjsiDwXyhwA, etag=CJPx8MbovdcCEAE=, vary=Origin, X-Origin, content-type=application/json; charset=UTF-8, cache-control=no-cache, no-store, max-age=0, must-revalidate, pragma=no-cache, expires=Mon, 01
Jan 1990 00:00:00 GMT, date=Tue, 14 Nov 2017 10:06:03 GMT, content-length=860, server=UploadServer, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", connection=close
+  functions: functions folder uploaded successfully
[2017-11-14T10:06:02.604Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/projects/marktec-itesm/locations/us-central1/functions
 Tue Nov 14 2017 04:06:02 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:02.845Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:03 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
i  functions: updating function verifyItesmDomain...
[2017-11-14T10:06:02.849Z] Trigger is:  resource=projects/marktec-itesm, eventType=providers/firebase.auth/eventTypes/user.create
[2017-11-14T10:06:02.851Z] >>> HTTP REQUEST PUT https://cloudfunctions.googleapis.com/v1beta2/projects/marktec-itesm/locations/us-central1/functions/verifyItesmDomain { sourceArchiveUrl: 'gs://staging.marktec-itesm.appspot.com/firebase-functions-source',
  name: 'projects/marktec-itesm/locations/us-central1/functions/verifyItesmDomain',
  entryPoint: 'verifyItesmDomain',
  timeout: '60s',
  availableMemoryMb: 256,
  labels: { 'deployment-tool': 'cli-firebase' },
  eventTrigger:
   { resource: 'projects/marktec-itesm',
     eventType: 'providers/firebase.auth/eventTypes/user.create' } }
 Tue Nov 14 2017 04:06:02 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:03.064Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:03 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:03.068Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:03 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:03.257Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:04 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:05.262Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:05 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:05.428Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:06 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:07.431Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:07 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:07.603Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:08 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:09.606Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:09 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:09.755Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:10 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:11.757Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:11 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:11.912Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:12 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:13.913Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:13 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:14.078Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:14 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:16.080Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:16 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:16.249Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:17 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:18.252Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:18 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:18.405Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:19 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:20.406Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:20 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:20.588Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:21 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:22.591Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:22 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:22.753Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:23 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
[2017-11-14T10:06:24.768Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1beta2/operations/bWFya3RlYy1pdGVzbS91cy1jZW50cmFsMS92ZXJpZnlJdGVzbURvbWFpbi90SFM4NnhjSF9DUQ
 Tue Nov 14 2017 04:06:24 GMT-0600 (Central Standard Time (Mexico))
[2017-11-14T10:06:24.952Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer,
Origin,Accept-Encoding, date=Tue, 14 Nov 2017 10:06:25 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="41,39,38,37,35", accept-ranges=none, connection=close
+  functions[verifyItesmDomain]: Successful update operation.

+  Deploy complete!

Project Console: https://console.firebase.google.com/project/marktec-itesm/overview

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

์ด ๋ฌธ์ œ๋Š” ์ •๋ง ๊ณจ์น˜ ์•„ํ”ˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค./

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

์ œ์ถœํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ๋Š” ๋Š๋ฆฐ ๋ฐฐํฌ๊ฐ€ ๊ธฐ๋Šฅ ๊ฒฝํ—˜์˜ ์ฃผ์š” ๋ฌธ์ œ์ ์ž„์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ๋‹ค์–‘ํ•œ ์ „๋žต์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@laurenzlong
Firebase๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ ์–ธ๋œป ๋ณด๊ธฐ์— ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ๊ฐ€ ํ•ญ์ƒ _functions: prepare functions ๋””๋ ‰ํ† ๋ฆฌ for uploading..._ ๋ถ€๋ถ„์—์„œ ์ค‘์ง€๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ •๋ณด(์˜ˆ: ์™„๋ฃŒํ•˜๋Š” ๋ฐ 3-5๋ถ„ ์†Œ์š”)๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์ •๋ง ์ข‹์Šต๋‹ˆ๋‹ค.

๋‰ด๋น„๋กœ์„œ ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์— ์—ฌ๋Ÿฌ ๋ฒˆ ์ทจ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. init ๋ช…๋ น์€ ๊ฑฐ๋Œ€ํ•œ '๋…ธ๋“œ ๋ชจ๋“ˆ' ํด๋”๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ปดํ“จํ„ฐ์—๋Š” 22,903๊ฐœ์˜ ํŒŒ์ผ, 2,782๊ฐœ์˜ ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ž„์‹œ ํด๋”์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•œ ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋กœ๊ทธ ์ธ์‡„ ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Š๋ฆฐ ์ฝ”๋“œ ์ค„์„ ์‹๋ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค:
    https://github.com/firebase/firebase-tools/blob/master/lib/prepareFunctionsUpload.js#L26

prepareFunctionsUpload.js์˜ 26ํ–‰:
fs.copySync(options.config.path(options.config.get('functions.source')), tmpdir.name);

  1. ํ•ด๋‹น ํŒŒ์ผ ๋ณต์‚ฌ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ธ์‡„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    C:\Users\thoma\StudioProjects\LSystemAndroid\firestorefunctions
    -> C:\Users\thoma\AppData\Local\Temp\fbfn_752624vejX0cv3GEJI

ํ•จ์ˆ˜ ํด๋”๋Š” CLI ๋ช…๋ น init์— ์˜ํ•ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

  • node_modules(์—„์ฒญ๋‚œ ํฌ๊ธฐ)
  • .gitignore
  • index.js
  • ํŒจํ‚ค์ง€.json
  • ํŒจํ‚ค์ง€ ์ž ๊ธˆ.json

CLI ๋ช…๋ น init๊ฐ€ ํ•ด๋‹น node_modules ํด๋”๋ฅผ ์ƒ์„ฑํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 165MB์˜ ๋Œ€์šฉ๋Ÿ‰์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ•ฉ๋ฆฌํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@thomasfischerm

๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด node_modules๋Š” ์ž„์‹œ ํด๋”๋กœ ๋ณต์‚ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/firebase/firebase-tools/blob/master/lib/prepareFunctionsUpload.js#L76

firebase init ๊ฐ€ ๋ชจ๋“  ๋…ธ๋“œ ๋ชจ๋“ˆ์„ ํ•จ์ˆ˜ ์†Œ์Šค ํด๋” ๋‚ด๋ถ€์— ๋กœ์ปฌ๋กœ ์„ค์น˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋กœ์ปฌ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ํŠธ๋ฆฌ๊ฑฐ ์ถ”์ถœ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ด๊ฒƒ์ด CLI๊ฐ€ ๊ฐ ๋…ธ๋“œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋Šฅ).

26ํ–‰๊ณผ ๊ทธ ๋’ค์— ๋””๋ฒ„๊ทธ ์ธ์‡„ ํ–‰์„ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค„์€ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ณต์‚ฌ ์ค‘์ธ ํŒŒ์ผ์„ ์ธ์‡„ํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ชจ๋“  node_modules ํŒŒ์ผ์ด ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ node_module ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋„๋ก ํ•„ํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฐฐํฌ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž ์‹œ ํ›„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํด๋ผ์šฐ๋“œ ๊ธฐ๋Šฅ์˜ ์ •ํ™•์„ฑ์„ ํ‰๊ฐ€ํ•˜๋ ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์†์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์†Œ์Šค ์ฝ”๋“œ ๋ผ์ธ์€ ๋‚˜์ค‘ ๋‹จ๊ณ„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ(node_modules ์ œ์™ธ)์ด ํด๋ผ์šฐ๋“œ์— ์—…๋กœ๋“œํ•˜๊ธฐ ์ „์— zip ํŒŒ์ผ๋กœ ์•„์นด์ด๋ธŒ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค„์ด ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋„ค ๋งž์•„์š”. ์ œ๊ฐ€ ์ฐฉ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. node_modules๋Š” ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. node_modules๋ฅผ ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์œ ํšจํ•œ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์กฐ๊ธˆ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ตฌ๋ฌธ ๋ถ„์„์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ์ „์— CLI๊ฐ€ ์ž„์‹œ ํด๋”์— ".runtimeconfig.json"์„ ์ž‘์„ฑํ•˜๊ณ  ์ด ํŒŒ์ผ์ด ๋‚˜๋จธ์ง€ ๊ธฐ๋Šฅ ์†Œ์Šค ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์—…๋กœ๋“œ๋˜๊ณ  ์šฐ๋ฆฌ๋Š” ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ์‹ค์ œ ์†Œ์Šค ์ฝ”๋“œ ๋””๋ ‰ํ† ๋ฆฌ์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฐํฌ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ถ€์ž‘์šฉ์ด ์—†๋„๋ก ํ•˜๋Š” ์ข‹์€ ์†”๋ฃจ์…˜์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ firebase-tools๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋„๋ก "๋””๋ ‰ํ† ๋ฆฌ ์ค€๋น„ ์ค‘..." ๋‹จ๊ณ„์—์„œ ๋” ๋งŽ์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ด๊ฒƒ์€ Ubuntu WSL์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Linux์—์„œ๋Š” "์ค€๋น„" ๋‹จ๊ณ„๊ฐ€ ์ค‘๋‹จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "ํ•จ์ˆ˜ ์ƒ์„ฑ" ๋‹จ๊ณ„๋Š” ๋Š๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ „์— ๊ฒฝํ—˜ํ–ˆ๋˜ ๋งŒํผ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ •๋ง ๊ณจ์น˜ ์•„ํ”ˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค./

๋‚ด ํ”„๋กœ์ ํŠธ์— Firebase ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ์ด ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์—ฐ๊ธฐํ•ด์•ผ โ€‹โ€‹ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋งŽ์€ ์‹œ๊ฐ„์ด ๋‚ญ๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ณง ์ˆ˜์ •๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๋Š” ํฐ ์žฅ์• ๋ฌผ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ๋‚ด๊ฐ€ firestore๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ง‘๊ณ„, ์นด์šดํ„ฐ ๋ฐ ํ”„๋ ˆ์ฆŒ์Šค์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์€ ํด๋ผ์šฐ๋“œ ๊ธฐ๋Šฅ์— ์˜ํ•ด์„œ๋งŒ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๊ณ  ๋งค๋ฒˆ 5๋ถ„ ๋™์•ˆ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

@PulpoEnPatineta ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ ๋ฐฐํฌ ์‹œ๊ฐ„๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@McStuffins ์ž๋™์ฐจ๊ฐ€ ์ผœ์ง€๋Š” ๋ฐ 5๋ถ„์ด ๊ฑธ๋ฆฐ๋‹ค๋ฉด ์˜ค๋ฅ˜์ธ๊ฐ€์š” ์•„๋‹ˆ๋ฉด ๋‹จ์ˆœํžˆ ์‹œ์ž‘ ์‹œ๊ฐ„ ๋ฌธ์ œ์ธ๊ฐ€์š”?

์ด๊ฒƒ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ •๋ง ์—„์ฒญ๋‚˜๊ฒŒ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ ์ด ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ–ˆ์ง€๋งŒ CD๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์ž‘๋™ ์—ฌ๋ถ€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ๋ฐฐํฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๊นŒ์ง€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ•œ๊ณ„์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๊ธฐ๋Šฅ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ๊ฐ€ ์ผ์ผ ํ• ๋‹น๋Ÿ‰(12,000์ดˆ)์„ ์ดˆ๊ณผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํŠธ๋ฆฌ๊ฑฐ(pubsub, firestore, https)๊ฐ€ ์žˆ๋Š” ~55๊ฐœ์˜ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€๊ฐ€์š”?

์ด์ œ ์ดํ‹€ ๋™์•ˆ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋” ๋ฐฐํฌํ•  ๋•Œ ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋Š๋ฆฌ๋‹ค๊ฐ€ ํ„ฐ๋ฏธ๋„์— "์˜ค๋ฅ˜ in build environment"๋ผ๋Š” ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@srinurp ์œ„์— ๋งํฌ๋œ pull request๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ๋ฌธ์ œ์˜ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฑ์—”๋“œ ํŒ€์€ ๋ฌธ์ œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋งค์šฐ ๋ณต์žกํ•œ ์ž‘์—…์ด๋ฏ€๋กœ ์–‘ํ•ดํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.)

@merlinnot ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๋Š” ํ•œ --only ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ณ„ ๊ธฐ๋Šฅ ๋˜๋Š” ๊ธฐ๋Šฅ ๊ทธ๋ฃน์„ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. https://firebase.google.com/docs/cli/#partial_deploys๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

@McStuffins "๋นŒ๋“œ ํ™˜๊ฒฝ์˜ ์˜ค๋ฅ˜"๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๋•์…˜ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ https://firebase.google.com/support/ ์—์„œ ์ง€์› ํ‹ฐ์ผ“์„ ์ œ์ถœํ•˜์„ธ์š”. Firebase ์ƒํƒœ ๋Œ€์‹œ๋ณด๋“œ

@laurenzlong ๋ฐฐํฌ ๊ฐ„์— ๊ฐ ๊ธฐ๋Šฅ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋„๋ก CI๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ข…์†์„ฑ ํ•ด๊ฒฐ ํฌํ•จ). ๋ชจ๋“  ๋‹จ์ผ ๊ธฐ๋Šฅ์—์„œ ์‚ฌ์šฉํ•˜๋Š” firebase-functions , firebase-admin , lodash ๋“ฑ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

@merlinnot ๋งค์šฐ ํ•ฉ๋ฒ•์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๋ฐฐํฌ ํ• ๋‹น๋Ÿ‰์€ Google Cloud Functions์—์„œ ์ œ์–ดํ•˜๋ฏ€๋กœ ๊ณต๊ฐœ ๋ฌธ์ œ ์ถ”์ ๊ธฐ์— ์š”์ฒญ์„ ์ œ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. https://cloud.google.com/functions/docs/support

๊ด€์‹ฌ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ: https://issuetracker.google.com/issues/71385193

@laurenzlong ์†Œ์Šค๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ node_modules ํด๋”๋ฅผ ๋ฌด์‹œํ•˜๊ณ  npm install --production ๋˜๋Š” yarn install --production ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ๋‹จ์ˆœํžˆ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@horacehylee
์ด๊ฒƒ์€ ํš๊ธฐ์ ์ธ ๋ณ€ํ™”์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ (๋‚˜ ์ž์‹ ์„ ํฌํ•จํ•˜์—ฌ) ์—ฌ์ „ํžˆ ์ƒ๋Œ€ ๊ฒฝ๋กœ(์˜ˆ: "package-name": "./externs/package.tgz")๋กœ ํŒจํ‚ค์ง€๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๊ฐœ์ธ ์ €์žฅ์†Œ์˜ ( ํ˜„์žฌ ์ˆ˜์ •๋œ ) ๋ฌธ์ œ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋„๊ตฌ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์บ์‹ฑ์ž…๋‹ˆ๋‹ค. Google์ด ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด ๋‚ด๋ถ€ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ์ปดํ“จํ„ฐ์— ๋กœ์ปฌ ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(npm๊ณผ yarn ๋ชจ๋‘ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ์Šต๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ npm์˜ ์„œ๋ฒ„๋ฅผ ์ฃฝ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ๋‹จ์ˆœํžˆ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ํฌํฌ๋ฅผ ๋งŒ๋“ค๊ณ , ๋ณ€๊ฒฝํ•˜๊ณ , ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค...

๊ฒฐ๋ก : ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๊ทธ๋Œ€๋กœ ๋‘์‹ญ์‹œ์˜ค :+1:

@horacehylee @merlinnot 2์„ผํŠธ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. https://github.com/firebase/firebase-tools/pull/578 ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. CLI์˜ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๋Š” ๋” ์ด์ƒ ๊ธฐ๋Šฅ ์†Œ์Šค ํด๋” ๊ธฐ๊ฐ„์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1Gbps ํŒŒ์ด๋ฒ„ ์—ฐ๊ฒฐ์— ์žˆ๋Š” 6๊ฐœ์˜ 4GHz ์ฝ”์–ด ์‹œ์Šคํ…œ์— 5๋ผ์ธ, 1kb ๊ธฐ๋Šฅ์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆฌ๋Š” firebase๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ค์คŒ์„ ์‹ธ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ "์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์ค€๋น„ ์ค‘"์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ง„์‹ฌ์œผ๋กœ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋…ธ๋“œ ๋ชจ๋“ˆ์„ ํฌํ•จํ•œ ๊ธฐ๋Šฅ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ tmp ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฏ€๋กœ ๋” ์ด์ƒ ์ด์ „์— ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋ฐฐํฌ ์ค‘.

2018๋…„ 1์›” 7์ผ ์ผ์š”์ผ ์˜คํ›„ 5:05 hmexx [email protected] ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

Firebase์—์„œ MINUTES๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
6๊ฐœ์˜ 4GHz ์ฝ”์–ด ๋จธ์‹ ์— 5๋ผ์ธ, 1kb ๊ธฐ๋Šฅ์„ ๋ฐฐ์น˜ํ•˜๊ณ 
1Gbps ํŒŒ์ด๋ฒ„ ์—ฐ๊ฒฐ.

๋‚ด๊ฐ€ ์˜ค์คŒ์„ ์‹ธ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋Š” ๊ฒƒ์„ ์•Œ์ง€๋งŒ ์ง„์‹ฌ์œผ๋กœ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
"์—…๋กœ๋“œํ•  ๋””๋ ‰ํ† ๋ฆฌ ์ค€๋น„ ์ค‘"์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

@mbleigh

์•„ ๋งž๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์›Œํฌ์Šคํ…Œ์ด์…˜์ด 1~2๋ถ„ ๋™์•ˆ ๋ฏธ์ณ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์ผ์ข…์˜ ์ฝ”๋ฏธ๋””์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค„์— "ํŒจํ‚ค์ง€๋œ ๊ธฐ๋Šฅ( 37.55kb !!!) ์—…๋กœ๋“œ์— ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค"๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ธฐ๋Œ€ํ•˜์‹ญ์‹œ์˜ค. ์‘๋‹ตํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„.

19์ผ์ฐจ. Firebase๊ฐ€ ์•„์ง ๋ฐฐํฌ ์ค‘์ž…๋‹ˆ๋‹ค. * ํŒ์ฝ˜์„ ์›€์ผœ์ฅ๋‹ค *

์‘.

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๋Š” ์–ธ์ œ ์˜ˆ์ •๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ฐฐํฌ ์‹œ๊ฐ„์˜ ๋ช‡ % ๊ฐœ์„ ์„ ๊ธฐ๋Œ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด ๊ธธ์„ ๊ณ„์† ๊ฐˆ์ง€ ๋ง์ง€ ์•Œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ฃผ์— ์ถœ์‹œ๋  ์˜ˆ์ •์ด๋ฉฐ "์ค€๋น„ ์ค‘"
๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๊ธฐ๋Šฅ ๋””๋ ‰ํ† ๋ฆฌ" ๋‹จ๊ณ„๊ฐ€ ํ›จ์”ฌ ๋” ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค(๋‚˜๋Š”
์ •ํ™•ํ•œ ์ˆซ์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•จ). ๋ฐฐํฌ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

2018๋…„ 1์›” 15์ผ ์›”์š”์ผ ์˜คํ›„ 12์‹œ 42๋ถ„์— hmex [email protected] ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์‘.

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๋Š” ์–ธ์ œ ์˜ˆ์ •์ด๋ฉฐ ๋ฐฐํฌ ๊ฐœ์„ ๋ฅ ์€ ๋ช‡ %์ž…๋‹ˆ๊นŒ?
์‹œ๊ฐ„์„ ์˜ˆ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด ๊ธธ์„ ๊ณ„์† ๊ฐˆ์ง€ ๋ง์ง€ ์•Œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/firebase/firebase-tools/issues/536#issuecomment-357784792 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAAD_vaj-WngS9dMj7j5Q2AesM0tNMvVks5tK7hBgaJpZM4QdF3g
.

์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

@mbleigh ๋ฆด๋ฆฌ์Šค 3.17.4์— ์žˆ์Šต๋‹ˆ๊นŒ?

@jkossis v3.17.0

๋ฆด๋ฆฌ์Šค ์ •๋ณด์—์„œ:

ํ•จ์ˆ˜๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์—์„œ "npm i --save firebase -functions@latest "๋ฅผ ์‹คํ–‰ํ•˜์—ฌ firebase-functions SDK๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋” ๋น ๋ฅธ ๊ธฐ๋Šฅ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๋ถ„์—์„œ ๋ช‡ ์ดˆ๋กœ: ์ž˜ ํ•˜์…จ์Šต๋‹ˆ๋‹ค!

๋‚˜๋ฅผ ์œ„ํ•ด ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

[email protected] ์™€ [email protected] ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ถ”๊ฐ€๋กœ ๋””๋ฒ„๊ทธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ๊ธฐ๋Šฅ๋งŒ ๋ฐฐํฌํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ REST ๋์ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์ธ์ฆ ํŠธ๋ฆฌ๊ฑฐ์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

โžœ  functions git:(master) โœ— firebase --version
3.17.4
โžœ  functions git:(master) โœ— time firebase deploy --only functions

=== Deploying to 'XXX'...

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
โœ”  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (123.07 KB) for uploading
โœ”  functions: functions folder uploaded successfully
i  functions: updating function 1...
i  functions: updating function 2...
i  functions: updating function 3...
i  functions: updating function 4...
i  functions: updating function 5...
i  functions: updating function 6...
โœ”  functions[1]: Successful update operation.
Function URL (1): https://us-central1-XXX.cloudfunctions.net/1
โœ”  functions[3]: Successful update operation.
โœ”  functions[4]: Successful update operation.
โœ”  functions[5]: Successful update operation.
โœ”  functions[6]: Successful update operation.
โœ”  functions[2]: Successful update operation.
Function URL (2): https://us-central1-XXX.cloudfunctions.net/2

โœ”  Deploy complete!

Project Console: https://console.firebase.google.com/project/XXX/overview
firebase deploy --only functions  4.59s user 1.07s system 1% cpu 6:09.26 total

@adamduren ์ˆ˜์ •์€ preparing functions directory for uploading... ์—์„œ ๋ณด๋‚ธ ๊ณผ๋„ํ•œ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐฐํฌ ์ž์ฒด์—๋Š” ์—ฌ์ „ํžˆ ๊ฝค ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์Šคํƒ:
screen shot 2018-01-31 at 18 57 02

"firebase-admin": "^5.8.2",
"firebase-functions": "^0.8.1",

npm install -g npm@latest ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์ž…๋ ฅ์„ ์ฃผ์—ˆ๊ณ  firebase-cli ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋„ ๋ญ”๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

screen shot 2018-01-31 at 19 11 38

์—…๋ฐ์ดํŠธ:

์ข‹์•„, npm install -g firebase-tools ๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ๋งˆ์นจ๋‚ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค https://stackoverflow.com/questions/48531993/firebase-config-variables-are-not-available-error-with-deploying-functions#comment84098334_48531993

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ™์€ ์ง€์ ์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค("ํ•จ์ˆ˜ ๋””๋ ‰ํ† ๋ฆฌ ์ค€๋น„ ์ค‘..")
ํ•˜์ง€๋งŒ ์ œ ๊ฒฝ์šฐ์—๋Š” ์™„๋ฃŒํ•˜๋Š” ๋ฐ 25/30๋ถ„ ์ด์ƒ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.
์•ฝ 2.20MB๋กœ ์••์ถ•๋œ 4๊ฐœ์˜ ๊ฐœ์ธ ์ข…์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์••์ถ• ํŒŒ์ผ๋กœ ๊ฐœ์ธ ์ข…์†์„ฑ์„ ํฌํ•จํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๊นŒ?

2018-5-9
firebase deploy ์—ฌ์ „ํžˆ ๋Š๋ฆผ, ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Œ
image

๋งˆ์ง€๋ง‰ ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์…จ๋‚˜์š”? ์ง€๋‚œ ์ฃผ์— ์—…๋ฐ์ดํŠธํ–ˆ์œผ๋ฉฐ ์ด์ œ ๋ฐฐํฌ์— 1-3๋ถ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค(25/30๋ถ€ํ„ฐ).

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ž‘์—…์— ๋Œ€ํ•ด ๋ฐฐํฌ ์‹œ๊ฐ„์ด 4๋ถ„ ์ด์ƒ์ž…๋‹ˆ๋‹ค.

const functions = require('firebase-functions')

exports.test = functions.https.onRequest((req, res) => {
  res.send('Hello World')
})

i functions: updating function test... ๋Š” ์ค‘๋‹จ๋˜๋Š” ๋ผ์ธ์ž…๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๋Š๋ฆฐ ์ ์ด ์—†์—ˆ๋‹ค!

@Robula ์ตœ์‹  ๋ฒ„์ „์˜ firebase-tools๋กœ ์—…๋ฐ์ดํŠธํ•˜์…จ์Šต๋‹ˆ๊นŒ?

๋„ค ๊ทธ๋ ‡๊ฒŒ ๋ฏฟ์Šต๋‹ˆ๋‹ค. firebase โ€”version ๋ณด๊ณ  3.18.6.

๋‹น์‹ ์€ ๋‚˜๋ณด๋‹ค ์ตœ์‹  ๋ฒ„์ „์— ์žˆ์Šต๋‹ˆ๋‹ค. 3.18.6์—์„œ node_modules ํด๋”๋ฅผ ๊ณ„์† ์ „์†กํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํ˜„์žฌ 3.18.4์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

์ตœ๊ทผ firebase-tools ๋ฒ„์ „(node_modules ํด๋”๋Š” ๋ณต์‚ฌ๋˜์ง€ ์•Š์Œ)์—์„œ๋Š” ๋ฐฐํฌ ์ „๋žต์ด ํ‡ด๋ณดํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋ฐฐํฌ ์‹œ๊ฐ„์€ ์ปดํ“จํ„ฐ๋งˆ๋‹ค ๊ทธ๋ฆฌ๊ณ  ๋•Œ๋•Œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ์ดˆ๊ธฐ ๋ฐฐํฌ๋„ ํ›„์† ์—…๋ฐ์ดํŠธ๋ณด๋‹ค ๋Š๋ฆฝ๋‹ˆ๋‹ค.

preparing functions directory for uploading... ๋‹จ๊ณ„์—์„œ ๋ฐฐํฌ ์‹œ๊ฐ„์ด ๋กœ์ปฌ๋กœ ์‹คํ–‰๋  ๋•Œ ์ด ๋‹จ๊ณ„์—์„œ๋งŒ ๊ฑฐ์˜ 7๋ถ„์ด ์†Œ์š”๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ ์‚ฌ์ „ ๋ฐฐํฌ ๋‹จ๊ณ„๋Š” ๋กœ์ปฌ์—์„œ ์•ฝ 5์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๋‹จ๊ณ„๋Š” ๋””๋ฒ„๊ทธ์—์„œ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ๊ฐ€ ๋‹ค์†Œ ๋Š๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์ž‘์—…์—๋„ AWS ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋งค์šฐ ํฐ ๋žŒ๋‹ค ๋ฐฐํฌ๋Š” Python ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ๋นŒ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ 2 2 3๋ถ„์˜ ์ˆœ์„œ๋กœ ์ด๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.

google ํด๋ผ์šฐ๋“œ ๋นŒ๋“œ์—์„œ ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ aws ๋žŒ๋‹ค์—์„œ 10~20์ดˆ๊ฐ€ ์†Œ์š”๋˜๋Š” ๋ฐ ๋น„ํ•ด 2~3๋ถ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ์—…๋กœ๋“œํ•˜๊ธฐ ์ „์— cli๊ฐ€ ์ „์ฒด ๊ธฐ๋Šฅ ํด๋”๋ฅผ ์••์ถ•ํ•˜๋Š”์ง€ ๋ฌป๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@laurenzlong , ๊ธฐ๋Šฅ์ด ์ด๋ฏธ ๋ณ‘๋ ฌ๋กœ ๋ฐฐํฌ๋˜์—ˆ๋Š”์ง€, ๋˜๋Š” ์ด ์ตœ์ ํ™”๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ธฐ๋Šฅ์€ ํ•ญ์ƒ ๋ณ‘๋ ฌ๋กœ ๋ฐฐํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 10๊ฐœ์˜ ๊ธฐ๋Šฅ์„ ๋ณ‘๋ ฌ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์—ฌ์ „ํžˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

+1 ๊ธฐ๋Šฅ ๋ฐฐํฌ๊ฐ€ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ†ค์ธ hourly-tick ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด cron ์ž‘์—… ํŠœํ† ๋ฆฌ์–ผ์„ ๋”ฐ๋ž๊ณ  ๋งค๋ฒˆ ๋ฐฐํฌํ•˜๋Š” ๋ฐ 1๋ถ„ ์ •๋„ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

@laurenzlong ์‘๋‹ตํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•˜๊ณ  Firebase์—์„œ ์—ด์‹ฌํžˆ ์ผํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ฐฐํฌ ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ ๊ทน์ ์ธ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? Firebase๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ๋ฐฐํฌ ์‹œ๊ฐ„์ด ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ Firebase์—์„œ ๋ฒ—์–ด๋‚  ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ญค๋ด…๋‹ˆ๋‹ค. ์•ฝ 47๊ฐœ์˜ ํด๋ผ์šฐ๋“œ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉฐ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์ •๊ธฐ์ ์œผ๋กœ 3-6๋ถ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์–‘์˜ ์ฝ”๋“œ๋ฅผ Heroku์— ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์•ฝ 20-30์ดˆ๊ฐ€ ์†Œ์š”๋˜๋Š” git push heroku master ์™€ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ฝ”๋“œ๋Š” Heroku์—์„œ ์ฆ‰์‹œ ์‹คํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Firebase๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐํฌ๋œ ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋ฐฐํฌ ํ›„ 20-30์ดˆ(์ž„์˜) ์‹œ๊ฐ„์„ ๋” ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด ์‹œ๊ฐ„ ๋™์•ˆ ์ƒˆ ๊ธฐ๋Šฅ๊ณผ ์ด์ „ ๊ธฐ๋Šฅ์ด ํ•จ๊ป˜ ์‹คํ–‰๋จ).

๋”ฐ๋ผ์„œ ๋ฐฐํฌ ๊ฒฝํ—˜์„ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค.

*** Heroku:

git push heroku master

20-30s later ...

All newly-deployed functions are now running in a consistent/atomic way

*** Firebase:

firebase deploy --only functions

180-360s later ...

Functions are deployed but only some of the new ones are running, some old ones are still running

20-30s later ... 

All new functions running

Firebase๋กœ ์›์ž์  ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ ํ›„ v_n+1 ๋ผ๊ณ  ํ•˜๋Š” ์ผ๋ถ€ ์ƒˆ ๊ธฐ๋Šฅ์ด ์ผ๋ถ€ ์ด์ „ ๊ธฐ๋Šฅ v_n ๊ณผ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋Š” ๊ธฐ๊ฐ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฃผ์š” ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ˜•์‹์ด๋‚˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ ์ƒˆ ๊ธฐ๋Šฅ๊ณผ ์ด์ „ ๊ธฐ๋Šฅ์ด ํ˜ผํ•ฉ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๋ฐฐํฌ๋˜๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋งŒ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ๋ฐฐํฌ๋˜์ง€ ์•Š๋Š” Heroku ๋ฐฐํฌ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ 47๊ฐœ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ๋ฐฐํฌ์— ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

โš   functions[retrieveFavorites(us-central1)]: Deployment error.
Server Error. getaddrinfo ENOTFOUND cloudfunctions.googleapis.com cloudfunctions.googleapis.com:443

์šฐ๋ฆฌ๋Š” ๋งค์šฐ ์•ˆ์ •์ ์ธ ๋Œ€์นญ ๊ธฐ๊ฐ€๋น„ํŠธ ์ธํ„ฐ๋„ท์— ๋ฐฐํฌํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ ๋„คํŠธ์›Œํฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Heroku ๋ฐฐํฌ๋ฅผ ์›์ž์  DB ํŠธ๋žœ์žญ์…˜(์ „๋ถ€ ๋˜๋Š” ์ „๋ฌด)๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฐ˜๋ฉด Firebase ๋ฐฐํฌ๋Š” ๋ถ€๋ถ„์  ์‹คํŒจ์™€ ๊ถ๊ทน์ ์œผ๋กœ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค... ์ด๋กœ ์ธํ•ด ํŠนํžˆ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ํ‘ธ์‹œํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ์ž‘์—…์ด ํ›จ์”ฌ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ํ•œ๋ฐค์ค‘์— ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ.

์†”์งํžˆ ๋งํ•ด์„œ, Firebase์—์„œ์˜ ๋ฐฐํฌ ๊ฒฝํ—˜์€ ๊ฐ๊ด€์ ์œผ๋กœ Heroku ๋˜๋Š” AWS๋ณด๋‹ค ๋Š๋ฆฌ๊ณ  ๋œ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ... ์˜คํ•ดํ•˜์ง€ ๋งˆ์„ธ์š”. ์šฐ๋ฆฌ๋Š” Firebase๋ฅผ ์ข‹์•„ํ•˜๊ณ  ์—ฌ๋Ÿฌ๋ถ„์˜ ๋…ธ๊ณ ์— ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด ๋ง์€ ์ด๊ฒƒ์ด ๊ณต๊ฒฉ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐœ์ธ์ ์ธ ๊ฒƒ์ด ์•„๋‹ˆ์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ๋” ์ž˜ํ•˜๋ ค๋ฉด Firebase๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฐฐํฌ๊ฐ€ ๋„ˆ๋ฌด ๊ณ ํ†ต์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ด๋™ํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

Firebase์— ๋Œ€ํ•œ ๋…ธ๊ณ ์— ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :-).

๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ๋Š” ํŠนํžˆ ๋™์‹œ์— ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ๊ฐœ์„ ํ•  ๋ช‡ ๊ฐ€์ง€ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๋‹ค(์ฃผ๋กœ ๊ธฐ๋Šฅ ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด API ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์ง„ ํ›„ ์„œ๋ฒ„ ์ธก ๋นŒ๋“œ ๋‹จ๊ณ„ ๊ฐœ์„ ). ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” 4๋ถ„์˜ 1์ด ์†Œ์š”๋˜๋Š” ์ธํ”„๋ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ๊ทธ๋™์•ˆ ๊ธฐ๋‹ค๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ๊ณ ๋ คํ–ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ํŽธ์ง‘๋œ ๊ธฐ๋Šฅ์„ ๊ฐ์ง€ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  --only ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” ๊ธฐ๋Šฅ๋งŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฐฐํฌ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๋น„๋””์˜ค๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. https://www.youtube.com/watch?v=iyGHW4UQ_Ts

@laurenzlong ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, Lauren. ํ•˜์ง€๋งŒ, ์ œ๊ฒŒ๋Š” ์ž‘์€ ํด๋ผ์šฐ๋“œ ๊ธฐ๋Šฅ์ด ํ•˜๋‚˜๋ฐ–์— ์—†๊ณ , ๊ฐ€์žฅ ์ž‘์€ ๋ณ€๊ฒฝ์„ ํ•œ ํ›„์—๋„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์—ฌ์ „ํžˆ 1๋ถ„ ์ •๋„ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ๊ธฐ๋Šฅ์ด ํ•˜๋‚˜๋ฟ์ธ๋ฐ๋„ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

2019๋…„ 4์›” ํ˜„์žฌ๋„ ๋ง ๊ทธ๋Œ€๋กœ ๋ช‡ ๋ถ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. Firebase ๋ฒ„์ „ 6.6.0 - https://firebase.google.com/docs/functions/get-started ์˜ ํŠœํ† ๋ฆฌ์–ผ์„ ๋”ฐ๋ฅด๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ "firebase ๋ฐฐํฌ"ํ•  ๋•Œ๋งˆ๋‹ค ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ง€๋‚œ ๋ฉฐ์น ๊ฐ„ ์‹ฌ์ง€์–ด ํ˜ธ์ŠคํŒ…์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋ช‡ ์ฃผ ์ „์—๋Š” 10-15์ดˆ ์ •๋„ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋ฐฐํฌ๋„ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฉ๋‹ˆ๋‹ค.

Firebase ์ƒํƒœ ํŽ˜์ด์ง€๋Š” ๋…น์ƒ‰ https://status.firebase.google.com/ ์ž…๋‹ˆ๋‹ค.

์™œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

firebase-tools 7.0.0 ์‚ฌ์šฉ

$ firebase deploy --only=hosting --token xxx

=== Deploying to 'xxx'...

i  deploying hosting
i  hosting[xxx]: beginning deploy...
i  hosting[xxx]: found 1959 files in public
โœ”  hosting[xxx]: file upload complete
i  hosting[xxx]: finalizing version...
โœ”  hosting[xxx]: version finalized
i  hosting[xxx]: releasing new version...
โœ”  hosting[xxx]: release complete
โœ”  hosting: Finished running postdeploy script.

โœ”  Deploy complete!

Project Console: https://console.firebase.google.com/project/xxx/overview
Hosting URL: https://xxx.firebaseapp.com
โœจ  Done in 181.75s

@laurenzlong-

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” 4๋ถ„์˜ 1์ด ์†Œ์š”๋˜๋Š” ์ธํ”„๋ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ๊ทธ๋™์•ˆ ๊ธฐ๋‹ค๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๋ถ„๊ธฐ ์ „ ๋งˆ์ง€๋ง‰ ๋ฉ”๋ชจ ์ดํ›„ ์ธํ”„๋ผ ์ธก ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋  ๋•Œ๊นŒ์ง€ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ถ”์ ์ด ๋‹ค๋ฅธ/๊ด€๋ จ ๋ฌธ์ œ๋กœ ์ด๋™ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋‹ซํž˜์€ ์ ์ ˆํ•œ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Firebase functions ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋นŒ๋“œ/์—…๋กœ๋“œ๋˜๊ณ  ์„œ๋ฒ„ ์ธก์—์„œ ๊ธฐ๋Šฅ์ด ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ๋œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ์ฃผ์š” ๊ฐœ๋ฐœ ์†๋„ ๋Œํผ์ž…๋‹ˆ๋‹ค.

firebase --version
7.1.0

๊ณ ๋ คํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@repentsinner ๋นŒ๋“œ/๋ฐฐํฌ ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ๋Š” ์—ฌ์ „ํžˆ ์ง„ํ–‰ ์ค‘์ด์ง€๋งŒ(์ž˜ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค!) ์•„์ง ์ถœ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์˜ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ์—๋ฎฌ๋ ˆ์ดํ„ฐ( firebase emulators:start ๋ฅผ ํ†ตํ•ด)๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

@samtstern ์—…๋ฐ์ดํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„์ง ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค - ๋‚˜๋Š” ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์˜ functions.https.onCall ์™€ firestore์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ (์–ด์จŒ๋“  ํ˜„์žฌ๋กœ์„œ๋Š”) ์•ฑ์˜ ํ…Œ์ŠคํŠธ ๋นŒ๋“œ์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฐœ๋ฐœ ์›Œํฌ์Šคํ…Œ์ด์…˜์— ๋ฐฐํฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿคจ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์‹œ๊ฐ„์„ ํ™œ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์š”.

์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์ด ๋ฌธ์ œ์— ์ƒˆํ•ด ๋ณต ๋งŽ์ด ๋ฐ›์œผ์„ธ์š”! ๐ŸŽ‰

์•„๋งˆ๋„ ๊ด€๋ฆฌ์ž ๋˜๋Š” OP๋Š” ์ด ๋ฌธ์ œ์˜ ์ด๋ฆ„์„ "๋งค์šฐ ๋Š๋ฆฐ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๊ธฐ๋Šฅ ๋””๋ ‰ํ† ๋ฆฌ ์ค€๋น„ ์ค‘"์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ „์ฒด ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค์˜ ํ•ด๋‹น ๋‹จ๊ณ„์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์—๋งŒ ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋‹ซํžŒ ๊ฒƒ์œผ๋กœ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ... ๊ธฐ๋Šฅ ๋ฐฐํฌ๊ฐ€ ์—ฌ์ „ํžˆ ๋งค์šฐ ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด "๊ธฐ๋Šฅ ๋ฐฐํฌ๊ฐ€ ๋งค์šฐ ๋Š๋ฆผ" ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

๋ฐฐํฌ ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด CLI ์ธก์—์„œ ๋” ์ด์ƒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋Š” ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ๊ณ„์† ํˆฌ์žํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์ด ๊ฐœ๋ฐœ ์ˆ˜๋ช… ์ฃผ๊ธฐ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ์ œํ’ˆ์— ๋ฐฐํฌํ•  ๋•Œ๋งŒ firebase deploy ์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ ๋ณ€๊ฒฝ์€ ์•„์ง ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

@samtstern ์— ๋Œ€ํ•œ ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. firebase/firebase-tools์— ๋Œ€ํ•œ ๋ฌธ์ œ/์š”์ฒญ์€ CLI์—๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐฑ์—”๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ/ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ ๊ฐœ๋ฐœ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ณต๊ฐœ์ ์ธ ์ธก๋ฉด์—์„œ ๋ณด๋ฉด Google์ด Firebase์™€ Flutter์˜ ํ†ตํ•ฉ์„ ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ด์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ ์‹œ๊ฐ„ ๋ถˆ์ผ์น˜์— ์ง๋ฉดํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•  ๋•Œ ์ œ์•ˆ๋œ ๋Œ€๋กœ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ์‹ค์ œ๋กœ ํ†ตํ•ฉ Firebase ๋ฐ Flutter ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ๋ฅผ ์ „ํ˜€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ตœ๊ทผ์— ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ์›์„ ๊ทธ๋ฆฌ์ง€ ์•Š์•˜์ง€๋งŒ, ๊ทธ๋Ÿด ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@repentsinner ์˜ˆ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” CLI ์ž‘์—…๋งŒ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋‹ตํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์ง€๋งŒ ์ข…์ข… ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์‚ฐ์ ์ธ ๊ฒƒ์ด ์—†์„ ๋•Œ ๋ฌธ์ œ๋ฅผ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ฐฑ์—”๋“œ๋Š” ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์ด Firebase ์ง€์› ์„ ํ†ตํ•ด ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋ฅผ ์ œ์ถœํ•˜๊ฑฐ๋‚˜ ์ผ๋ฐ˜์ ์ธ Firebase์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ œ์ถœํ•˜๋„๋ก ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

Flutter์™€ ๊ด€๋ จํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ(์ฐธ์กฐ: https://github.com/FirebaseExtended/flutterfire) ๊ณต์‹ Firebase ํ”Œ๋žซํผ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ง€์›์„ ์ œ๊ณตํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์•ˆ๋“œ๋กœ์ด๋“œ/iOS/์›น. ์–ธ์  ๊ฐ€๋Š” ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ƒํ™ฉ์ด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

Flutter ์•ฑ์„ Firebase ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์งˆ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ FlutterFire ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ์ €๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋ฉด ์ ์ ˆํ•œ Flutter ์ง์›๋„ ์ฐธ์—ฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. @samtstern์— ๋Œ€ํ•œ ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์ž ์‹œ ๋™์•ˆ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋กœ ๋„˜์–ด๊ฐ”์ง€๋งŒ, ์ด ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ FlutterFire ์ €์žฅ์†Œ๋ฅผ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์ธ์ฆ ์ปจํ…์ŠคํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ 100% ์™„์ „ํžˆ ์“ธ๋ชจ์—†๋Š” IMO์ž…๋‹ˆ๋‹ค.

dotenv๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํฌ๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ผ๋Š” ๊ฒƒ์„ ์ƒ๊ธฐ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋จธ๋ฆฌ๋ฅผ ์ฐ”๋Ÿฌ๋ณด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค โœŒ๏ธ

์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๋ฅผ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋œ ๊ฒƒ์€ functions.ignore ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํŒฝ์ฐฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌํ•จํ•  ํŠนํžˆ ์ข‹์€ ๊ฒƒ์€ .git ์ž…๋‹ˆ๋‹ค.
{ "functions": { "ignore": ["node_modules", ".git", ".gitignore", ".nyc_output", ".runtimeconfig.json", "firebase-debug.log", "tslint.json", "tests"] }

๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ๊ฐ€ ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ์ •๋„๋กœ ๊ธฐ๋Šฅ์„ ์™„์ „ํžˆ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๋ฅผ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋œ ๊ฒƒ์€ functions.ignore ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํŒฝ์ฐฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌํ•จํ•  ํŠนํžˆ ์ข‹์€ ๊ฒƒ์€ .git ์ž…๋‹ˆ๋‹ค.

"functions": {
    "ignore": ["node_modules", ".git", ".gitignore", ".nyc_output", ".runtimeconfig.json", "firebase-debug.log", "tslint.json", "tests"]
  }

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ช‡ ๊ฐ€์ง€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์•˜์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์‹œ๊ฐ„์˜ ์•ฝ 65-70%์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ functions ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ์•„๋ž˜์— ์žˆ์œผ๋ฏ€๋กœ .git ํด๋”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋„์›€์ด ๋œ ์—ฌ๋Ÿฌ๋ถ„, ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ?

@mbleigh ์ฐธ. ์ œ ์ถ”์ธก์œผ๋กœ๋Š” ์ด๊ฒƒ์ด ํ˜„๋ช…ํ•˜๊ณ  ์ด๋ฅผ functions ๋””๋ ‰ํ† ๋ฆฌ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mbleigh ํ•จ์ˆ˜ ์ „์šฉ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ•จ์ˆ˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ์–ด๋ฆฌ์„์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋ฟŒ๋ฆฌ๋กœ ๋‚ด๋ ค๊ฐ”์Šต๋‹ˆ๋‹ค.

๋‚ด firebase.json ์—์„œ ๋ฐœ์ทŒํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

  "functions": {
    "ignore": [
      "__mocks__",
      ".cache",
      ".commitlintrc.yaml",
      ".dependabot",
      ".editorconfig",
      ".eslintrc.yaml",
      ".firebase",
      ".firebaserc",
      ".git",
      ".gitattributes",
      ".github",
      ".gitignore",
      ".lintstagedrc.js",
      ".nvmrc",
      ".prettierignore",
      ".prettierrc.yaml",
      ".vscode",
      "CHANGELOG.md",
      "cloudbuild.yaml",
      "codecov.yml",
      "CONTRIBUTING.md",
      "coverage",
      "cSpell.json",
      "decisions",
      "firebase.json",
      "firestore.indexes.json",
      "jest.config.js",
      "node_modules",
      "README.md",
      "rfcs",
      "scripts",
      "src",
      "test",
      "tsconfig.json",
      "tsconfig.production.json"
    ],
    "source": "."
  },

๋‚˜๋Š” ๊ธฐ๊บผ์ด ๊ทธ๊ฒƒ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ€ ๊ฒƒ์ž…๋‹ˆ๋‹ค :
```
{
"ํฌํ•จ": ["lib", "package.json", "package-lock.json"]
}

FWIW ๋‚˜๋Š” ์ด๊ฒƒ๋“ค์ด glob์„ ํ—ˆ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "exclude": ["!{lib,package.json,package-lock.json}"]
}

ํด๋ผ์šฐ๋“œ ๊ธฐ๋Šฅ์„ ๋ง‰ ์‹œ์ž‘ํ–ˆ๊ณ  ๋ฐฐํฌ ์‹œ๊ฐ„์ด ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๊ณ ํ†ต์Šค๋Ÿฌ์šด ๋ฐฐํฌ ์‹œ๊ฐ„ :(

Firebase ์•ฑ์—๋Š” ํ˜„์žฌ 60๊ฐœ์˜ ํด๋ผ์šฐ๋“œ ๊ธฐ๋Šฅ์ด ์‹คํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ํ• ๋‹น๋Ÿ‰์œผ๋กœ ์ธํ•ด ๋งŽ์€ ๋ฐฐํฌ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ์—์„œ ์ œ์•ˆํ•˜๋Š” ๋Œ€๋กœ ๋ฐฐ์น˜๋กœ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ผ๊ด€๋˜๊ฒŒ ๋ฐฐํฌ๋˜์ง€๋งŒ ๊ฐ ๋ฐฐ์น˜๋Š” ๊ธฐ๋ณธ ์‹คํ–‰์ž์—์„œ GitHub ์ž‘์—… CI์˜ ์ผ๋ถ€๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ~3๋ถ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋ฐฐ์น˜๋Š” ๊ฐ๊ฐ ์•ฝ 6๊ฐœ์ด๋ฏ€๋กœ ์ด 10๊ฐœ์˜ ๋ฐฐ์น˜๋กœ ํ•จ์ˆ˜ ๋ฐฐํฌ ์‹œ๊ฐ„์ด ์•ฝ 30๋ถ„์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ž์ฒด๋Š” ์ตœ์†Œํ•œ์˜ ์ข…์†์„ฑ์„ ๊ฐ€์ง„ ๋งค์šฐ ์ž‘์€ ์ฝ”๋“œ ๋น„ํŠธ์ž…๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ๋” ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ •๋ง ์•ˆํƒ€๊น์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ์ง„์ž…์ /๊ฒฝ๋กœ๋ฅผ ๋‹จ์ผ ๊ธฐ๋Šฅ์œผ๋กœ ๋ฌถ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๊ด€์‹ฌ์‚ฌ/ํฌ๊ธฐ/๋ณด์•ˆ์˜ ๋ถ„๋ฆฌ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  API ์—”๋“œํฌ์ธํŠธ(๋‚ด๋ถ€ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ผ ์ง„์ž…์ )์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์ด๋ฉฐ ๊ทธ ์ดํ›„๋กœ ๋งŽ์€ ํ• ๋‹น๋Ÿ‰ ์ œํ•œ์„ ๊ฒฝํ—˜ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ๊ฐ€๋” ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค).

๊ทธ๋Ÿฌ๋‚˜ ๊ณต์‹ ๋ฌธ์„œ ์— "Cloud Functions API๋ฅผ ํ†ตํ•œ ๊ธฐ๋Šฅ ๋ฐฐํฌ ๋˜๋Š” ์‚ญ์ œ ํ˜ธ์ถœ"์— ๋Œ€ํ•œ "100์ดˆ๋‹น 80๊ฐœ"๊ฐ€ ๋‚˜์—ด๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ• ๋‹น๋Ÿ‰ ์ œํ•œ์€ ์ •๋ง ๋‚ฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Google ์ง€์›์—์„œ ์ด ํ•œ๋„๋ฅผ ๋” ๋†’์ผ ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ณต์‹ ๋ฌธ์„œ ์— "Cloud Functions API๋ฅผ ํ†ตํ•œ ๊ธฐ๋Šฅ ๋ฐฐํฌ ๋˜๋Š” ์‚ญ์ œ ํ˜ธ์ถœ"์— ๋Œ€ํ•œ "100์ดˆ๋‹น 80๊ฐœ"๊ฐ€ ๋‚˜์—ด๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ• ๋‹น๋Ÿ‰ ์ œํ•œ์€ ์ •๋ง ๋‚ฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Google ์ง€์›์—์„œ ์ด ํ•œ๋„๋ฅผ ๋” ๋†’์ผ ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

@dinvlad API ํ•œ๋„ ์ฆ๊ฐ€์— ๋Œ€ํ•ด ํŒ๋งค ๋ฐ ์ง€์›์— ๋ฌธ์˜ํ–ˆ๋Š”๋ฐ GCP ์ฝ˜์†” ํ• ๋‹น๋Ÿ‰ ์„น์…˜์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”/ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํ–‰์•„์›ƒ์—์„œ "๊ทธ ํ• ๋‹น๋Ÿ‰์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” Google ์—”์ง€๋‹ˆ์–ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.... ๊ทธ๋ž˜์„œ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ํ‘œ์ค€ ๋ฌด์‹œ ๋ชฉ๋ก์— .git ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/firebase/firebase-tools/pull/2395

์ผ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋ฆด๋ฆฌ์Šค ์†๋„๊ฐ€ ๋นจ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐ๋ฆฌ(Firebase CLI ํŒ€)๊ฐ€ Cloud Functions ๋ฐฑ์—”๋“œ์˜ ์ง€์—ฐ ์‹œ๊ฐ„์— ๋Œ€ํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์„ ๋•Œ firebase deploy --only hosting ๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

์—ฌ๊ธฐ์—์„œ ์šฐ๋ฆฌ๋Š” ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๊ธฐ๋Šฅ์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ "๊ธฐ๋Šฅ์˜ ๊ฐœ๋ณ„ ๊ณผ๋ฆฝ๋‹น ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ"์ด ์•„๋‹ˆ๋ผ "๊ธฐ๋Šฅ ์˜์—ญ๋‹น ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ"์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฐฐํฌ์˜ ์„ฑ๋Šฅ ํŠน์„ฑ์€ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์— ๋“ค์–ด๊ฐ€๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ฃผ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋œ ์‹œ๊ธฐ์™€ ์ด์œ  2017๋…„ 11์›”์— ์˜คํ”ˆํ–ˆ๋Š”๋ฐ ์•„์ง๋„ ๊ทธ๋•Œ๋งŒํผ์€ ๋ฌธ์ œ๊ฐ€ ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ 'Closed'์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ณผ ์ˆ˜ ์—†์œผ๋ฉฐ ํ์‡„๋œ ์ด์œ ๋ฅผ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ถˆํ‰ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ๊ถ๊ธˆํ•ด์„œ์š”. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ž‘์—… ์ค‘์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@chriscurnow ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ CLI ๋ฌธ์ œ๋กœ ๋ช…์‹œ๋˜์ง€๋งŒ(https://github.com์˜ @samtstern ๋‹น) ์‹ค์ œ ์›์ธ์€ CLI ๋„๊ตฌ๊ฐ€ ์•„๋‹Œ (ํ์‡„ ์†Œ์Šค) ์„œ๋ฒ„ ์ธก ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. /firebase/firebase-tools/issues/536#issuecomment-572830647).

๋ถˆํ–‰ํžˆ๋„ ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•œ ์ข‹์€ ๊ณต๊ฐœ ์ถ”์ ๊ธฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.:(

Google์ด ๋ฐฑ์—”๋“œ์—์„œ ์ด ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ์ด ๋ฒ„๊ทธ๋ฅผ ์–ด๋–ป๊ฒŒ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๋ฌด์ง€ํ•˜๊ฒŒ ๋Š๋ฆฌ๋‹ค

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ ‡๊ฒŒ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด Firebase ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์Šจ ์†Œ์šฉ์ด๊ฒ ์Šต๋‹ˆ๊นŒ?

์—ฌ๋Ÿฌ๋ถ„, ์šฐ๋ฆฌ ๋ชจ๋‘ ์ด ๋ฌธ์ œ๋ฅผ Google์— ๋ณด๊ณ ํ•˜๊ณ  ๊ทธ๋“ค์ด ๋“ค์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?
https://firebase.google.com/support/troubleshooter/contact

์ค‘์š”ํ•œ ์ผ์„ ์œ„ํ•ด Google์˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋งˆ๋‹ค Google์ด ํ˜„์กดํ•˜๋Š” ๊ฐ€์žฅ ์†Œ๋น„์ž ์นœํ™”์ ์ด์ง€ ์•Š์€ ํšŒ์‚ฌ ์ค‘ ํ•˜๋‚˜๋ผ๋Š” ๊ฒƒ์„ ์ƒ๊ธฐํ•˜์ง€๋งŒ, ์ด๋ด, ์šฐ๋ฆฌ๋Š” ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@RenFontes ๋ฐฉ๊ธˆ ์ผ€์ด์Šค 00075974๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค: Firebase ๊ธฐ๋Šฅ ๋ฐฐํฌ๊ฐ€ ๋„ˆ๋ฌด ๋Š๋ ค์„œ Firebase ์ง€์›์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค . ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋Œ์•„์˜ค๋Š” ๋Œ€๋กœ ์ด ๋ฉ”์‹œ์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠน์ • ๊ธฐ๋Šฅ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CLI์— ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ "์ฒดํฌ์„ฌ ์ถ”์ ๊ธฐ"๊ฐ€ ์žˆ๊ณ  ๋ณ€๊ฒฝ๋œ ๊ธฐ๋Šฅ๋งŒ ๋ฐฐํฌํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๊นŒ(๋˜ํ•œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ ์ถ”์ : vars, packages, ...)?

@SrBrahma ๋Š” ํ™•์‹คํ•˜์ง€๋งŒ ๋‹จ์ผ ๊ธฐ๋Šฅ๋งŒ ๋ฐฐํฌํ•˜๋”๋ผ๋„ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋‹จ์ผ ๊ธฐ๋Šฅ ๋ฐฐํฌ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ์ธํ•ด ์—ฌ์ „ํžˆ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Œ).

์ผ๊ด„ ๊ธฐ๋Šฅ ๋ฐฐํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„˜์–ด๊ฐˆ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋งŽ์€ ๊ฒฝ์šฐ์— ๊ธฐ๋Šฅ ์—…๋ฐ์ดํŠธ๊ฐ€ ์›์ž์ ์œผ๋กœ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ถ„ํ• /์ผ๊ด„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ Google์˜ SLA์™€ ์ด๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Firebase Functions ๊ฐ€๋”?(์•„๋งˆ๋„ ์ž์ฃผ) ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค..์ •๋ง ๋Š๋ฆฝ๋‹ˆ๋‹ค.. ์ฐจ๋ผ๋ฆฌ Rust๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.. Go? ๋…ธ๋“œ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๊นŒ?

์—ฌ์ „ํžˆ Google์ด Google Functions ๋ฐฐํฌ ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
PWA์—์„œ SSR๋กœ ์ด๋™ํ•˜๋ฉด์„œ ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค 7๋ถ„์„ ๋” ๊ธฐ๋‹ค๋ ค์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ž

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰