是否有可能以某种方式执行rake任务只有它还没有运行,我想使用cron执行一些rake任务但是rake任务不应该在前一次调用未完成时启动谢谢
我正在为我的项目使用Ruby Enterprise Edition.当我通过运行命令检查所有我的rake任务时rake -T,我收到以下错误消息:
You have already activated rake 0.9.2.2, but your Gemfile requires rake 0.9.2. Using bundle exec may solve this.
Run Code Online (Sandbox Code Playgroud)
错误消息暗示我可以使用bundle exec来解决问题,但我不确定如何?那么,如何摆脱这个错误信息?
- - - - - - - - - - - - - - - 更多 - - - - - - - - - - --------
我更喜欢更新我的Gemfile而不是运行bundle exec rake -T.但是当我打开我的项目Gemfile时,我没有在我的Gemfile中看到rake 0.9.2,为什么错误消息会抱怨我有它?我可以在哪里定义rake 0.9.2 ??
rake ruby-on-rails rake-task ruby-on-rails-3 ruby-on-rails-3.1
如何从Rake任务发送这样的查询到数据库服务器而不删除"每个"循环中的逐个记录?
delete from data
where uuid in (
select uuid
from data
group by uuid, raw, recdate
having count(*)>1
);
Run Code Online (Sandbox Code Playgroud) 我收到了错误
rake db:migrate --trace
rake aborted!
You have already activated rake 10.1.1, but your Gemfile requires rake 10.1.0. Using bundle exec may solve this.
/Users/iang/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:33:in `block in setup'
/Users/iang/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:19:in `setup'
/Users/iang/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler.rb:120:in `setup'
/Users/iang/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/setup.rb:7:in `<top (required)>'
/Users/iang/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:116:in `require'
/Users/iang/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:116:in `rescue in require'
/Users/iang/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:122:in `require'
/Users/iang/code/Projects/work/startco/config/boot.rb:4:in `<top (required)>'
/Users/iang/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:51:in `require'
/Users/iang/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:51:in `require'
/Users/iang/code/Projects/work/startco/config/application.rb:1:in `<top (required)>'
/Users/iang/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:51:in `require'
/Users/iang/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:51:in `require'
/Users/iang/code/Projects/work/startco/Rakefile:4:in `<top (required)>'
/Users/iang/.rvm/gems/ruby-2.0.0-p247/gems/rake-10.1.1/lib/rake/rake_module.rb:25:in `load'
/Users/iang/.rvm/gems/ruby-2.0.0-p247/gems/rake-10.1.1/lib/rake/rake_module.rb:25:in `load_rakefile'
/Users/iang/.rvm/gems/ruby-2.0.0-p247/gems/rake-10.1.1/lib/rake/application.rb:637:in `raw_load_rakefile'
/Users/iang/.rvm/gems/ruby-2.0.0-p247/gems/rake-10.1.1/lib/rake/application.rb:94:in `block in load_rakefile'
/Users/iang/.rvm/gems/ruby-2.0.0-p247/gems/rake-10.1.1/lib/rake/application.rb:165:in `standard_exception_handling'
/Users/iang/.rvm/gems/ruby-2.0.0-p247/gems/rake-10.1.1/lib/rake/application.rb:93:in `load_rakefile'
/Users/iang/.rvm/gems/ruby-2.0.0-p247/gems/rake-10.1.1/lib/rake/application.rb:77:in `block in run'
/Users/iang/.rvm/gems/ruby-2.0.0-p247/gems/rake-10.1.1/lib/rake/application.rb:165:in `standard_exception_handling' …Run Code Online (Sandbox Code Playgroud) 提供我试图用来解析参数的答案.我从那里简化了示例,我不得不添加两个以使其工作.OptionParserrakeARGV.shift
require 'optparse'
namespace :user do |args|
# Fix I hate to have here
puts "ARGV: #{ARGV}"
ARGV.shift
ARGV.shift
puts "ARGV: #{ARGV}"
desc 'Creates user account with given credentials: rake user:create'
# environment is required to have access to Rails models
task :create => :environment do
options = {}
OptionParser.new(args) do |opts|
opts.banner = "Usage: rake user:create [options]"
opts.on("-u", "--user {username}","Username") { |user| options[:user] = user }
end.parse!
puts "user: #{options[:user]}"
exit 0
end
end …Run Code Online (Sandbox Code Playgroud) 我的webapp需要加密其会话数据.我设置的是:
config/initializers/encryptor.rb:
require 'openssl'
require 'myapp/encryptor'
MyApp::Encryptor.config[ :random_key ] = OpenSSL::Random.random_bytes( 128 )
Session.delete_all
app/models/session.rb:
require 'attr_encrypted'
class Session < ActiveRecord::Base
attr_accessible :session_id, :data
attr_encryptor :data, :key => proc { MyApp::Encryptor.config[ :random_key ] }, :marshal => true
# Rest of model stuff
end
Run Code Online (Sandbox Code Playgroud)
一切都很好,并保证会话数据安全.这是问题:当我运行自定义rake任务时,它会加载初始化程序并清除所有会话.不好!
我可以在初始化程序中放置什么来确保它仅用于webapp初始化?或者,我可以在初始化程序中添加什么来使其不用于rake任务?
更新:好的,我现在所做的就是添加MYAPP_IN_RAKE = true unless defined? MYAPP_IN_RAKE到我的.rake文件中.然后在我的初始化程序中我做:
unless defined?( MYAPP_IN_RAKE ) && MYAPP_IN_RAKE
# Web only initialization
end
Run Code Online (Sandbox Code Playgroud)
似乎工作.但我愿意接受其他建议.
我有一个rails应用程序,它有一个特定的表,其中数据甚至结构是在rails和ruby之外动态生成的.这是一个设计,它是一个特殊的表,其中结构是从其他活动记录和关系中自包含的.对其起作用的模型也是原子的.所有这些都是设计和有目的的.我不想要这个表的特定结构,这意味着每次初始化表时列名和列数都会改变.如果表结构有变化,我可以管理对模型类的更改.
我的问题是rails迁移过程似乎妨碍了,我不想在迁移和回滚之间来回徘徊,只是为了让这个单个表的状态重置.
我正在寻找的行为实际上是每次我"生成"该表的数据时我想删除可能已经存在的表(在所有环境中:生产,开发和测试).
是否有明确的方法绕过迁移过程?或者创建一个独立于应用程序中其他迁移序列的特殊迁移?
整个数据库不是一次性的,但这一个表是.
关于如何实现这种行为的想法?
Rails 3,PostgreSQL数据库,git版本控制,heroku主机
我的环境
香草Ubuntu 12.10,没有rvm或renv.
> gem --version
1.8.23
> ruby --version
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
> bundle --version
Bundler version 1.2.1
Run Code Online (Sandbox Code Playgroud)
我的问题
我有一个rake任务来打包我的宝石并将它们上传到我的开发和生产服务器.问题是当Gemfile包含git或path gems时,rake任务失败.Bundler已经支持这些类型的宝石的包装,它在我的终端上工作得很好但是在运行rake任务时失败了,我找不到原因.
我的佣金任务
> cat lib/tasks/upload.rake
namespace :deploy do
desc "Package all gems and upload to remote server"
task :upload => [:environment] do |t, args|
if ! system("bundle package --all")
raise "TOTAL FAIL"
end
# Magic method to upload vendor/cache to remote server
end
end
Run Code Online (Sandbox Code Playgroud)
我的尝试
在终端中运行捆绑包工作:
> bundle package --all
....
Using bson (1.7.0) …Run Code Online (Sandbox Code Playgroud) 我一直在尝试运行rake db:test:clone_structure,但它一直无法重建数据库.我终于看了看任务本身:
task :clone_structure => [ "db:structure:dump", "db:test:load_structure" ]
Run Code Online (Sandbox Code Playgroud)
当我运行跟踪时,我注意到db:test:load_structure没有执行:
$ rake db:test:clone_structure --trace
** Invoke db:test:clone_structure (first_time)
** Invoke db:structure:dump (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:structure:dump
** Invoke db:test:purge (first_time)
** Invoke environment
** Execute db:test:purge
** Execute db:test:clone_structure
Run Code Online (Sandbox Code Playgroud)
现在,当我将clone_structure任务更改为调用时 load_structure ......
task :clone_structure => [ "db:structure:dump", "db:test:load_structure" ] do
db_namespace["test:load_structure"].invoke
end
Run Code Online (Sandbox Code Playgroud)
......一切都突然起作用!
$ rake db:test:prepare --trace
** Invoke db:test:clone_structure (first_time)
** Invoke db:structure:dump (first_time)
** Invoke …Run Code Online (Sandbox Code Playgroud) 好吧,我安装了elasticsearch-rails gem(版本0.1.5),我可以清楚地看到gem文件中的任务.
但是当我跑步的时候
bundle exec rake environment elasticsearch:import:model CLASS='Comment'
Run Code Online (Sandbox Code Playgroud)
我收到这个错误.
跑步rake environment -D并没有向我展示任务.
elasticsearch正在运行,如果我卷曲http://localhost:9200它会回应我.
为什么这不起作用?