是否有可能编译Symfony2资产:转储和部署而不是在服务器上运行它?

时间:2012-09-04 10:45:17

标签: php deployment symfony assetic capifony

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

在本地运行assetic:dump很好。也可以部署到不同的登台(功能更弱)服务器。

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

3 个答案:

答案 0 :(得分:7)

这有点棘手,我也试图这样做(java在我的服务器上运行不正常,因此部署失败)。

问题是Capifony从源控制存储库部署,并且通常转储的资产不在存储库中(并且它们不应该)。

所以我想这样做的唯一方法是创建一个Capistrano任务(Capifony基于Capistrano),它将转储资产并将它们rsync在服务器上。

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

我确信有很多可能的改进,我不是一个红宝石家伙,我也不是一个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

答案 1 :(得分:0)

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

您应该使用env=prod选项运行命令,以确保生成生产中所需的所有捆绑包。您还想在运行命令之前清除web/bundles,以便不存在仅在开发中使用的包的资产(例如,探查器)。

我只是通过在本地运行命令来进行测试,从生产中下载资产并进行比较。我现在无法想到任何事情,因为css和js被提供给客户端,并且在不同的机器上生成时不应该有所不同,但我可能是错的。

答案 2 :(得分:-1)

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

set :dump_assetic_assets, true