loadProject(projectInstance) {
    logger.info('Loading project at %o...', projectInstance.root);

    let pkgInfo = this._readPackage(projectInstance.root, projectInstance.pkg, true);

    // NOTE: the returned val may contain errors, or may contain
    // other packages that have errors. We will try to process
    // things anyway.
    if (!pkgInfo.processed) {
      this.projects.push(projectInstance);

      // projects are a bit different than standard addons, in that they have
      // possibly a CLI addon and internal addons. Add those now.
      pkgInfo.project = projectInstance;

      if (projectInstance.cli && projectInstance.cli.root) {
        logger.info('Reading package for "ember-cli": %o', projectInstance.cli.root);
        pkgInfo.cliInfo = this._readPackage(projectInstance.cli.root);
      }

      // add any internal addons in the project. Since internal addons are
      // optional (and only used some of the time anyway), we don't want to
      // create a PackageInfo unless there is really a directory at the
      // suggested location. The created addon may internally have errors,
      // as with any other PackageInfo.
      projectInstance.supportedInternalAddonPaths().forEach((internalAddonPath) => {
        if (getRealDirectoryPath(internalAddonPath)) {
          logger.info('Reading package for internal addon: %o', internalAddonPath);
          pkgInfo.addInternalAddon(this._readPackage(internalAddonPath));
        }
      });

      this._resolveDependencies();
    }

    return pkgInfo;
  }
Process the root directory of a project, given a
Project object (we need the object in order to find the internal addons).
_readPackage takes care of the general processing of the root directory
and common locations for addons, filling the cache with each. Once it
returns, we take care of the locations for addons that are specific to
projects, not other packages (e.g. internal addons, cli root).

Once all the project processing is done, go back through all cache entries
to create references between the packageInfo objects.

@public
@method loadProject
@param projectInstance the instance of the Project object to load package data
about into the cache.
@return {PackageInfo} the PackageInfo object for the given Project object.
Note that if the project path is already in the cache, that will be returned.
No copy is made.