Firebase-tools: ์ •์˜๋˜์ง€ ์•Š์€ '๋ฐฐํฌ'์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

ํ™˜๊ฒฝ ์ •๋ณด


firebase-tools :
[email protected]


ํ”Œ๋žซํผ:
๋งฅ OS

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค

๋งฅ OS, ๋…ธ๋“œ 10.15.3, [email protected]

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

Firebase ์ฝ˜์†”์— ๋‘ ๊ฐœ์˜ ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์šด์˜
'firebase target : apply hosting dev firebase-hosting-id'
์šด์˜
'firebase deploy --only hosting : dev '

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

๋ฐฐํฌ ์„ฑ๊ณต

์‹ค์ œ ํ–‰๋™

[info] Project Console: https://console.firebase.google.com/project/project-name/overview
[debug] [2019-05-01T19:12:12.726Z] TypeError: Cannot read property 'deploys' of undefined
    at /Users/reeda/.nvm/versions/node/v10.15.3/lib/node_modules/firebase-tools/lib/deploy/index.js:88:36
    at process._tickCallback (internal/process/next_tick.js:68:7)
[error] 
[error] Error: An unexpected error has occurred.
hosting bug

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

๋‹ค์Œ์„ ํ™•์ธํ•˜์—ฌ ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. .firebaserc ์—๋Š” targets.<PROJECT_ID>.hosting.<TARGET_NAME> = [ "<HOST_ID" ] ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
{
  "projects": {
    "default": "my-project-id"
  },
  "targets": {
    "my-project-id": {
      "hosting": {
        "my-blog": [
          "my-blog-host-id"
        ]
      }
    }
  }
}

targets ๋ถ€๋ถ„์€ firebase target:apply hosting my-blog my-blog-host-id ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. firebase.json ์—๋Š” hosting ๊ฐ€ ๋ฐฐ์—ด๋กœ ์žˆ์–ด์•ผํ•˜๊ณ  ํ•ญ๋ชฉ์—๋Š” target: <TARGET_NAME> ๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
{
  "hosting": [{
    "target": "my-blog",
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }]
}

์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ hosting ๋ฅผ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ณ  ํ•ญ๋ชฉ์— target ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ตœ๊ทผ์ด ํ๋ฆ„์— ์•ฝ๊ฐ„์˜ ์กฐ์ •์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” ์†Œ์Šค์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. https://github.com/firebase/firebase-tools/blob/master/src/deploy/index.js#L111

@Memeriaj ์ตœ๊ทผ์—์ด ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ๊ฒƒ ๊ฐ™์•„์š”. firebase.json ๊ตฌ์„ฑ ํŒŒ์ผ์— "target": "dev" ์ด ์žˆ์Šต๋‹ˆ๊นŒ? hosintg:dev ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ์„ ๊ฑธ๋Ÿฌ ๋‚ด๊ณ  ๋นˆ ๋ฐฐ์—ด์ด ๋‚จ์•˜๋‹ค ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋นˆ ์–ด๋ ˆ์ด์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฐฐํฌ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ํšจ๊ณผ์ ์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋งˆ์ง€๋ง‰์— ์ฝ˜์†” ๋งํฌ์™€ ์ƒˆ๋กœ ๋ฐฐํฌ ๋œ ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์‹ค์ œ๋กœ ์•„๋ฌด๊ฒƒ๋„ ๋ฐฐํฌํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์šฐ๋ฆฌ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐฐํฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋Š” ์ ์ ˆํ•œ ์˜ค๋ฅ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

(๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†์Œ : ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ๊ฐ€ ์•„๋‹Œ Firebase ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™˜๊ฒฝ ์ˆ˜์ค€ ์ „ํ™˜์„ ์›ํ•ฉ๋‹ˆ๋‹ค (๋ธ”๋กœ๊ทธ ์šฉ ์‚ฌ์ดํŠธ, ์›น ์•ฑ์šฉ ์‚ฌ์ดํŠธ, ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ์—์„œ ๋™์ผํ•œ ํ™˜๊ฒฝ์—์žˆ๋Š” ๋ฌธ์„œ ์šฉ ์‚ฌ์ดํŠธ). ์ด๋Š” ์ฃผ๋กœ Firebase Auth์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์ด ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” firebase.json ํŒŒ์ผ์€ firebase use dev , firebase deploy ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด dev๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. firebase use staging , firebase deploy , ...)

{ "firestore": { "rules": "firestore.rules", "indexes": "firestore.indexes.json" }, "hosting": { "public": "build", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ], "rewrites": [ { "source": "**", "destination": "/index.html" } ] }, "functions": { "predeploy": [ "npm --prefix \"$RESOURCE_DIR\" run lint" ] } }

์–ธ๊ธ‰ ํ•œ ๊ตฌ์„ฑ์€ firebase json ํŒŒ์ผ์ด ์•„๋‹Œ firebase bashrc ํŒŒ์ผ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

firebase deploy --only hosting:dev ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด firebase.json ํŒŒ์ผ์˜ ํ˜ธ์ŠคํŒ… ์„น์…˜์— "target": "dev" ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. --only ํ”Œ๋ž˜๊ทธ๋Š” ํ•„ํ„ฐ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋ฉฐ ํ˜ธ์ŠคํŒ… ๊ตฌ์„ฑ์— target ํ•„๋“œ๊ฐ€ ์—†์œผ๋ฉด CLI๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ๋ฐฐํฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์œ ์šฉํ•œ ๋ฉ”์‹œ์ง€๊ฐ€์žˆ๋Š” ์˜ค๋ฅ˜ ์—ฌ์•ผํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๋งน๋ชฉ์ ์œผ๋กœ ๊ทธ๊ฒƒ).

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ๋Œ€์ƒ ํ•„๋“œ๋ฅผ ๋„ฃ์„ json์˜ ์œ„์น˜๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.์ด๋ฅผ json์˜ ๋ฃจํŠธ (์ž‘๋™ํ•˜์ง€ ์•Š์Œ)์— ๋‘๊ฑฐ๋‚˜ ํ˜ธ์ŠคํŒ…์˜ ๋ฃจํŠธ์— ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๊นŒ (๋˜ํ•œ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Œ).

๋˜ํ•œ ๋‚ด firebaserc ํŒŒ์ผ์€ ๋‚ด ๋ฃจํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•˜์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ CLI ๋„๊ตฌ๊ฐ€ ๋ฐฐํฌ ์œ„์น˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

firebase.json ํŒŒ์ผ์˜ ํ˜ธ์ŠคํŒ… ์„น์…˜์— ์žˆ์–ด์•ผํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

{
// ...
  "hosting": [{ // Can be an array and have multiple configs, or an object if you've only got a single config
    "target": "blog",
    "public": "build/blog"
    // ...
  }],
// ...
}

์ด ๋ฌธ์„œ ํŽ˜์ด์ง€ ๋Š” ๊ฐ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ณ  ๋Œ€์ƒ ๋ฐ ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

firebase target:apply hosting dev firebase-hosting-id ํ•˜๋ฉด firebase-hosting-id ๊ฐ€ ๋ฐฐํฌ ํ•  ์‚ฌ์ดํŠธ ์ด๋ฆ„์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด firebase use ๋ช…๋ น์—์„œ ํ˜„์žฌ CLI์—์žˆ๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€์ƒ์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์ด ์„ฑ์ทจํ•˜๋ ค๋Š” ๊ฒƒ์„ ์˜คํ•ดํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๋งˆ์›Œ์š”, ๋‚˜๋Š” ์ง„์ „์„ ๋ณด์ด๊ณ  ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ 404 ์˜ค๋ฅ˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ firebase์˜ ๋‚ด ํ”„๋กœ์ ํŠธ๊ฐ€ reedy-1์ด๊ณ  ๋‚ด ๋ชฉํ‘œ๊ฐ€ reedy-1-api๋ผ๊ณ  ๋งํ•˜์‹ญ์‹œ์˜ค.
reedy-1-api๋กœ ํ˜ธ์ŠคํŒ…์— ๋Œ€์ƒ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด firebaserc ํŒŒ์ผ์˜ ๋Œ€์ƒ ์•„๋ž˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"targets": {
   "reedy-1": {
      "hosting": {
         "dev-api": [
           "reedy-1-api"
         ]
      }
   }
}

.firebaserc ํŒŒ์ผ์˜ ์Šค ๋‹ˆํŽซ์ด ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ (๋‹น์‹ ์€ ์•„๋งˆ ์ด๊ฒƒ์„ ํ™•์ธํ–ˆ์ง€๋งŒ ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌ ํ•  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋‚˜์—ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค) :

  • firebase use ์—์„œ ์ ์ ˆํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • ํ”„๋กœ์ ํŠธ ID๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค ( firebase use --add ์˜ ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก์„ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค).
  • ์‚ฌ์ดํŠธ ์ด๋ฆ„์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค ( <site-name>.firebaseapp.com ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ).

๋””๋ฒ„๊ทธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๋ ค๊ณ ํ•˜๋ฉด 404๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‹ค์ œ ํ˜ธ์ŠคํŒ… ๋ฐฐํฌ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ์ด๊ธฐ ๋•Œ๋ฌธ์— POST https://firebasehosting.googleapis.com/v1beta1/sites/<site-name>/versions ์—์„œ ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํƒ€๊ฒŸ์œผ๋กœ ์„ค์ • ํ•œ ์‚ฌ์ดํŠธ ์ด๋ฆ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ „์— ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

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

์›Œ, ๊ธฐ๋‹ค๋ ค. ๋ฐฐํฌ๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด Blaze๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผํ•˜๋‚˜์š”? ์ƒˆ ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ๋ฅผ ์•„์ง ๋งŒ๋“ค์ง€ ์•Š์•˜๊ณ ์ด๋ฅผ ์œ„ํ•ด ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด์ „์— Blaze๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฒฐ์ œ ์š”๊ธˆ์ œ๋ฅผ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ ํ•œ ๋‹ค์Œ ๋ฐฐํฌ๋ฅผ ์‹œ๋„ ํ–ˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ์–ด๋–ค ์š”์ฒญ์ด ๊ทธ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹น์‹ ์ด ์˜ณ๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ ์˜ค๋ฅ˜๋Š” ์ „ํ˜€ ๋„์›€์ด๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ผ๋ฐ˜์ ์ธ 404 ํ…์ŠคํŠธ ๋Œ€์‹  ์ˆ˜ํ–‰ ํ•  ์ž‘์—…์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์œ„์น˜๋ฅผ ์ถ”์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€

@isevcik ์ •๋ง? ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ ๋ฌธ์ œ๋ฅผ ๊ณ ์ณค๋‹ค ๊ณ  ํ™•์‹ ํ–ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ •๋ง๋กœ ๋‹ซ์•˜์–ด์•ผํ–ˆ๋‹ค). ํ”„๋กœ์ ํŠธ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•œ ๋‹ค์Œ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ–ˆ์Šต๋‹ˆ๊นŒ?

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

@isevcik ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ .firebaserc์˜ projectid์—์„œ ์˜คํƒ€๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  ์ด๋Ÿฌํ•œ ๋Œ€์ƒ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ  : ๋˜ํ•œ firebase.json์— ๋Œ€์ƒ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

firebase target : apply type target-name resource-name

https://firebase.google.com/docs/cli/targets

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ™์€ ๋ฌธ์ œ :

[debug] [2019-08-09T17:34:19.322Z] TypeError: Cannot read property 'deploys' of undefined
    at /Users/kevinliu/.npm-global/lib/node_modules/firebase-tools/lib/deploy/index.js:84:36
    at processTicksAndRejections (internal/process/task_queues.js:85:5)
[error] 
[error] Error: An unexpected error has occurred.

index.js :

   if (deployedHosting) {
            _.each(context.hosting.deploys, function (deploy) {
                logger.info(clc.bold("Hosting URL:"), utils.addSubdomain(api.hostingOrigin, deploy.site));
            });
            const versionNames = context.hosting.deploys.map((deploy) => deploy.version);
            return { hosting: versionNames.length === 1 ? versionNames[0] : versionNames };
        }

@hpoit ๋‚˜๋Š” ๋˜ํ•œ ๊ทธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌด์—‡์„ ๋ณ€๊ฒฝ ํ–ˆ์Šต๋‹ˆ๊นŒ?

[debug] [2019-08-16T18:44:01.159Z] TypeError: Cannot read property 'deploys' of undefined
    at C:\Users\Kraken\AppData\Roaming\npm\node_modules\firebase-tools\lib\deploy\index.js:84:36
    at process._tickCallback (internal/process/next_tick.js:68:7)
[error] 
[error] Error: An unexpected error has occurred.

@Memeriaj๊ฐ€ ์ œ์•ˆํ•œ๋Œ€๋กœ

@MaxInertia ์˜ˆ, ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์‹œ์Šคํ…œ์„ ํฌ๋งทํ•˜๊ณ  ์ง€ ์› ์Šต๋‹ˆ๋‹ค. :-)

๊ตฌ์„ฑ์—์„œ ๋ฐฐํฌ ๋Œ€์ƒ์„ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๊ตฌ์„ฑ firebase ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 2 ์ฐจ ์˜๊ฒฌ์„ ์›ํ•˜์‹œ๋ฉด ์—ฌ๊ธฐ์— ๋‚ด์šฉ์„ ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค.

firebase 7.3.1์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์กฐ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ์˜ค๋ฅ˜๊ฐ€ firebase.json์— ์žˆ์—ˆ์œผ๋ฉฐ ์ž˜๋ชป๋œ "๋Œ€์ƒ"์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ์˜ ๋„์›€์œผ๋กœ ์ƒˆ ๋ฐฐํฌ ๋Œ€์ƒ์„ ๋งŒ๋“ค์–ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

https://firebase.google.com/docs/hosting/multisites?authuser=1#set_up_deploy_targets

๋‚˜๋Š” ํ•˜๋‚˜์˜ ๋ช…๋ น์„ ๋‚ด๋ ธ๋‹ค.

firebase target:apply hosting blog myapp

target ํ‚ค๋ฅผ firebase.json

{
  "hosting": {
    "target": "myapp",
    ...
  }
  ...
}

ํŽธ์ง‘ : ์ƒˆ๋กœ์šด firebase ํ”„๋กœ์ ํŠธ์—์„œ ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ŠคํŒ…์„ ์„ค์ •ํ•  ๋•Œ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‚ด ๋ฌธ์ œ๋Š” docs : $ firebase target : apply hosting target-name resource-name์— ์„ค๋ช… ๋œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ ๋Œ€์ƒ์„ ๋งŒ๋“ค ๋•Œ ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์œผ๋กœ ๋„ฃ์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .firebaserc ํŒŒ์ผ์—์„œ ๋ณ€๊ฒฝํ•˜๊ณ  firebase deploy ๋ช…๋ น์„ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ :

"targets": {
    "firebase-project-name": {
      "hosting": {
        "admin": [
          "admin-project"
        ]
      }
    }
  }

์•ˆ๋…•ํ•˜์„ธ์š” ๋˜ํ•œ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์‚ฌ์šฉ์ž ์ง€์ • ์ถ”๊ฐ€ ๋„๋ฉ”์ธ์˜ ๊ฒฝ์šฐ).

๋‹ค๋ฅธ ๋Œ€์ƒ ์ด๋ฆ„์œผ๋กœ ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŒ…์— ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ์ง€์ • ์ถ”๊ฐ€ ๋„๋ฉ”์ธ์— ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ. ์˜ค๋ฅ˜ : HTTP ์˜ค๋ฅ˜ : 404, ์š”์ฒญ ๋œ ์—”ํ„ฐํ‹ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ๋งž์ถค ๋„๋ฉ”์ธ์€ 3dprinter.froozen.in์ž…๋‹ˆ๋‹ค (๋งž์ถค ๋„๋ฉ”์ธ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๊ธฐ๋ณธ ํ˜ธ์ŠคํŒ… ๋‚ด์—์„œ Firebase์— ์ถ”๊ฐ€๋จ).
๋‚ด ์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ์ด ๋‚ด ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ ๋‚ด์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
๋” ์ง„ํ–‰ํ•˜๋„๋ก ์นœ์ ˆํ•˜๊ฒŒ ๋„์™€์ฃผ์„ธ์š”.

๋„์›€์„ ๋ฐ›์œผ๋ ค๋ฉด ์ •ํ™•ํ•œ ์‹คํŒจ ํ˜ธ์ถœ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜์‹ญ์‹œ์˜ค.

2020 ๋…„ 1 ์›” 4 ์ผ ํ† ์š”์ผ ์˜ค์ „ 12:52 nandha [email protected] ์ž‘์„ฑ :

์•ˆ๋…•ํ•˜์„ธ์š”๋„ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (๋งž์ถคํ˜•
์ถ”๊ฐ€ ๋œ ๋„๋ฉ”์ธ)

๋‹ค๋ฅธ ๋Œ€์ƒ ์ด๋ฆ„์œผ๋กœ ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŒ…์— ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜
์‚ฌ์šฉ์ž ์ง€์ • ์ถ”๊ฐ€ ๋„๋ฉ”์ธ์— ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค : HTTP์˜ค๋ฅ˜ : 404, ์š”์ฒญ ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ์€ 3dprinter.froozen.in์ž…๋‹ˆ๋‹ค (Firebase ๋‚ด๋ถ€์— ์ถ”๊ฐ€๋จ).
์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๊ธฐ๋ณธ ํ˜ธ์ŠคํŒ…)
๋‚ด ์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ์ด ๋‚ด ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ ๋‚ด์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
๋” ์ง„ํ–‰ํ•˜๋„๋ก ์นœ์ ˆํ•˜๊ฒŒ ๋„์™€์ฃผ์„ธ์š”.

โ€”
์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/firebase/firebase-tools/issues/1232?email_source=notifications&email_token=AAAAH7SNCPUEIMIWCDHK6CDQ4BE4JA5CNFSM4HJWK5J2YY3PNVWWK3TUL52HS4DFWSVREXG43684ZLOBW63com5E7072ZLOBW63comZNMVXHJ
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AAAAH7V26G3YF6Q7FYDP5QTQ4BE4JANCNFSM4HJWK5JQ
.

์•ˆ๋…•ํ•˜์„ธ์š” @mbleigh ,

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋„๋ฉ”์ธ์ด ์™„์ „ํžˆ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  2. ํ˜ธ์ŠคํŒ…์˜ Firebase.json์ด ๋ฌธ์„œ์— ๋”ฐ๋ผ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    ๋‘˜ ๋‹ค ์™„๋ฃŒ๋˜๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋” ์ด์ƒ ์ฟผ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์งˆ๋ฌธ์ด ์žˆ์œผ์‹œ๋ฉด ์•„๋ž˜์— ์˜๊ฒฌ์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.

"์˜ค๋ฅ˜ : HTTP ์˜ค๋ฅ˜ : 404, ์š”์ฒญ ๋œ ์—”ํ„ฐํ‹ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"์— ๋Œ€ํ•œ ๋‚ด ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

```
"๋Œ€์ƒ": {
"ํ”„๋กœ์ ํŠธ ์ด๋ฆ„": {
"ํ˜ธ์ŠคํŒ…": {
"dev": [
"dev.site.com"
],
"prod": [
"site.com"
]
}
}
}

istead of

 ```
"targets": {
    "projectname": {
      "hosting": {
        "dev": [
          "dev-site-name"
        ],
        "prod": [
          "ez-site-name"
        ]
      }
    }
  }

๋‹ค์Œ์„ ํ™•์ธํ•˜์—ฌ ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. .firebaserc ์—๋Š” targets.<PROJECT_ID>.hosting.<TARGET_NAME> = [ "<HOST_ID" ] ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
{
  "projects": {
    "default": "my-project-id"
  },
  "targets": {
    "my-project-id": {
      "hosting": {
        "my-blog": [
          "my-blog-host-id"
        ]
      }
    }
  }
}

targets ๋ถ€๋ถ„์€ firebase target:apply hosting my-blog my-blog-host-id ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. firebase.json ์—๋Š” hosting ๊ฐ€ ๋ฐฐ์—ด๋กœ ์žˆ์–ด์•ผํ•˜๊ณ  ํ•ญ๋ชฉ์—๋Š” target: <TARGET_NAME> ๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
{
  "hosting": [{
    "target": "my-blog",
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }]
}

์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ hosting ๋ฅผ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ณ  ํ•ญ๋ชฉ์— target ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜๋„ ์ด๊ฒƒ์— ๋งž์•˜๋Š”๋ฐ, firebase.json hosting ์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๊ณ ํ†ต ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค!

์ด์ œ ๋ชจ๋“  ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ๋งŽ์€ ํ—ค๋” ๊ตฌ์„ฑ์ด์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ (๋Œ€์ƒ์„ ์ œ์™ธํ•˜๊ณ  ๋™์ผํ•˜๋”๋ผ๋„)์„ ๋ณต์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ‘์ž๊ธฐ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” 4x json ๊ตฌ์„ฑ ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  firebase json์˜ ๊ธฐ๋ณธ ํ˜ธ์ŠคํŒ…์„ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋ฉด?

๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์˜ ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ๋Š” "ํ™˜๊ฒฝ"์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "์Šคํ…Œ์ด์ง•", "dev"๋“ฑ์˜ ์‚ฌ์ดํŠธ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์‚ฌ์ดํŠธ ์—ฌ์•ผํ•˜๋ฉฐ firebase use ๋ช…๋ น์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๋“ค ์‚ฌ์ด์—์„œ ์ „ํ™˜ / ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ดํ•˜๋Š” ์ผ์ด ์•„๋‹ˆ๋ผ๋ฉด, ํ”„๋กœ์ ํŠธ์˜ ๊ฐ ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ firebase.json ๊ตฌ์„ฑ์ด ๋™์ผํ•œ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜๋„๋ก ๋„์™€ ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ธ€์Ž„์š”, ๊ทธ๊ฒƒ์€ ๊ฑฐ์˜ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์„œ๋กœ ๋‹ค๋ฅธ GCP ํ”„๋กœ์ ํŠธ์— 4 ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ์ž„์‹œ ํ™˜๊ฒฝ (Firebase ํ˜ธ์ŠคํŒ…๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ํฌํ•จ)์„ ๋ฐฐํฌํ•ด์•ผํ–ˆ๊ณ , ๊ธฐ์กด ํ™˜๊ฒฝ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  ํ•œ๋‘ ๋‹ฌ ๋™์•ˆ GCP ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด atm์„ ๋‹ฌ์„ฑํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ firebase.json ํ˜ธ์ŠคํŒ… ๊ตฌ์„ฑ์„ 5 ๋ฒˆ ๋ณต์ œํ•˜๊ณ  ๊ฐ ๊ตฌ์„ฑ์— ๊ณ ์œ  ํ•œ ๋Œ€์ƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋ถ„๋ช…ํžˆ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋™์•ˆ ์ž ์‹œ๋งŒ ๊ธฐ๋‹ค๋ ค์ฃผ์‹ญ์‹œ์˜ค.
2020-06-22T17:20:39.837Z] TypeError: Cannot read property 'deploys' of undefined

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ํ™•์‹คํžˆ ๋‚˜์˜๊ณ  FWIW๋Š” ํ˜„์žฌ ๊ฐœ๋ฐœ์ค‘์ธ "์ž„์‹œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ"์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜„

"์–ด๋ ˆ์ด ์ˆ˜์ •"์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ์„ ์–ด๋ ˆ์ด๋กœ ๋ณ€๊ฒฝ ํ•œ ํ›„ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์ดํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

{ "hosting": [ { "target": "web", "public": "public", "ignore": ["firebase.json", "**/.*", "**/node_modules/**"], "rewrites": [ { "source": "**", "destination": "/index.html" } ] }, { "target": "admin", "public": "build", "ignore": ["firebase.json", "**/.*", "**/node_modules/**"], "rewrites": [ { "source": "**", "destination": "/index.html" } ] } ] }

๊ทธ๋Ÿฌ๋‚˜ "๊ด€๋ฆฌ์ž"๋Š” ์šฐ๋ฆฌ๊ฐ€ React๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋นˆ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋ฆญ์€ ๋นŒ๋“œ์— ๋Œ€ํ•œ ๊ณต๊ฐœ ์ง€์ ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.
"public": "build",

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

  1. ์‹คํ–‰ : firebase target:apply hosting second-project-id second-project-id

  2. ๊ทธ๋Ÿฐ ๋‹ค์Œ .firebaserc ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
    `{
    "๋Œ€์ƒ": {

    "main-project-id": {
    "ํ˜ธ์ŠคํŒ…": {
    "๋‘ ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ ID": [
    "๋‘ ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ ID"
    ]
    }
    }
    }
    }`

  3. ๊ทธ๋Ÿฐ ๋‹ค์Œ firebase.json ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ค์Œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
    "๋Œ€์ƒ": "๋‘ ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ ID",

ํ , ์ •ํ™•ํžˆ ๋ฌด์—‡์„ํ–ˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํ˜„์žฌ .firebaserc ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

{
  "projects": {
    "default": "mainProjectId"
  },
  "targets": {
    "mainProjectId": {
      "hosting": {
        "production": [
          "mainProjectId"
        ],
        "staging": [
          "secondProjectId"
        ]
      }
    }
  }
}
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰