Sass @import指令在Rails引擎中使用时无法在插件中找到资产

Isa*_*esh 3 sass sprockets ruby-on-rails-3.2 zurb-foundation compass-sass

我正在构建一个使用zurb-foundation的样式表的Rails引擎,并且kep遇到了相同的Sass :: Syntax错误.这看起来很奇怪,因为我在Rails应用程序中遵循了相同的过程,并且在第一次尝试时就已经完成了.所以我决定通过启动两个新的rails项目 - 一个应用程序和一个引擎 - 来实现这一目标,并将它们配置为使用基础并进行最少量的设置.

我开始使用2个干净的Rails 3.2.9项目 - 一个应用程序和一个应用程序,engine --full并通过添加foundation_and_overrides.scss并require在CSS清单中将它们配置为基础.

然后我创建一个简单的控制器,所以我有一个页面加载.对于应用程序,加载该页面并查看页面源代码,我可以看到基础CSS已正确编译并加载.

当我为引擎尝试相同的东西时,我收到了这个错误:

Sass::SyntaxError in Main#index

Showing /<PLUGIN_PATH>/test/dummy/app/views/layouts/application.html.erb where line #5 raised:

File to import not found or unreadable: foundation/common/ratios.
Load path: /<PLUGIN_PATH>/test/dummy
  (in /<PLUGIN_PATH>/app/assets/stylesheets/example_plugin/foundation_and_overrides.scss)
Run Code Online (Sandbox Code Playgroud)

(请注意,虚拟应用程序的CSS清单是require-ing插件的CSS清单,它是require-ing foundation_and_overrides.scss.布线显然不是问题,因为错误是从foundation_and_overrides.scss引发的)

我用几个Ruby-1.9.3版本(p125,194,p327,我认为)尝试了相同的结果.

当我将此行添加到test/dummy/config/application.rb时,它仍然无效:

config.assets.paths << "#{Foundation::Engine.root}/scss"
Run Code Online (Sandbox Code Playgroud)

即使在该路径上存在foundation/common/_ratios.scss.

问题可能出在Sass,Sprockets,Compass,Foundation或Rails上,所以我不知道从哪里开始.

我把它作为基金会的问题报告,但我不是那么相信.

谁看过这个吗?

Isa*_*esh 5

我在Stackoverflow问题中找到了答案

问题是Rails引擎的虚拟应用程序和常规Rails应用程序的config/application.rb文件略有不同.

在Rails应用程序中,您会看到此代码位于顶部:

if defined?(Bundler)
  # If you precompile assets before deploying to production, use this line
  Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  # Bundler.require(:default, :assets, Rails.env)
end
Run Code Online (Sandbox Code Playgroud)

但在引擎虚拟应用程序中,您会看到:

Bundler.require
require "<PLUGIN_NAME>"
Run Code Online (Sandbox Code Playgroud)

在Rails应用程序中,第一个Bundler.require包含Gemfile中的所有组但不包括:assets,除非Rails.env是:development或:test第二个Bundler.require包括:default - 即你的Gemfile中没有的任何东西一组 - 以及:资产和:生产,开发或:测试

在虚拟应用程序中,这些都不是必需的,因为1)它不打算用于生产,2)测试和开发通常具有类似的依赖性要求.由于:assets组只是将依赖项应用于:test和:开发但不是:production的便捷方式,在虚拟应用程序中它与:default相同.所以在虚拟应用程序中,除了:默认是必需的.既然Bundler.require是(警告:Spoiler提前)Bundler.require(:default),虚拟应用程序只是使用Bundler.require.这意味着您的Gemfile中的任何内容都将被忽略.

所以我遇到的问题是我从Rails应用程序Gemfile复制并粘贴到Rails虚拟应用程序Gemfile中,包括group :assets do....我删除了group线,一切正常!

在11月29日当天晚些时候添加:

为了澄清,我看到的错误是因为没有包含sass-rails(因为它位于我的Gemfile中的:assets组中),所以不是将我的资产解析为Sass,而是将它们解析为CSS.因为@import与CSS不同,所以解决CSS文件的问题是使用不同的实现@import并且找不到文件.