【问题标题】:custom rake task for precompile assets locally rails 3.2.8本地预编译资产的自定义 rake 任务 rails 3.2.8
【发布时间】:2012-12-19 03:11:31
【问题描述】:

我需要在本地机器上预编译资产,并在使用 capistrano 进行部署后预编译资产。

我已经添加到development.rb:

config.assets.prefix = "/dev-assets"

另外,我已经添加到application.rb

config.assets.initialize_on_precompile = false

而不是手动执行rake assets:precompile,我想让capistrano文件的这个过程自动化,清理资产,上传......等等。我已经尝试过这个自定义任务

namespace :assets do
    task :precompile, :roles => :web, :except => { :no_release => true } do
      from = source.next_revision(current_revision)
      if capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l").to_i > 0
        run_locally "bundle exec rake assets:precompile"
        run_locally "rsync -zvrh --progress -e 'ssh -i #{ssh_options[:keys][0]}' public/assets #{user}{server}:#{shared_path}"
        puts "cleaning up locally compiled assets"
        run_locally "bundle exec rake assets:clean"
      else
        puts "Skipping asset pre-compilation because there were no asset changes"
      end
    end
  end

但我得到一个错误:

/config/deploy.rb:73:in `block (3 levels) in load': undefined method `[]' for nil:NilClass (NoMethodError)

如何在本地和使用 capistrano 上传后预编译资产?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 capistrano


    【解决方案1】:

    问题已解决:

    这是我的自定义任务工作正常:

     namespace :assets do
        task :precompile, :roles => :web, :except => { :no_release => true } do
          from = source.next_revision(current_revision)
          if capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l").to_i > 0
            run_locally("rm -rf public/assets/*") 
            run_locally "bundle exec rake assets:precompile"
            find_servers_for_task(current_task).each do |server|
             run_locally "rsync -vr --exclude='.DS_Store' public/assets #{user}@#{server.host}:#{shared_path}/"
            end
          else
            puts.info "Skipping asset pre-compilation because there were no asset changes"
          end
        end
      end
    

    【讨论】:

      【解决方案2】:

      看起来else 块中的logger.info 是问题所在。

      如果您出于其他原因需要 Capistrano 中的记录器,您可能需要手动初始化它,因为您实际上并未在服务器中运行。但是打印到控制台可能会更容易(就像您对上面的其他消息所做的那样

      替换

      logger.info "Skipping ..."
      

      puts "Skipping ..."
      

      【讨论】:

      • 谢谢,但我已经编辑了问题,错误与其他错误不同。谢谢!
      • 您能提供更多有关该错误的上下文吗?很明显,您的 deploy.rb 脚本正在尝试访问不存在的东西(比如可能是环境哈希?)您的部署脚本在错误发生的位置 73 附近是什么样的?
      • 我已经修复了这个错误。修复在下一个回复中。非常感谢!
      猜你喜欢
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多