使用deploy.rb仅在更改时预编译rails资产,此任务总是跳过我的资产编译:(
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
什么可能导致这个完整的任务无法编译?它总是认为没有资产变化并抛出该消息。
我也从未真正理解过任务,例如source.log.local下面的内容是什么?
source.local.log
任何人都可以澄清任务命令的作用,并指出为什么它从未看到任何资产变化?谢谢
答案 0 :(得分:17)
它的作用:
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中执行此命令,并返回其输出'。有问题的命令引用了源的更改日志,将已部署的版本与当前版本进行比较(指定资产所在的路径为“重要”),并将其传递到字数统计工具(wc -l
)。 -l
选项表示它返回输出中行数的计数。因此,输出(由capture
返回)是这两个版本之间发生变化的文件名数。
如果该数字为零,则任何指定路径中的文件都没有更改,因此我们跳过预编译。
为什么不起作用
我不知道。代码本身似乎没有任何问题 - 它与我使用的代码片段相同,或多或少。您可以查看以下几项内容:
Capistrano是否知道您正在使用资产管道?检查你的Capfile。如果您没有load 'deploy/assets'
,那么部署甚至不会考虑编译您的资产。
事实上,您是否启用了资产管道?检查application.rb是否为config.assets.enabled = true
您是否指定了不正确的资产路径?代码正在检查vendor/assets/
和app/assets/
中的更改。如果您的资产位于其他地方(例如lib/assets
),则不会被注意到。 (如果是这种情况,您只需更改该行以包含正确的路径。
事实上,自上次部署以来,您是否更改过任何资产?我建议绕过对已更改资产的检查并强制预编译运行一次,然后重新打开检查并看到问题神奇地自行解决。在我的示例中,下面设置force_precompile = true
会这样做。
我使用的是什么:
这是我目前使用的版本。它可能会有所帮助。或不。原始版本的变化:
asset_locations
设置为资产所在的位置)force_precompile=true
以尝试运行检查,但无论如何都运行预编译)
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