我的环境
香草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它会回应我.
为什么这不起作用?
我编写了一个自定义数据库适配器,可以在rails服务器运行时正常有效地工作.我现在想添加用于创建,删除和迁移数据库的常用rake任务定义.
我想实现:
db:[drop|create|migrate]
Run Code Online (Sandbox Code Playgroud)
如何使用我的gem打包这些定义,以便它们覆盖使用gem的任何人的默认定义?
我查看了其他适配器的源代码,但所有rake任务逻辑似乎都被烘焙到active_record本身,每个任务只是打开适配器名称.
如何指定将我的数据库转储/加载到yaml的目录?
rake db:data:dump_dir
Run Code Online (Sandbox Code Playgroud)
创建
db/2011-08-31_14:10:57_+0100/
Run Code Online (Sandbox Code Playgroud)
和
rake db:data:load_dir
No such file or directory - <RAILS_ROOT>/db/base
Run Code Online (Sandbox Code Playgroud)
我的问题是你是否可以指定转储到/加载的目录名称以及如何?
谢谢
我可以调用Rake任务并设置一个像这样的环境变量:
$ ONE=1 rake temp:both
Run Code Online (Sandbox Code Playgroud)
但是我如何设置两个环境变量?
这不起作用:
$ ONE=1 TWO=2 rake temp:both
Run Code Online (Sandbox Code Playgroud)
这有效,但令人困惑的是:
$ ONE=1 rake temp:both TWO=2
Run Code Online (Sandbox Code Playgroud)
如何在通话之前传递多个环境rake?
这是我的佣金任务
namespace :users do
task :change_role, [:role] => :environment do |t, args|
puts args.role
end
end
Run Code Online (Sandbox Code Playgroud)
我这样称呼它:
rake users:change_role["role"] 但是我收到了这个错误 no matches found: users:change_role["role"]
我有一个使用资产管道的Ruby 2.1/Rails 3.2应用程序.我们还使用了一个脆弱的(alpha)gem,导致"rake assets:precompile"有时失败.我想编写一个rspec测试,确保在我们提交代码之前,这个rake任务总是通过.
我在spec/asset_precompile_spec.rb中编写了一个测试,如下所示:
require 'spec_helper'
require 'rake'
describe 'assets:precompile' do
before { MyApp::Application.load_tasks }
it { expect { Rake::Task['assets:precompile'].invoke }.not_to raise_exception }
end
Run Code Online (Sandbox Code Playgroud)
然后我使用命令行运行它
rspec spec/lib/assets_precompile_spec.rb
Run Code Online (Sandbox Code Playgroud)
我得到的输出看起来像这样:
1) assets:precompile
Failure/Error: it { expect { Rake::Task['assets:precompile'].invoke }.not_to raise_exception }
expected no Exception, got #<RuntimeError: Command failed with status (1): [/home/railsdev/.rvm/rubies/ruby-2.1.2/bin/...]> with backtrace:
# ./spec/lib/assets_precompile_spec.rb:7:in `block (3 levels) in <top (required)>'
# ./spec/lib/assets_precompile_spec.rb:7:in `block (2 levels) in <top (required)>'
# ./spec/lib/assets_precompile_spec.rb:7:in `block (2 levels) in <top (required)>'
Finished in 0.71247 …Run Code Online (Sandbox Code Playgroud) ruby-on-rails rake-task rspec-rails ruby-on-rails-3.2 ruby-2.1
我有一个rake任务测试,我按照我在网上找到的唯一例子进行设置.
它看起来像这样:
require 'test_helper'
require 'minitest/mock'
require 'rake'
class TestScrapeWelcome < ActiveSupport::TestCase
def setup
Rake.application.init
Rake.application.load_rakefile
@task = Rake::Task['scrape:scrape']
@task.reenable
end
def teardown
Rake::Task.clear
end
test "scraping text and sending to elasticsearch" do
mocked_client = Minitest::Mock.new
get_fixtures.each_with_index do |arg,i|
mocked_client.expect :index, :return_value, [index: "test", type: 'welcome', id: i, body: arg]
end
Elasticsearch::Model.stub :client, mocked_client do
@task.invoke
end
assert mocked_client.verify
end
private
def get_fixtures
(0..11).map { |i|
File.read("test/fixtures/scrape/index_#{i}.json")
}
end
end
Run Code Online (Sandbox Code Playgroud)
但是一旦任务开始运行,它再次开始运行而没有我做任何事情(puts在@task.invoke显示之前和之后打印任务只运行一次).
我正确配置了环境以在 VS Code 中调试 Rails 应用程序。
它适用于调试 Rails Server。当我开始调试时,它会启动服务器并在我标记的断点处停止。
但是,我不知道如何调试本地文件,例如 rake 任务。它甚至运行任务,但不会在断点处停止。
以下是我如何设置我的环境。
Ubuntu running on WSL2.
VSCode running on windows
Run Code Online (Sandbox Code Playgroud)
安装了扩展:
Remote - WSL from Microsoft
Ruby from PengLv
Run Code Online (Sandbox Code Playgroud)
安装的宝石:
gem install ruby-debug-ide
gem install debase
Run Code Online (Sandbox Code Playgroud)
宝石文件:
gem 'ruby-debug-ide'
gem 'debase'`
Run Code Online (Sandbox Code Playgroud)
/.vscode/launch.json 中调试本地文件的配置:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Rake fd:test",
"type": "Ruby",
"request": "launch",
"cwd": …Run Code Online (Sandbox Code Playgroud) rake-task ×10
rake ×7
ruby ×3
activerecord ×1
bundle ×1
debugging ×1
minitest ×1
rspec-rails ×1
ruby-2.1 ×1
zsh ×1