Capistrano编译资产错误 - 资产:预编译:nondigest?
我的应用程序似乎被正确部署,但我得到这个错误:Capistrano编译资产错误 - 资产:预编译:nondigest?
* executing "cd /home/deploy/tomahawk/releases/20120208222225 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile"
servers: ["ip_address"]
[ip_address] executing command
*** [err :: ip_address] /opt/ruby/bin/ruby /opt/ruby/bin/rake assets:precompile:nondigest RAILS_ENV=production RAILS_GROUPS=assets
我在这里试图解决方案,试图编译资产:http://lassebunk.dk/2011/09/03/getting-your-assets-to-work-when-upgrading-to-rails-3-1/
这里:http://railsmonkey.net/2011/08/deploying-rails-3-1-applications-with-capistrano/
而且在这里:http://dev.af83.com/2011/09/30/capistrano-rails-3-1-assets-can-be-tricky.html
这里是我的deploy.rb:
require "bundler/capistrano"
load 'deploy/assets'
set :default_environment, {
'PATH' => "/opt/ruby/bin/:$PATH"
}
set :application, "tomahawk"
set :repository, "repo_goes_here"
set :deploy_to, "/home/deploy/#{application}"
set :rails_env, 'production'
set :branch, "master"
set :scm, :git
set :user, "deploy"
set :runner, "deploy"
set :use_sudo, true
role :web, "my_ip"
role :app, "my_ip"
role :db, "my_ip", :primary => true
set :normalize_asset_timestamps, false
after "deploy", "deploy:cleanup"
namespace :deploy do
desc "Restarting mod_rails with restart.txt"
task :restart, :roles => :app, :except => { :no_release => true } do
run "touch #{current_path}/tmp/restart.txt"
end
[:start, :stop].each do |t|
desc "#{t} task is a no-op with mod_rails"
task t, :roles => :domain do ; end
end
end
task :after_update_code do
run "ln -nfs #{deploy_to}/shared/config/database.yml #{release_path}/config/database.yml"
end
我后来注意到,Capistrano的无法删除旧版本中,我得到了一个错误:
*** [err :: ip_address] sudo: no tty present and no askpass program specified
我发现关于此错误此链接: http://www.mail-archive.com/[email protected]/msg07323.html
我不得不加入这一行我的部署文件:
default_run_options[:pty] = true
这也解决了我越来越奇怪的错误。
官方解释,我不明白:)
没有默认PTY。在2.1之前,Capistrano会为它执行的每个命令请求一个伪tty。这具有导致用户的配置文件脚本不被加载的副作用。好吧,不要再!从2.1开始,Capistrano不再要求每个命令都有一个pty,这意味着你的.profile(或.bashrc,或其他)将被正确加载到每个命令上!但是请注意,有些系统已经报告过,当某个pty未分配时,某些命令会自动进入非交互模式。如果你看不到像以前那样的命令提示符,就像svn或passwd一样,你可以通过在你的capfile中添加以下行来返回到以前的行为:default_run_options [:pty] = true
先不要忘了添加下面
group :production do
gem 'therubyracer'
gem 'execjs'
end
那么创业板的冠文件只是在你的after_update_code加入这一行
run "cd #{release_path}; rake assets:precompile RAILS_ENV=production "
这个工作对我罚款;)
欢呼声,
Gregory HORION
嘿伙计,我会建议你不要显示你的ip在你的消息中,这可能会导致一些攻击你的服务器;)欢呼 – metakungfu 2012-02-17 09:06:11
Woops!:)得看看复制和粘贴! – fatfrog 2012-02-18 04:05:03
我有同样的问题。我已将此添加到我的部署中。RB(用于添加选项 '--trace'):
namespace :deploy do
namespace :assets do
task :precompile, :roles => :web, :except => { :no_release => true } do
run "cd #{current_path} && #{rake} RAILS_ENV=#{rails_env} RAILS_GROUPS=assets assets:precompile --trace"
end
end
end
和错误似乎只是通知:
*** [err :: my-server] ** Invoke assets:precompile (first_time)
...
下面是我工作:
1)添加RVM-Capistrano酒店您在CONFG的Gemfile
2)/部署,添加行:
require 'rvm/capistrano'
set :rvm_ruby_string, '1.9.2' # Set to your version number
3)您可能还需要设置:rvm_type和:rvm_bin_path。详见this Ninjahideout blog。
4)apt-get的/ yum的服务器
上安装的NodeJS(见我回答这个related * question。)
你看到的信息就是rake assets:precompile
输出。
当您运行rake assets:precompile
,如何避免违约输出
的解决方案是添加-q
behand你的命令,
分析如下,如果你想看到:
# :gem_path/actionpack/lib/sprockets/assets.rake
namespace :assets do
# task entry, it will call invoke_or_reboot_rake_task
task :precompile do
invoke_or_reboot_rake_task "assets:precompile:all"
end
# it will call ruby_rake_task
def invoke_or_reboot_rake_task(task)
ruby_rake_task task
end
# it will call ruby
def ruby_rake_task(task, fork = true)
env = ENV['RAILS_ENV'] || 'production'
groups = ENV['RAILS_GROUPS'] || 'assets'
args = [$0, task,"RAILS_ENV=#{env}","RAILS_GROUPS=#{groups}"]
ruby(*args)
end
end
# :gem_path/rake/file_utils.rb
module FileUtils
# it will call sh
def ruby(*args,&block)
options = (Hash === args.last) ? args.pop : {}
sh(*([RUBY] + args + [options]), &block)
end
# it will call set_verbose_option
# and if options[:verbose] == true, it do not output cmd
# but default of options[:verbose] is an object
def sh(*cmd, &block)
# ...
set_verbose_option(options)
# ...
Rake.rake_output_message cmd.join(" ") if options[:verbose]
# ...
end
# default of options[:verbose] is Rake::FileUtilsExt::DEFAULT, which is an object
def set_verbose_option(options) # :nodoc:
unless options.key? :verbose
options[:verbose] =
Rake::FileUtilsExt.verbose_flag == Rake::FileUtilsExt::DEFAULT ||
Rake::FileUtilsExt.verbose_flag
end
end
end
# :gem_path/rake/file_utils_ext.rb
module Rake
module FileUtilsExt
DEFAULT = Object.new
end
end
# :gem_path/rake/application.rb
# the only to solve the disgusting output when run `rake assets:precompile`
# is add a `-q` option.
['--quiet', '-q',
"Do not log messages to standard output.",
lambda { |value| Rake.verbose(false) }
],
['--verbose', '-v',
"Log message to standard output.",
lambda { |value| Rake.verbose(true) }
],
部署我的rails 3.1应用程序时,我完全一样。我认为这是隐藏在[sprocket rake任务](https://github.com/rails/rails/blob/master/actionpack/lib/sprockets/assets.rake)的地方,但我没有看到它。难道预编译:assets:nondigest'任务会向stderr或其他东西发出警告,这是capistrano拾取的吗? – HectorMalot 2012-02-09 10:52:07
为了说实话,这个非消化的东西有点超出了我的理解范围(仍然包裹着预编译的头部:) - 但是我向一位朋友展示了这一点,他说这个......“我不认为这些错误在所有 我认为输出结果搞砸了,认为它的错误流,当它使用正常的输出,只要部署完成你应该罚款,一个真正的错误停止执行 – fatfrog 2012-02-09 16:28:02