Ember.js 在repo插件中,在构建时写入公共文件会导致服务器上无休止的构建循环

Ember.js 在repo插件中,在构建时写入公共文件会导致服务器上无休止的构建循环,ember.js,broccolijs,Ember.js,Broccolijs,我在向appDir/public发送回购插件时遇到困难。我想做的是在每个构建中编写一个JSON文件,将其包含在应用程序/dist中。我遇到的问题是,当运行“ember serve”时,文件监视程序会检测到新文件并再次重建,从而导致无休止的循环 我曾尝试使用preBuild()和postBuild()钩子编写JSON文件,保存到/public,但在构建之后,观察者会检测到它并一遍又一遍地重建,每次都会再次编写一个新文件。我还试着使用我的插件/公用文件夹,并将其写入,同样的事情 唯一部分起作用的是在

我在向appDir/public发送回购插件时遇到困难。我想做的是在每个构建中编写一个JSON文件,将其包含在应用程序/dist中。我遇到的问题是,当运行“ember serve”时,文件监视程序会检测到新文件并再次重建,从而导致无休止的循环

我曾尝试使用preBuild()和postBuild()钩子编写JSON文件,保存到/public,但在构建之后,观察者会检测到它并一遍又一遍地重建,每次都会再次编写一个新文件。我还试着使用我的插件/公用文件夹,并将其写入,同样的事情

唯一部分起作用的是在init()上编写,这很好,只是我没有看到使用ember Service所做的更改

我确实尝试过使用treeForPublic()方法,但没有进一步的改进。我可以编写文件并使用treeForPublic()。不过,在初始构建时,它只运行一次。这部分解决了我的问题,因为我将文件放入appdist文件夹。但我不认为ember serve会在应用程序中的后续文件更改中重新运行treeForPublic

有没有办法从文件监视忽略特定文件?但仍然允许文件包含到构建中?也许在ember cli构建中有一个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);
},
更新日期:2019年5月20日

我应该在这一点上提出一个新问题

我在这里的目标是创建一个自动递增的版本号,该版本号可以在ember build和ember serve上进行更新。我在下面@real_ates答案下的评论有助于解释原因。最后,如果我只能在构建时使用它,那就完全可以了

来自@real_ate的答案非常有用,解决了无止境的循环问题,但它不在余烬发球上运行。也许这是做不到的,但我真的想知道哪种方式。我目前正在尝试更改环境变量,而不是使用treeforPublic()。我问了另外一个关于Ember环境的addon config()更新的问题:


我不知道是否可以将@real_ate的答案标记为可接受的解决方案,因为它不适用于余烬服务。这是非常有帮助和教育意义的

这是一个很好的问题,在处理西兰花时,人们常常会对这个问题感到困惑(我确信我过去曾被这个问题刺痛过)

您遇到的问题是,您的
treeForPublic()
实际上是在将一个文件写入源目录,然后使用
brocoli漏斗
选择新的自定义文件并将其包含在生成中。正确的方法是创建包含新文件的输出树。我将以下面的一个例子更详细地介绍:

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()
函数,它实际上只是
brocoli文件创建者
插件。以下是要放在文件顶部的导入:

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

现在,当您运行应用程序时,它将不再写入源目录,这意味着它将停止不断地重新加载抱歉,我花了很长时间才做出响应,不得不处理另一个项目。这是为了解决无休止的循环,太棒了!我只需要使用那个花椰菜文件创建者来编写json。这对于将文件放入树中非常有帮助,因此我也将在其他方面使用该技巧。然而,我还是有点犹豫不决,因为当ember在livereload上提供更新时,我看不到更新的JSON。我认为treeForPublic()只在初始构建时运行。我知道serve上的设置会更新,因为控制台中会显示preBuild()。但是writeFile()不会输出该文件。您能解释一下为什么需要在余烬服务期间更新JSON吗?一般来说,我对如何让它发挥作用的反应有点参差不齐。你在youtube的评论中也提到它应该用于自动递增的版本号,为什么要在本地开发过程中而不是在CI中使用它?是的,我真的很固执。我真的只需要建造它。这简直快把我逼疯了,我不能把它也端上来。生成编号的原因是什么?因为它很简单,我一眼就能看出我的应用程序是否更新了。这对我在开发期间更有帮助,因为很多时候我都没有在serve上显示更新,或者我有一些代码可以检查新版本并做其他事情。拥有一个递增的构建数量可以解决奇数情况。我通常会找到一个解决方法或更好的方法,但我喜欢有它可用。。。只是这个。。。在过去的2-3年里,我遇到过很多次这样的事情,我想,“老兄,有一个版本号会很方便,为什么安博不这么做呢?”所以有一天我忍不住不去挠痒痒,于是尝试了一些方法让它工作起来。哦我之所以这样做,部分原因是因为我使用的是服务人员。有很多次我不得不通过多次点击才发现我的应用程序由于软件原因甚至没有更新。最近我很烦。在我的应用程序状态栏上有一个版本号会非常简单和有用,即使是在服务上也是如此。是的,我现在几乎要从这个开始了。除非我可以得到更新,动态数据加载到ENV中,或者得到一个文件w