Jekyll扩展调用外部脚本

我写了一个简单的Jekyll插件来使用twitter gem来推送我的推文(见下文)。 我想在我的开放Github网站上保留插件的ruby脚本,但是在最近对twitter API的更改之后,gem现在需要身份validation凭据。

require 'twitter' # Twitter API require 'redcarpet' # Formatting links module Jekyll class TwitterFeed  true, :space_after_headers => true) ## Attempt to load credentials externally here: require '~/.twitter_auth.rb' out = "" end end end Liquid::Template.register_tag('twitter_feed', Jekyll::TwitterFeed) 

如果我更换线路

  require '~/.twitter_auth.rb' 

其中twitter_auth.rb包含以下内容:

 require 'twitter' @client = Twitter::Client.new( :consumer_key => "CEoYXXXXXXXXXXX", :consumer_secret => "apnHXXXXXXXXXXXXXXXXXXXXXXXX", :oauth_token => "105XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", :oauth_token_secret => "BJ7AlXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ) 

如果我将这些内容直接放在上面的脚本中,那么我的插件脚本就可以了。 但是,当我将它们移动到外部文件并尝试如图所示读取它们时,Jekyll无法进行身份validation。 当我从irb调用它时,该函数似乎工作正常,所以我不确定为什么它在Jekyll构建期间不起作用。

我想你可能会对require如何工作感到困惑。 当你调用require ,首先Ruby检查文件是否已被要求,如果是,它只是直接返回。 如果没有,则运行该文件的内容,但不与require语句在同一范围内。 换句话说,使用require与将require语句替换为文件内容(例如,C的#include工作)不同。

在您的情况下,当您需要~/.twitter_auth.rb文件时,正在创建@client实例变量,但是作为顶级main对象的实例变量, 而不是作为requireTwitterFeed实例的实例变量叫做表格。

可以做一些事情,比如将Twitter::Client对象分配给一个常量,然后你可以从render方法中引用它:

 MyClient = Twitter::Client.new{... 

然后

 require '~/twitter_auth.rb' @client = MyClient ... 

我只是建议这是对require发生的事情的解释,这不是一个好的技巧。

我认为,更好的选择是将您的凭据保存在主目录中的简单数据格式中,然后从脚本中读取它们并使用它们创建Twitter客户端。 在这种情况下,Yaml可能会完成这项工作。

首先用~/twitter_auth.rb替换你的~/twitter_auth.yaml ,看起来像:

 :consumer_key: "CEoYXXXXXXXXXXX" :consumer_secret: "apnHXXXXXXXXXXXXXXXXXXXXXXXX" :oauth_token: "105XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" :oauth_token_secret: "BJ7AlXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 

然后在你的类中requre "~/twitter_auth.rb" ,替换为(你还需要在文件顶部require 'yaml' ):

 @client = Twitter::Client.new(YAML.load_file("~/twitter_auth.yaml"))