2013-07-19 118 views
0

我创建了一个完整的引擎打包成一个gem,它允许我快速部署CSS,图像,JS/JQuery项目以及一个对所有我的项目。在开发模式下,这一切都巧妙运作。 然而,试图预编译的资产在生产中使用抛出一个错误:ruby​​ rails 3.2 rake资产:针对引擎资产的预编译失败

# RAILS_ENV=production bundle exec rake assets:precompile 
/usr/local/bin/ruby /usr/local/bin/rake assets:precompile:all RAILS_ENV=production 

RAILS_GROUPS=assets 
rake aborted! 
couldn't find file 'my_stock.engine' 
    (in my_example_app/app/assets/javascripts/application.js:17) 

Tasks: TOP => assets:precompile:primary 
(See full trace by running task with --trace) 
rake aborted! 
Command failed with status (1): [/usr/local/bin/ruby /usr/local/bin/rake as...] 

Tasks: TOP => assets:precompile 
(See full trace by running task with --trace) 

我花了一点时间在这个问题抛出的网络搜索,但没有发现任何明显相关。我希望我只是忘记了在设置'my_stock.engine'或my_example_app时做些事情,因为这真的是我第一次尝试做这样的事情。

编辑:添加--trace结果

** Invoke assets:precompile (first_time) 
** Execute assets:precompile 
/usr/local/bin/ruby /usr/local/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets --trace 
** Invoke assets:precompile:all (first_time) 
** Execute assets:precompile:all 
** Invoke assets:precompile:primary (first_time) 
** Invoke assets:environment (first_time) 
** Execute assets:environment 
** Invoke environment (first_time) 
** Execute environment 
** Invoke tmp:cache:clear (first_time) 
** Execute tmp:cache:clear 
** Execute assets:precompile:primary 
rake aborted! 
couldn't find file 'my_stock.engine' 
    (in /opt/bv_applets/meetme_manager/app/assets/javascripts/application.js:17) 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/context.rb:102:in `resolve' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/context.rb:142:in `require_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/directive_processor.rb:215:in `process_require_directive' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/directive_processor.rb:165:in `block in process_directives' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/directive_processor.rb:163:in `each' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/directive_processor.rb:163:in `process_directives' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/directive_processor.rb:97:in `evaluate' 
/usr/local/lib/ruby/gems/1.9.1/gems/tilt-1.4.1/lib/tilt/template.rb:103:in `render' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/context.rb:193:in `block in evaluate' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/context.rb:190:in `each' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/context.rb:190:in `evaluate' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/processed_asset.rb:12:in `initialize' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:249:in `new' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:249:in `block in build_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:270:in `circular_call_protection' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:248:in `build_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/index.rb:93:in `block in build_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/caching.rb:19:in `cache_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/index.rb:92:in `build_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:169:in `find_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/index.rb:60:in `find_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/bundled_asset.rb:16:in `initialize' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:252:in `new' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:252:in `build_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/index.rb:93:in `block in build_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/caching.rb:19:in `cache_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/index.rb:92:in `build_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:169:in `find_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/index.rb:60:in `find_asset' 
/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/sprockets/static_compiler.rb:19:in `block in compile' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:219:in `block in each_logical_path' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:206:in `block (2 levels) in each_file' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:196:in `each' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:196:in `each_entry' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:204:in `block in each_file' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:203:in `each' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:203:in `each_file' 
/usr/local/lib/ruby/gems/1.9.1/gems/sprockets-2.2.2/lib/sprockets/base.rb:217:in `each_logical_path' 
/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/sprockets/static_compiler.rb:18:in `compile' 
/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/sprockets/assets.rake:56:in `internal_precompile' 
/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/sprockets/assets.rake:70:in `block (3 levels) in <top (required)>' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:236:in `call' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:236:in `block in execute' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:231:in `each' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:231:in `execute' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:175:in `block in invoke_with_call_chain' 
/usr/local/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:168:in `invoke_with_call_chain' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:161:in `invoke' 
/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/sprockets/assets.rake:60:in `block (3 levels) in <top (required)>' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:236:in `call' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:236:in `block in execute' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:231:in `each' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:231:in `execute' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:175:in `block in invoke_with_call_chain' 
/usr/local/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:168:in `invoke_with_call_chain' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:161:in `invoke' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:149:in `invoke_task' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `block (2 levels) in top_level' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `each' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `block in top_level' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:115:in `run_with_threads' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:100:in `top_level' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:78:in `block in run' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:165:in `standard_exception_handling' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:75:in `run' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/bin/rake:33:in `<top (required)>' 
/usr/local/bin/rake:23:in `load' 
/usr/local/bin/rake:23:in `<main>' 
Tasks: TOP => assets:precompile:primary 
rake aborted! 
Command failed with status (1): [/usr/local/bin/ruby /usr/local/bin/rake as...] 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/file_utils.rb:55:in `block in create_shell_runner' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/file_utils.rb:45:in `call' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/file_utils.rb:45:in `sh' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/file_utils_ext.rb:37:in `sh' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/file_utils.rb:82:in `ruby' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/file_utils_ext.rb:37:in `ruby' 
/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/sprockets/assets.rake:12:in `ruby_rake_task' 
/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/sprockets/assets.rake:21:in `invoke_or_reboot_rake_task' 
/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/sprockets/assets.rake:29:in `block (2 levels) in <top (required)>' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:236:in `call' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:236:in `block in execute' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:231:in `each' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:231:in `execute' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:175:in `block in invoke_with_call_chain' 
/usr/local/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:168:in `invoke_with_call_chain' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:161:in `invoke' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:149:in `invoke_task' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `block (2 levels) in top_level' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `each' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `block in top_level' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:115:in `run_with_threads' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:100:in `top_level' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:78:in `block in run' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:165:in `standard_exception_handling' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:75:in `run' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-10.1.0/bin/rake:33:in `<top (required)>' 
/usr/local/bin/rake:23:in `load' 
/usr/local/bin/rake:23:in `<main>' 
Tasks: TOP => assets:precompile 

/EDIT

EDIT2:进一步挖掘和错误,CONFIGS的观点:

my_example_app /应用/资产/ Java脚本/应用。 js

13: //= require jquery 
14: //= require jquery_ujs 
15: //= require jquery.ui.datepicker 
16: //= require_tree . 
17: //= require my_stock.engine 

The Rails Asset Pipeline Config Path:

$ be rails c 

------ 
Loading development environment (Rails 3.2.13) 
1.9.3-p392 :001 > y Rails.application.config.assets.paths 
--- 
- /my_example_app/app/assets/images 
- /my_example_app/app/assets/javascripts 
- /my_example_app/app/assets/stylesheets 
- /my_example_app/vendor/assets/javascripts 
- /my_example_app/vendor/assets/stylesheets 
- /.rvm/gems/ruby-1.9.3-p392/gems/jquery-rails-3.0.4/vendor/assets/javascripts 
- /.rvm/gems/ruby-1.9.3-p392/gems/jquery-ui-rails-4.0.3/app/assets/images 
- /.rvm/gems/ruby-1.9.3-p392/gems/jquery-ui-rails-4.0.3/app/assets/javascripts 
- /.rvm/gems/ruby-1.9.3-p392/gems/jquery-ui-rails-4.0.3/app/assets/stylesheets 
- /.rvm/gems/ruby-1.9.3-p392/gems/twitter-bootstrap-rails-2.2.7/app/assets/fonts 
- /.rvm/gems/ruby-1.9.3-p392/gems/twitter-bootstrap-rails-2.2.7/app/assets/images 
- /.rvm/gems/ruby-1.9.3-p392/gems/twitter-bootstrap-rails-2.2.7/app/assets/javascripts 
- /.rvm/gems/ruby-1.9.3-p392/gems/twitter-bootstrap-rails-2.2.7/app/assets/stylesheets 
- /.rvm/gems/ruby-1.9.3-p392/gems/coffee-rails-3.2.2/lib/assets/javascripts 
- /.rvm/gems/ruby-1.9.3-p392/gems/bootstrap-sass-2.3.2.1/vendor/assets/images 
- /.rvm/gems/ruby-1.9.3-p392/gems/bootstrap-sass-2.3.2.1/vendor/assets/javascripts 
- /.rvm/gems/ruby-1.9.3-p392/gems/bootstrap-sass-2.3.2.1/vendor/assets/stylesheets 
- /my_stock.engine/app/assets/images 
- /my_stock.engine/app/assets/javascripts 
- /my_stock.engine/app/assets/stylesheets 
=> nil 
1.9.3-p392 :002 > exit 

...所以 “my_stock.engine” 是在资产路径。

/EDIT2

预先感谢任何/所有帮助&建议!

+0

向我们展示跟踪将帮助许多其他人就您的应用程序失败的位置给出建议 – David

+0

完成。让我知道你的想法。 – MichelV69

回答

0

这里有几个问题你需要问问自己。无论您是否正确设置了引擎。我还没有涉足到建立一个Rails引擎,但是阅读ruby on rails指南:adding assets to your gems。它强调:

This gem contains an engine class which inherits from Rails::Engine. By doing this, Rails is informed that the directory for this gem may contain assets and the app/assets, lib/assets and vendor/assets directories of this engine are added to the search path of Sprockets.

你可以看到自己这一点:jQuery-rails。我对上述引用的理解告诉我们,通过让你的引擎类继承Rails引擎,它应该继承所有的Rails方法,并且正如它所说的那样,通知目录它可以包含资源。

而且这个你预编译时需要考虑到的另一件事是它也指出:

For faster asset precompiles, you can partially load your application by setting config.assets.initialize_on_precompile to false in config/application.rb, though in that case templates cannot see application objects or methods. Heroku requires this to be false.

另一个警告此提出的是下面的,我觉得这是发生在你:

If you set config.assets.initialize_on_precompile to false, be sure to test rake assets:precompile locally before deploying. It may expose bugs where your assets reference application objects or methods, since those are still in scope in development mode regardless of the value of this flag. Changing this flag also affects engines. Engines can define assets for precompilation as well. Since the complete environment is not loaded, engines (or other gems) will not be loaded, which can cause missing assets.

您可以在上面的引用中看到:1)将此设置为false可能会导致错误,因此您应该在本地进行测试。此外,它指出它会影响引擎。

主要部分

Engines can define assets for precompilation as well. Since the complete environment is not loaded, engines (or other gems) will not be loaded, which can cause missing assets.

所以说这一切我相信,如果你有config.assets.intialize_on_precompile设置为false,那么你的应用程序没有被启动。我希望这有助于解决问题,因为我确实从中学到了一些东西。

更新回答

你如何,包括您的应用程序引擎重要的是要正确指定路径依赖。由于来自跟踪的错误消息表明它可能不在您的应用程序中。请检查您无论是在路径

app/assets/javascript/my_stock_engine.js 
app/vendor/assets/javascript/my_stock_engine.js 
app/lib/assets/my_stock_engine.js 
my_stock_engine/app/assets/javascript/my_stock_engine.js 

在你的Gemfile也depneds上有my_stock_engine.js你是如何增加它这很可能将是via path: '/some/path'

+0

大卫你好。感谢您的意见和建议,但是,似乎没有任何问题。我刚刚更新了这个问题,并提供了一些新信息,这些信息是您的帖子指引我的。希望它会导致一个解决方案。 – MichelV69

+0

@ MichelV69'my_stock.engine.js'是以下任一项:'my_stock.engine.js','my_stock.engine.js','my_stock.engine.js'?因为肯定你的错误一定是来自这里。也是'/ my_stock.engine'中的宝石代码。这一切都取决于你如何在gemfile中添加gem。你最有可能通过路径:'/ some/path'' – David

+0

大卫:我想到了这个星期五晚些时候,并检查。果然,出于某种原因,'my_stock.engine.js'只是'my_stock.js'。在开发模式下,它运行得很好,但在生产模式下显式路径会窒息。 请将您的评论输入正确的答案,以便我可以接受。我感谢您的帮助。 – MichelV69

0

我已经走得通相同的动作试图创建一个封装了一些自定义JavaScript插件的gem。您的问题看起来是您的引擎宝石未正确包含在示例应用程序gemfile中,或者引擎宝石未正确安装在您的宝石回购中。你做了gem install mystock.engine-0.0.1.gem或类似的,然后在你的示例应用程序bundle install --local?这将确保您的自定义引擎在本地安装,然后拉入您的示例应用程序。如果是这种情况,我期望看到您的引擎资源列在'/.rvm/gems/'路径下,就像您的gemfile中的其他宝石一样。祝你好运!