Как записать файлы в дерево приложений в хуке ember-cli preprocessTree

У меня есть плагин брокколи, который делает следующее:

  • Чтение json-файла из корневой папки
  • на основе JSON сгенерируйте несколько файлов HBS шаблона маршрута

Это работает отлично, и его также можно протестировать, запустив сборку брокколи.

Пример результата сборки брокколи:

templates/generated-route.hbs
templates/my-sub/generated.hbs

Следующим этапом будет интеграция его в ember-аддон, и я создал его с помощью preprocessTree хука.

module.exports = {
  name: 'route-template-generator',

  included(app) {
    this._super.included.apply(this, arguments);

    this.options = Object.assign({}, app.options);
    this.appName = app.name;

    if (!this.options.trees) {
        throw new Error('No trees found in app to add the new files to');
    }
    if (!this.appName) {
        throw new Error('no valid application name, unable to add files to the tree');
    }
  },

  preprocessTree(type, tree) {
    if (type === 'template') {
      const extraTemplates = new RouteTemplateGenerator(
        [new Funnel(this.options.trees.app, { include: ['router.json'] })], 
        { destDir: this.appName }
      );

      return mergeTrees([tree, extraTemplates], { overwrite: true });
    }
    return tree;
  }
};

Проблема с приведенным выше решением заключается в том, что деревья не могут быть объединены, если не передано destDir. Дерево ember-приложений начинается с имени приложения, например:

my-ember-app-name/templates/application.hbs
my-ember-app-name/router.js
...

При вызове этого аддона сразу из ember-приложения app.options.trees.app будет работать, однако, когда этот аддон вызывается как зависимость от другого аддона, параметр в хуке included получает объект аддона, у которого нет имени дерева приложений.

Итак, вопрос в том, как правильно записывать файлы в дерево приложений?


person Willem de Wit    schedule 28.03.2017    source источник


Ответы (1)


В большинстве дополнений, где это необходимо, есть блок кода, например

included(app) {
  this._super.included.apply(this, arguments)
  let current = this;
  // Keep iterating upward until we don't have a grandparent.
  // Has to do this grandparent check because at some point we hit the project.
  do {
    app = current.app || app;
  } while (current.parent.parent && (current = current.parent));

  this.app = app;
},

источник: https://github.com/FortAwesome/ember-fontawesome/blob/master/index.js#L158-L163

Существует также закрытый метод this._findHost(), который делает это, но он доступен не во всех версиях ember-cli (и является закрытым).

person jrjohnson    schedule 07.02.2019