是否可以编译Symfony2assetic:dump并部署它,而不是在服务器上运行它


Is it possible to compile Symfony2 assetic:dump and deploy that rather than run it on the server?

我的生产服务器出现问题,其中assetic:dump在Capifony部署中超时(但并非总是如此)。

在本地运行assetic:dump是可以的。此外,部署到另一个登台服务器(功能要差得多)也没问题。

为了解决这个问题(并加快部署),我想知道是否有可能在部署之前运行assetic:dump,并将这些符合要求的资产与部署的其余部分一起发送?

这有点棘手,我也在尝试这样做(java在我的服务器上无法正常工作,因此部署失败)。

问题是,Capifony是从源代码管理存储库中部署的,通常转储的资产不在存储库中(而且不应该)。

因此,我想唯一的方法是创建一个Capistrano任务(Capifony基于Capistrano),该任务将转储资产并在服务器上进行rsync。

编辑:这是我的尝试编辑:它确实有效,我回答问题后一直在使用它。

我相信有很多可能的改进,我不是一个ruby的人,我也不是一个shell脚本的人。

在deploy.rb中,您可以添加两个任务:

before "deploy:update_code", "deploy:dump_assetic_locally"
after "deploy:update_code", "deploy:rsync_local_assets_to_server"

与这些任务相关的代码(在同一文件中):

namespace :deploy do
  task :dump_assetic_locally, :roles => :web do
    run_locally "php app/console assetic:dump --env=prod"
  end
  task :rsync_local_assets_to_server, :roles => :web do
    finder_options = {:except => { :no_release => true }}
    find_servers(finder_options).each {|s| run_locally "rsync -az --delete --rsh='ssh -p #{ssh_port(s)}' #{local_web_path}/js/ #{rsync_host(s)}:#{release_path}/web/js/" }
    find_servers(finder_options).each {|s| run_locally "rsync -az --delete --rsh='ssh -p #{ssh_port(s)}' #{local_web_path}/css/ #{rsync_host(s)}:#{release_path}/web/css/" }
  end
  def local_web_path
    File.expand_path("web")
  end
  def rsync_host(server)
    :user ? "#{user}@#{server.host}" : server.host
  end
  def ssh_port(server)
    server.port || ssh_options[:port] || 22
  end
end

命令assetic:dump从当前环境中可用的所有捆绑包中获取资产,并将它们放置在web/bundles中(或您指定的位置)。在本地执行此操作,然后只移动文件应该没有问题。

您应该使用env=prod选项运行该命令,以确保生成生产中所需的所有捆绑包。您可能还想在运行该命令之前清理web/bundles,这样就不会出现只在开发中使用的bundle的资产(例如profiler)。

我只需在本地运行命令进行测试,从生产中下载资产并进行比较。当css和js被提供给客户端时,我现在想不出什么了,在不同的机器上生成时应该不会有什么不同,但我可能错了。

非常简单添加到您的deploy.rb

set :dump_assetic_assets, true