【问题标题】:run rake task inside rails application在 Rails 应用程序中运行 rake 任务
【发布时间】:2014-01-30 12:27:32
【问题描述】:

我想在 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

这是我的代码正在检查多个条件并允许执行任务。

我已经通过放入控制器和库来尝试此代码,但这不起作用。

我也尝试过使用 shell 脚本。

请任何人都可以帮助我。

【问题讨论】:

  • 真的不是资产编译的用途。您应该在部署时通过构建脚本自动执行此操作,而不是手动执行此操作。您应该没有理由为此需要 GUI。
  • 感谢您的回复,因为我有很多依赖项会更改代码,在这种情况下,每当他们更改时,我都需要运行脚本,因为我无法让服务器访问它们,所以我为他们提供 GUI,他们可以单独运行脚本。
  • @МалъСкрылевъ 请帮助我如何传递参数?

标签: ruby-on-rails ruby ruby-on-rails-3.1 asset-pipeline rake-task


【解决方案1】:

您可以为 设置一个环境变量,然后从控制器发出#invoke 方法。所以,准备文件:

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

发出bundle install,然后运行控制台rails c,然后输入:

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

如您所见,任务assets:precompile 已成功加载。然后只需为控制器发出操作。

要为另一个 应用程序运行任务,您还需要运行另一个 实例,类似于您所做的:

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

【讨论】:

  • 我已经编辑了我的问题并发布了我的代码我是如何尝试的。请验证并帮助我。
  • @Kingston 好吧,问题是一样的,调用发生了什么?
  • 我遇到了很多错误 命令失败,状态为 (1): [/home/kingston/.rvm/rubies/ruby-1.9.3-p448/...] ,应用程序已经初始化., A SystemExit 发生在翻译#excecute: exit,,.... undefined method `each_logical_path' for nil:NilClass in admin side 我没有使用资产概念。所以 config.assets.enabled = false 在那里。我想目录没有改变。
  • 如果我在主题端运行任务意味着任务运行成功,但是我在管理端构建了没有资产概念的 GUI,现在尝试运行任务时出现什么问题管理端到主题端,时间目录没有改变。所以,我收到错误。
  • 你有什么概念?
猜你喜欢
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2015-05-07
  • 2015-04-15
  • 2016-03-09
  • 2011-08-04
相关资源
最近更新 更多