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 = "" tweets = @client.user_timeline(@user) for i in 0 ... @count.to_i out = out + "- " + markdown.render(tweets[i].text) + " " + tweets[i].created_at.strftime("%I:%M %Y/%m/%d") + " " + "
" end 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
对象的实例变量, 而不是作为require
的TwitterFeed
实例的实例变量叫做表格。
你可以做一些事情,比如将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"))