Ruby on rails 3 Capistrano部署资产预编译从不编译资产,为什么?

Ruby on rails 3 Capistrano部署资产预编译从不编译资产,为什么?,ruby-on-rails-3,deployment,capistrano,asset-pipeline,precompile,Ruby On Rails 3,Deployment,Capistrano,Asset Pipeline,Precompile,使用deploy.rb仅在rails资产发生更改时预编译rails资产,此任务始终跳过对我的资产的编译:( 是什么导致此完整任务无法编译?它始终认为没有资产更改并抛出该消息 我也从来没有真正理解过这个任务,例如source.log.local下面指的是什么 source.local.log 有谁能解释一下任务命令的作用,并指出为什么它从未看到任何资产更改?谢谢 namespace :assets do task :precompile, :roles => :web, :except

使用deploy.rb仅在rails资产发生更改时预编译rails资产,此任务始终跳过对我的资产的编译:(

是什么导致此完整任务无法编译?它始终认为没有资产更改并抛出该消息

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

source.local.log

有谁能解释一下任务命令的作用,并指出为什么它从未看到任何资产更改?谢谢

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
from = source.next_revision(current_revision)
source
是通过SCM(git、svn等)看到的对源代码的引用。这将
设置为(基本上)当前部署的源代码版本

capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l")
capture
表示“在shell中执行此命令,并返回其输出”。该命令引用源代码的更改日志,将部署的版本与当前版本进行比较(指定“重要”资产所在的路径),并将其传递到字数工具(
wc-l
)。
-l
选项意味着它返回输出中的行数计数。因此,输出(由
capture
返回)是在这两个版本之间发生更改的文件名数

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

为什么不起作用:

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
from = source.next_revision(current_revision)
我不知道。代码本身似乎没有任何问题-或多或少都是我使用的同一个代码段。以下是一些您可以检查的内容:

<> L> >P>是否Castruo甚至知道你正在使用资产管道?检查你的CAPFILE。如果你没有<代码>加载“部署/资产”< /代码>,部署甚至不考虑编译你的资产。

  • 实际上,您是否启用了资产管道?请检查application.rb中的
    config.assets.enabled=true

  • 您是否指定了错误的资产路径?代码正在检查
    供应商/资产/
    应用程序/资产/
    中的更改。如果您的资产位于其他地方(
    库/资产
    ),它们将不会被注意到。(如果是这种情况,您可以更改该行以包含正确的路径。)

  • 事实上,自上次部署以来,您是否更改了任何资产?我建议您绕过已更改资产的检查,强制预编译运行一次,然后重新打开检查,并看到问题神奇地自行解决。在我下面的示例中,设置
    force\u precompile=true
    可以做到这一点

  • 我使用的内容:

    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
    
    from = source.next_revision(current_revision)
    
    这是我目前使用的版本。它可能有用。也可能没有。与原始版本相比的更改:

  • 一种更具可读性的指定资产路径的方法(如果您使用它,请记住将
    asset\u locations
    设置为资产所在的位置)
  • 强制预编译运行的一种简单方法(设置
    force\u precompile=true
    以尝试运行检查,但无论如何都要运行预编译)
  • 无论预编译是否运行,它都会打印出计数。我很高兴能得到一些输出,以确保检查正在运行
  • 如果在尝试比较文件时发生错误(例如,在全新项目中经常发生这种情况),它会打印错误,但仍会运行预编译

  • 哇,感谢您的超级写手!哇,再次感谢thx提供了一个更好的解决方案,并对其工作方式进行了完整的评论,您的帖子感觉就像呼吸了一口新鲜空气;)海象先生:
    force_compile
    是否应该设置为
    true
    ,以防出现错误?我有点被这一点弄糊涂了:不过谢谢你,当时部署是皇家皮塔。