首页 > 解决方案 > 仅在第一次运行时调用 Jekyll 生成器插件,而不是在重新生成时调用

问题描述

我为我的 Jekyll 网站编写了一个生成器插件。它发出一个 API 请求来收集一些必要的数据来帮助构建。

--livereload在运行jekyll serve本地开发时使用。每次我保存文件并重新生成站点时,似乎都会调用生成器。这使用了我的生成器中发出的大量 API 请求。

我只需要发出一次 API 请求。有没有办法让生成器知道它被调用了多少次,这样我就可以运行一次而不是在后续的世代中运行它?

这是我的生成器插件的总体印象:

  class CloudinaryContent < Jekyll::Generator
    safe true

    def fetch(uri, env)
      # Make requests
    end

    # Fetch data before generating site
    def generate(site)
      require 'uri'
      require 'net/https'
      require 'json'

      # fetch data and store in global
      # variable for other plugins to use
      $site_data = fetch()
    end
  end

这类似于避免在 Jekyll Ruby 插件中重复调用 API,除了我在生成器中发出 API 请求,并且我只想在第一次调用生成器时调用生成器jekyll serve,而不是在本地开发期间文件更改时的后续重新加载期间.

标签: jekyll

解决方案


我设法实现了我的目标,但不是以一种优雅的方式。我添加了一个名为的计数器变量,它在每次调用生成器时@render_count开始并递减。1

我添加了一个条件来检查计数器是否低于1,如果条件通过则立即返回。这是一个示例:

def generate(site)
  if (!defined?@render_count)
    @render_count = 1
  end

  if @render_count < 1
    Jekyll.logger.info('already fetched data')
    return
  end

  # Perform business logic, set global variables
  ...

  Jekyll.logger.info('Data fetched successfully.')
  @render_count = @render_count - 1
end

我也尝试使用:pre-render hook,但它的行为与 Generator 插件过于相似,因为它在每次重新渲染时都会被调用。


推荐阅读