我想在rails应用程序中运行资产预编译任务,因为我有许多依赖项会更改代码,在这种情况下,无论何时更改我需要运行脚本,因为我无法让服务器访问它们所以我正在为他们提供GUI,因为他们可以单独运行脚本,因此,我已经构建了UI来运行任务,例如
system("Template='#{params[:template]}' Theme='#{params[:theme]}' rake assets:precompile)
我从UI获取了两个值(params [:template],params [:theme])。我想在另一个路径(站点路径)中运行此任务的另一个意思是管理端UI是否应该执行任务网站目录,
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
这是我的代码我正在检查多个条件并允许执行任务。
我已经通过放入控制器和lib来尝试此代码,但这不起作用。
我也尝试过使用shell脚本。
可以请任何人都可以帮助我。
答案 0 :(得分:5)
您可以为rails设置环境变量,然后从控制器发出#invoke
方法。所以,准备文件:
<强> gemfile 强>
gem 'rake'
<强>配置/初始化/ rake.rb:强>
Rake.load_rakefile Rails.root.join( 'Rakefile' )
应用/控制器/ your_controller:强>
ENV["Template"] = template.name
ENV["Theme"] = theme.name
Rake::Task[ 'assets:precompile' ].invoke
问题bundle install
,然后运行控制台rails c
,并输入:
Rake::Task.tasks.map(&:name).grep 'assets:precompile'
# => ["assets:precompile"]
如您所见, assets:precompile
任务已成功加载。然后只为控制器发出动作。
要运行其他rails应用的任务,您还可以运行另一个ruby实例,类似于您的操作:
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