gpt4 book ai didi

ruby-on-rails-3 - Capistrano 部署 Assets 预编译从不编译 Assets ,为什么?

转载 作者:行者123 更新时间:2023-12-04 07:14:42 27 4
gpt4 key购买 nike

仅在 rails Assets 发生变化时才使用 deploy.rb 对其进行预编译,此任务总是跳过我的 Assets 的编译 :(

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 %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile}
else
logger.info "Skipping asset pre-compilation because there were no asset changes"
end
end
end

什么会导致这个完整的任务无法编译?它总是认为没有 Assets 变化并抛出该消息。

我也从来没有真正理解这个任务,例如下面的 source.log.local 指的是什么?

source.local.log

谁能阐明任务命令的作用并提供一些指示,说明为什么它从未看到任何 Assets 更改?谢谢

最佳答案

它的作用:

from = source.next_revision(current_revision)

source 是对您的源代码的引用,如通过您的 SCM(git、svn 等)所见。这会将 from 设置为(本质上)当前部署的源代码版本。

capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l")

capture 表示“在 shell 中执行此命令,并返回其输出”。有问题的命令引用源更改日志,将已部署版本与当前版本进行比较(将 Assets 所在的路径指定为“重要”的路径),并将其传递到字数统计工具(wc - l). -l 选项表示它返回输出中的行数。因此,输出(由 capture 返回)是这两个版本之间发生变化的文件名的数量。

如果该数字为零,则任何指定路径中的文件均未更改,因此我们跳过预编译。

为什么不起作用:

我不知道。代码本身似乎没有任何问题 - 它或多或少与我使用的代码片段相同。您可以检查以下几项:

  1. Capistrano 是否知道您正在使用 Assets 管道?检查你的 Capfile。如果您没有 load 'deploy/assets' ,部署甚至不会考虑编译您的 Assets 。

  2. 您实际上启用了 Assets 管道吗?检查 application.rb 中的 config.assets.enabled = true

  3. 您是否指定了错误的 Assets 路径?该代码正在检查 vendor/assets/app/assets/ 中的更改。如果您的 Assets 位于其他地方(例如,lib/assets),它们将不会被注意到。 (如果是这种情况,您只需更改该行以包含正确的路径即可。

  4. 自上次部署以来,您实际上是否更改过任何 Assets ?我建议绕过对已更改 Assets 的检查并强制预编译运行一次,然后重新打开检查并看到问题神奇地自行解决。在我下面的示例中,设置 force_precompile = true 即可。

我用的是什么:

这是我目前使用的版本。这可能会有所帮助。或不。与原来相比的变化:

  1. 一种更易读的指定 Assets 路径的方式(如果您使用它,请记住将 asset_locations 设置为您的 Assets 所在的位置)
  2. 一种强制预编译运行的简单方法(设置 force_precompile=true 以尝试运行检查,但不管怎样都运行预编译)
  3. 它打印出预编译是否运行的计数。我很高兴收到一些输出以确保检查正在运行。
  4. 如果在尝试比较文件时发生错误(例如在全新项目中经常发生),它会打印错误但无论如何都会运行预编译。

.

  namespace :assets do
task :precompile, :roles => :web, :except => { :no_release => true } do
# Check if assets have changed. If not, don't run the precompile task - it takes a long time.
force_compile = false
changed_asset_count = 0
begin
from = source.next_revision(current_revision)
asset_locations = 'app/assets/ lib/assets vendor/assets'
changed_asset_count = capture("cd #{latest_release} && #{source.local.log(from)} #{asset_locations} | wc -l").to_i
rescue Exception => e
logger.info "Error: #{e}, forcing precompile"
force_compile = true
end
if changed_asset_count > 0 || force_compile
logger.info "#{changed_asset_count} assets have changed. Pre-compiling"
run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile}
else
logger.info "#{changed_asset_count} assets have changed. Skipping asset pre-compilation"
end
end
end

关于ruby-on-rails-3 - Capistrano 部署 Assets 预编译从不编译 Assets ,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12919509/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com