firebase --version
3.18.4
Ubuntu 18.04 x64
๋ธ๋ผ์ฐ์ ์ ์ ๋ฐ์ดํธ ๋ ์ฝํ ์ธ ํ์
ํ์ด์ง๋ 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
๋ฐฉ๊ธ ์๋ก์ด ํ๋ก์ ํธ (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
}
๋ฌธ์ ๋ฅผ ๋ณต์ ํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ :
firebase init && cd functions && yarn
mkdir src/handlers && mv src/index.ts src/handlers/helloworld.ts
echo "export * from './handlers/helloworld';" > src/index.ts
yarn build --watch
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์ ์ ์ถํ์ต๋๋ค
@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
๋ด ์๋ฃจ์ :
...
"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
์ด๊ฒ์ 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"
},
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ๊ธฐ์์ ๋๋๋ ๊ฒฝ์ฐ ์ค์ ๋ก
functions/package.json
์์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋กtsc -w
๋firebase serve
์ ๋ณ๋๋ก ์คํ๋ฉ๋๋ค.์ฆ,
tsc -w
์คํํ๊ณ ์ถ๋ ฅ์firebase serve
๋ก ํ์ดํํฉ๋๋ค. ํ์ดํ๊ฐ ์ค์ ๋ก ์๋ฌด ๊ฒ๋ ๋ณด๋ด์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ค๊ฐ ๋ณ๊ฒฝ๋๋ฉด tsc๊ฐ ๋ค์ ์คํ๋๊ณfirebase serve
๊ฐtsc
์ ์ถ๋ ฅ ๋๋ ํ ๋ฆฌ (lib
)๋ฅผ๋ณด๊ณ ์์ผ๋ฏ๋ก ๋ค์๋ก๋๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ์ดํ๋ ์ค์ ๋ก ํ๋ก์ธ์ค ๊ด๋ฆฌ๋ฅผ ์ํด ์กด์ฌํฉ๋๋ค.