run rake task inside rails application

天大地大妈咪最大 提交于 2019-12-22 17:37:32

问题


I want to run asset precompile task inside the rails application,As I had many dependencies who will change the code,in that case all the time whenever they change i need to run the script as I cant give server access to them so I am providing the GUI for them from that they alone can run the script,so,I have built UI to run the task with some parameter like

system("Template='#{params[:template]}' Theme='#{params[:theme]}' rake assets:precompile)

I am getting two values from UI(params[:template],params[:theme]).Another thing i want to run this task in another path(site path) means Admin side UI is there that task should execute in Site directory,

  if(params[:theme_script] == "true")
      template=Template.where(:name => params[:template]).first
     if template
      theme = template.themes.where(:name => params[:theme]).first
      if theme
    #   Dir.chdir "#{THEMEPATH}"do
    #     `Template="#{template.name}" Theme="#{theme.name}" rake assets:precompile`
    #   end
    #      sleep 10
    #      system("#{Rails.root.to_s}/lib/shell_script.sh")
    #      RunRake.run_rake(template.name,theme.name)
    #   Dir.chdir "#{THEMEPATH}"do
    #     Rake::Task['assets:precompile'].invoke
    #   end
          ENV["Template"] = template.name
          ENV["Theme"] = theme.name
          precompile_task = "bundle exec rake assets:precompile --trace 2>&1"
          output = Dir.chdir(THEMEPATH) { %x[ #{precompile_task} ] }
          flash[:notice] = "Asset created successfully"
      else
        flash[:notice] = "U have enter invalid data"
      end
    else
      flash[:notice] = "U have enter invalid data"
    end
  end

This is my code am checking multiple condition and am allowing to execute the task.

I have tried this code by putting in controller and lib, but this is not working.

I have tried with shell script also.

Could please anyone can help me.


回答1:


You can just setup an environment variable for rails, and then issue #invoke method from a controller. So, prepare the files:

gemfile

gem 'rake'

config/initializers/rake.rb:

Rake.load_rakefile Rails.root.join( 'Rakefile' )

app/controllers/your_controller:

ENV["Template"] = template.name
ENV["Theme"] = theme.name
Rake::Task[ 'assets:precompile' ].invoke

Issue bundle install, then run console rails c, and type:

Rake::Task.tasks.map(&:name).grep 'assets:precompile'
# => ["assets:precompile"]

As you can see, the task assets:precompile is loaded successfully. Then just issue the action for the controller.

To run the task for an other rails app you shell run also the other ruby instance, similar to as you had done:

system( "other_app_run.sh '#{template.name}' '${theme.name}'" )

other_app_run.sh:

#!/bin/bash

source "$HOME/.rvm/scripts/rvm"
cd /other/app/path
export Template="$1"
export Theme="$2"
rake assets:precompile


来源:https://stackoverflow.com/questions/21456538/run-rake-task-inside-rails-application

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!