firebase-tools: Hosting deploy fails with multiple sites in the project

firebase --version : 4.2.1 os: Mac OS High Sierra (10.13.5)

After I have added a second site to the same project the deploy is failing. In the debug it is giving the following message when I run a deploy command: cmd: firebase deploy --only hosting:dealer

[info] Project Console: https://console.firebase.google.com/project/[project]-dev/overview [debug] [2018-08-31T18:22:18.699Z] TypeError: Cannot read property 'deploys' of undefined at /Users/[user]/.npm-global/lib/node_modules/firebase-tools/lib/deploy/index.js:105:32 at <anonymous> at process._tickDomainCallback (internal/process/next_tick.js:228:7) [error] [error] Error: An unexpected error has occurred.

And this is my .firebaserc file:

{
  "projects": {
    "default": "[name]-dev",
    "prod": "[name]-prod"
  },
  "targets": {
    "[name]-dev": {
      "hosting": {
        "dealer": [
          "[name]-dealer-dev"
        ],
        "consumer": [
          "[name]-dev"
        ]
      }
    }
  }
}

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Reactions: 13
  • Comments: 18 (5 by maintainers)

Commits related to this issue

Most upvoted comments

I also got this error but i fixed it by changing my firebase.json config to use an array with a hosting configuration for each site.

old firebase.json

{
  "hosting": {
    "public": "dist",
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

updated firebase.json

{
  "hosting": [
    {
      "target": "production",
      "public": "dist",
      "rewrites": [
        {
          "source": "**",
          "destination": "/index.html"
        }
      ]
    },
    {
      "target": "staging",
      "public": "dist",
      "rewrites": [
        {
          "source": "**",
          "destination": "/index.html"
        }
      ]
    }
  ]
}

My .firebaserc

{
  "projects": {
    "default": "[project-id]"
  },
  "targets": {
    "[project-id]": {
      "hosting": {
        "production": [
          "[project-id]"
        ],
        "staging": [
          "[project-id]-staging"
        ]
      }
    }
  }
}

@arsen Thanks for bringing this to our attention. It seems as though that happens when a hosting deploy target name that doesn’t exist in firebase.json. I’ve brought this to the attention of the appropriate people. 😄

When using multiple Hosting sites, it’s important to follow all the directions in the documentation in order for deployments to work. The cliff notes version going from one to two sites (where the project name is my-web-app:

  • create a new site in the Firebase Console under Hosting (e.g. new-site)
  • run firebase target:apply [some-target-name] my-web-app to give a name to to the original site
  • run firebase target:apply [new-target-name] new-site in the terminal in your project
  • update firebase.json to make the hosting object an array, being sure to specify in each element the target value
    • be sure to add "target": "[some-target-name]", to the original object so that the default site can continue to be deployed
    • a sample configuration may look like this (w/o comments, 'cause JSON):
{
  "hosting": [
    {
      "target": "some-target-name",
      "public": "dist", // this was the original deployed folder, now with `target` above
    },
    {
      "target": "new-target-name", // this is a new `target` and object
      "public": "new-dist",
    }
  ]
}
  • now firebase deploy --only hosting should deploy both some-target-name and new-target-name, and firebase deploy --only hosting:some-target-name will only deploy some-target-name.

Hope this helps!

Same problem and put an array didn’t work.

@vnoitkumar you must be on the Blaze plan to create multiple Hosting sites. See the note here: https://firebase.google.com/docs/hosting/multisites

I was able to resolve this by updating the main firebase.json configration. The issue was in the hosting reference syntax, which needs to be updated using an array formate instead of the brackets formate.

Initial file – generated by firebase:

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

Updated file, with revising hosting section:

{
  "database": {
    "rules": "database.rules.json"
  },
  "firestore": {
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint"
    ]
  },
  "storage": {
    "rules": "storage.rules"
  },
  "hosting": [
    {
        "public": "public"
    },
    {
      "target": "staging",
      "public": "public"
    },
    {
      "target": "production",
      "public": "public"
    }
  ]
}

I’m only using 2 enviornments in this case. I did not have to make any updates to the .firebaserc file.

I was facing the same problem, I try @danielx suggestion and it works. So, this error occurred because the firebase.json file didn’t get update when I run the firebase target:apply hosting target-name resource-name command.