In-repo addon, записывающий публичные файлы при сборке, вызывает бесконечный цикл сборки при подаче - PullRequest
3 голосов
/ 06 мая 2019

У меня проблемы с записью аддона в репо в appDir / public.Я хотел бы написать файл JSON для каждой сборки, который будет включен в app / dist.Проблема, с которой я сталкиваюсь, заключается в том, что при запуске «ember serve» наблюдатель файлов обнаруживает новый файл и снова перестраивает, вызывая бесконечный цикл.

Я попытался написать файл JSON с помощью preBuild () иПерехватывает postBuild (), сохраняя в / public, но после сборки наблюдатель обнаруживает его и перестраивает снова и снова, каждый раз записывая новый файл.Я также попытался использовать папку my-addon / public и записать в нее то же самое.

Единственное, что частично работает, - это запись в init (), что нормально, за исключением того, что я не вижу изменений с использованием ember serve.

Я пытался использовать метод treeForPublic (), но не получил дальше.Я могу написать файл и использовать treeForPublic ().Это выполняется только один раз, при первоначальной сборке.Это частично решает мою проблему, потому что я помещаю файлы в папку app dist.Но я не думаю, что ember serve перезапустит treeForPublic при последующем изменении файла в приложении.

Есть ли способ игнорировать определенные файлы из файлового просмотра?И все же разрешить файлы включать в сборку?Может быть, в ember-cli-build есть свойство exclude watch?

Вот мой treeForPublic (), но я полагаю, моих проблем здесь нет:

treeForPublic: function() {
    const publicTree = this._super.treeForPublic.apply(this, arguments);
    const trees = [];
    if (publicTree) {
        trees.push(publicTree);
    }
    // this writes out the json
    this.saveSettingsFile(this.pubSettingsFile, this.settings);
    trees.push(new Funnel(this.addonPubDataPath, {
        include: [this.pubSettingsFileName],
        destDir: '/data'
    }));

    return mergeTrees(trees);
},

ОБНОВЛЕНИЕ05/20/2019

Я, вероятно, должен задать новый вопрос на этом этапе ...

Моя цель здесь - создать номер сборки с автоматическим приращением, который обновляется как в emberпостроить и угасать служить.Мои комментарии под ответом @ real_ates ниже помогают объяснить почему.В конце концов, если я могу использовать это только при сборке, это совершенно нормально.

Ответ от @real_ate был очень полезным и решил проблему с бесконечным циклом, но он не работает на угольной подаче.Может быть, это просто невозможно, но мне бы очень хотелось узнать в любом случае.В настоящее время я пытаюсь изменить переменные среды вместо использования treeforPublic ().Я задал отдельный вопрос об обновлениях addon config () для среды Ember: Обновление переменных среды Ember.js не вступает в силу при использовании метода in-repo addon config () на ember serve

Не знаю, могу ли пометить ответ @ real_ate в качестве принятого решения, потому что он не работает на угольной подаче.Это было чрезвычайно полезно и познавательно!

1 Ответ

2 голосов
/ 11 мая 2019

Это отличный вопрос, и часто люди могут быть немного озадачены, работая с брокколи (я точно знаю, что меня это ужалило в прошлом)

Проблемау вас есть treeForPublic(), который на самом деле записывает файл в исходный каталог, а затем вы используете broccoli-funnel, чтобы выбрать этот новый пользовательский файл и включить его в сборку.Правильный метод для этого - использовать broccoli-file-creator для создания выходного дерева, включающего ваш новый файл.Более подробно я приведу пример ниже:

treeForPublic: function() {
  const publicTree = this._super.treeForPublic.apply(this, arguments);
  const trees = [];
  if (publicTree) {
    trees.push(publicTree);
  }

  let data = getSettingsData(this.settings);
  trees.push(writeFile('/data/the-settings-file.json', JSON.stringify(data)));

  return mergeTrees(trees);
}

Как вы увидите, большая часть кода точно такая же, как в вашем примере.Два основных различия заключаются в том, что вместо функции this.saveSettingsFile(), которая записывает файл настроек на диск, теперь у нас есть функция this.getSettingsData(), которая возвращает содержимое, которое мы хотели бы видеть во вновь созданном файле.Вот простой пример, который мы придумали, когда тестировали это:

function getSettingsData() {
  return {
    setting1: 'face',
    setting2: 'my',
  }
}

вы можете редактировать эту функцию так, чтобы она принимала любые параметры, которые вам нужны, и обладала любой функциональностью, которую вы хотели бы.

Следующее основное отличие состоит в том, что мы используем функцию writeFile(), которая на самом деле является просто плагином broccoli-file-creator.Вот импорт, который вы бы поместили в верхнюю часть файла:

let writeFile = require('broccoli-file-creator');

Теперь, когда вы запускаете ваше приложение, оно больше не будет записывать в исходный каталог, что означает, что оно перестанет постоянно перезагружаться ?


Этот вопрос был дан в рамках 2-го сезона 2-го сезона «Могу я задать вопрос». Если вы хотите, чтобы мы обсудили этот ответ в полном объеме, вы можете посмотреть видео здесь: https://youtu.be/9kMGMK9Ur4E

...