Можно ли скомпилировать Symfony2 assets:dump и развернуть его, а не запускать на сервере?

У меня есть проблема на моем рабочем сервере, где assetic:dump истекает время развертывания Capifony (но не всегда).

Локальный запуск assetic:dump в порядке. Также можно выполнить развертывание на другом промежуточном (гораздо менее мощном) сервере.

Чтобы исправить это (и ускорить развертывание), мне было интересно, можно ли запустить assetic:dump перед развертыванием и просто отправить эти согласованные ресурсы вместе с остальной частью развертывания?


person ed209    schedule 04.09.2012    source источник
comment
Вы пробовали мое решение? Я считаю, что это мой лучший вклад в S.O., поэтому я был бы рад принять его, если бы он сработал :-)   -  person Julien    schedule 08.01.2013


Ответы (3)


Это немного сложно, я тоже пытаюсь это сделать (java не работает должным образом на моем сервере, поэтому развертывание не выполняется).

Проблема в том, что Capifony развертывается из репозитория системы управления версиями, и обычно сброшенные активы не находятся в репозитории (и не должны).

Поэтому я думаю, что единственный способ сделать это — создать задачу Capistrano (Capifony основана на Capistrano), которая будет выгружать активы и rsync их на сервере.

Изменить : Вот моя попытка Изменить : Это работает, я использую его с тех пор, как ответил на вопрос.

Я уверен, что есть много возможных улучшений, я не специалист по рубинам, я также не специалист по сценариям оболочки.

В вашем 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
person Julien    schedule 11.12.2012

Команда assetic:dump берет активы из всех пакетов, доступных в текущей среде, и помещает их в web/bundles (или туда, куда вы указываете). Не должно быть проблем с тем, чтобы сделать это локально, а затем просто переместить файлы.

Вы должны запустить команду с параметром env=prod, чтобы гарантировать создание всех пакетов, необходимых для производства. Вы также можете очистить web/bundles перед запуском команды, чтобы ресурсы для пакетов, которые используются только в разработке (например, профилировщик), не присутствовали.

Я бы просто провел тест, запустив команду локально, загрузив активы из производства и сравнив их. Я не могу сейчас ничего придумать, поскольку css и js доставляются клиенту и не должны отличаться при создании на разных машинах, но я могу ошибаться.

person Sgoettschkes    schedule 05.09.2012

Очень просто добавить в свой deploy.rb

set :dump_assetic_assets, true
person liuggio    schedule 02.08.2014