不可能invoke在循环内多次执行相同的rake任务.但是,我希望能够调用rake first并循环遍历数组并second使用不同的参数在每次迭代时调用.由于invoke只是第一次执行,我尝试使用execute,但Rake :: Task#execute不使用splat(*)运算符,只接受一个参数.
desc "first task"
task :first do
other_arg = "bar"
[1,2,3,4].each_with_index do |n,i|
if i == 0
Rake::Task["foo:second"].invoke(n,other_arg)
else
# this doesn't work
Rake::Task["foo:second"].execute(n,other_arg)
end
end
end
task :second, [:first_arg, :second_arg] => :prerequisite_task do |t,args|
puts args[:first_arg]
puts args[:second_arg]
# ...
end
Run Code Online (Sandbox Code Playgroud)
围绕它的一个方法就是将参数execute放入一个数组中并second检查args的结构,但这看起来好像是hackish.还有另一种(更好的?)方式来完成我想做的事情吗?
我正在尝试调试一个场景,其中delayed_job进程因某些Mysql2::Error: MySQL server has gone away错误而在某些情况下死亡.
我的设置有点复杂,但我试图将其简化为基础知识.类中的run方法ClustalwFlowTask作为后台作业处理.它基本上运行一个clustalw2命令(一个为DNA和蛋白质进行多序列比对的程序)
命令的详细信息和执行期间发生的任何错误都应该记录在flow_tasks表中,而不是被delayed_job捕获(请参阅update_attribute语句).
require 'open3'
class ClustalwFlowTask < FlowTask
def run
# setup code ------
# fasta is a file object
cmd = "clustalw2 -INFILE=#{fasta.path}"
Rails.logger.info "[INFO #{Time.now}] #{self} running #{cmd}"
#update_attribute(:command, cmd)
raw_stdin, raw_stdout, raw_stderr = Open3.popen3(cmd)
Rails.logger.info "*********** RAW STDERR: #{raw_stderr} ************"
stdin, stdout, stderr = [raw_stdin, raw_stdout, raw_stderr].map do |io|
s = io.read.strip rescue nil
io.close
s
end
Rails.logger.info "*************** #{stderr} *******************" …Run Code Online (Sandbox Code Playgroud) 我正在尝试重构我编写的一些自定义d3代码,通过引入dc.js来渲染一系列由交叉滤波器驱动的图表.
我的主要问题是我有一些dc.js不支持的图表类型(例如Sunburst Partition),我正在试图弄清楚如何与dc.js图表组一起渲染它们.
过滤单个dc.js图表将自动呈现/重绘属于同一chartGroup的所有其他图表.是否有可能以某种方式挂钩到全局重新渲染事件,以便我可以同时重新绘制非dc图表?
我知道每个单独的图表上都有听众,例如chart.on("postRender", function(chart){...}),似乎没有办法重新渲染一组图表.是否有一个良好的模式可以实现这一目标?
我有一个设置,其中cron作业定期从外部服务(Twilio)下载mp3文件,然后使用Paperclip将文件上传到Amazon S3.Resque在后台处理该过程.
以下是处理从Twilio下载以及随后附加到Paperclip的代码:
# Perform transfer from Twilio to S3
def self.perform(group_recording_id = nil)
gr = GroupRecording.find(group_recording_id)
# ...
recording = TwilioClient.account.recordings.get(gr.external_id)
if recording.present?
# ....
gr.audio_file = download_remote_file(gr.twilio_mp3_url)
gr.save
end
end
def download_remote_file(url)
io = open(URI.parse(url))
# overrides Paperclip::Upfile#original_filename
def io.original_filename
base_uri.path.split('/').last
end
io.original_filename.blank? ? nil : io
end
Run Code Online (Sandbox Code Playgroud)
这失败了EOFError:
EOFError
end of file reached
/usr/local/lib/ruby/1.9.1/openssl/buffering.rb:145:in `sysread_nonblock'
/usr/local/lib/ruby/1.9.1/openssl/buffering.rb:145:in `read_nonblock'
/usr/local/lib/ruby/1.9.1/net/protocol.rb:135:in `rbuf_fill'
/usr/local/lib/ruby/1.9.1/net/protocol.rb:116:in `readuntil'
/usr/local/lib/ruby/1.9.1/net/protocol.rb:126:in `readline'
/usr/local/lib/ruby/1.9.1/net/http.rb:2219:in `read_status_line'
/usr/local/lib/ruby/1.9.1/net/http.rb:2208:in `read_new'
/usr/local/lib/ruby/1.9.1/net/http.rb:1191:in `transport_request'
/usr/local/lib/ruby/1.9.1/net/http.rb:1177:in `request'
/app/vendor/bundle/ruby/1.9.1/gems/rest-client-1.6.7/lib/restclient/net_http_ext.rb:51:in `request'
/usr/local/lib/ruby/1.9.1/open-uri.rb:312:in `block …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过Rails 3模板设置RVM gemset,然后通过模板中的命令开始使用gemset并将gem安装到新的gemset(以app命名).这似乎不正常.新的宝石没有安装到gemset中,事实上gemset根本没有被创建.
以下是从模板文件中提取的一些相关代码:
rvmrc = <<-RVMRC
rvm_gemset_create_on_use_flag=1
rvm_trust_rvmrcs=1
rvm gemset use #{app_name}
RVMRC
create_file ".rvmrc", rvmrc
Run Code Online (Sandbox Code Playgroud)
然后,继续前进:
run "cd path/to/new/app"
run 'gem install bundler --pre'
run 'bundle install'
Run Code Online (Sandbox Code Playgroud)
我也尝试了不同的版本:
inside app_name do
run 'gem install bundler --pre'
run 'bundle install'
end
Run Code Online (Sandbox Code Playgroud)
第三个版本:
inside app_name do
run "rvm gemset create #{app_name} && rvm gemset use #{app_name}"
run 'gem install bundler --pre'
run 'bundle install'
end
Run Code Online (Sandbox Code Playgroud)
如果我只是在模板运行后进入控制台中的新应用程序文件夹,它的效果非常好.我收到了RVM消息:"info:现在使用gemset'test_app'." 如果我在那时运行bundle install命令,那么gem会正确地安装到新的gemset中,但是如果我只是从模板文件中运行那些命令,我就无法得到相同的结果.
应用生成器的日志说明了这一点:
run cd ~/rails3_sites/test_app from "."
run gem install bundler …Run Code Online (Sandbox Code Playgroud) 我需要一个正则表达式,可以在字符串中找到任何可能包含匹配括号的不匹配括号(打开或关闭).
这里存在stackoverflow的问题,但我还没有找到一个有效的基于正则表达式的解决方案.
我想出了一个正则表达式,\((?![^)]+\))使用负向前瞻找到了无与伦比的开放式括号,但我似乎无法找出无与伦比的闭合式支撑所需的相反的一个.
编辑:以上正则表达式找到无与伦比的开括号不能按预期工作.例如,它将错过多个开放式括号后面跟着一个右括号的情况(另见注释)
这是我在Rubular上一直在试验的测试字符串:
one) ((two) (three) four) (five)))
Run Code Online (Sandbox Code Playgroud)
请注意,该字符串可以包含任何类型的字符,包括引号,短划线等.