3

我正在构建一个使用 zurb-foundation 样式表的 Rails 引擎,并且不断遇到相同的 Sass::Syntax 错误。这看起来很奇怪,因为我在 Rails 应用程序中遵循了相同的过程,并且在第一次尝试时就成功了。所以我决定通过启动两个新的 Rails 项目(一个应用程序和一个引擎)来解决这个问题,并将它们配置为使用基础设置最少。

我从 2 个干净的 Rails 3.2.9 项目开始——一个应用程序和一个应用程序,并通过在 CSS 清单中engine --full添加 Foundation_and_overrides.scss 和 -ing 来手动为基础配置它们。require

然后我创建了一个简单的控制器,这样我就有了一个要加载的页面。对于应用程序,加载该页面并查看页面源代码,我可以看到基础 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)

(请注意,虚拟应用程序的 CSS 清单是require-ing 插件的 CSS 清单,即require-ingfoundation_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"

即使foundation/common/_ratios.scss 存在于该路径中。

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

我将其报告为Foundation 的一个问题,但我对此不太相信。

有没有人见过这个?

4

2 回答 2

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

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

Bundler.require
require "<PLUGIN_NAME>"

在 Rails 应用程序中,第一个 Bundler.require 包括 Gemfile 中的所有组,但不包括 :assets,除非 Rails.env 是 :development 或 :test 第二个 Bundler.require 包括 :default - 即 Gemfile 中不存在的任何内容一个组——以及 :assets 和 :production、:development 或 :test

在虚拟应用程序中,这些都不是必需的,因为 1)它不打算用于生产,并且 2)测试和开发通常具有类似的依赖要求。由于 :assets 组只是将依赖项应用到 :test 和 :development 而不是 :production 的便捷方式,因此在虚拟应用程序中它与 :default 相同。因此,在一个虚拟应用程序中,只需要 :default 即可。由于Bundler.require(警告:前方剧透)与 相同Bundler.require(:default),因此虚拟应用程序仅使用Bundler.require. 这意味着您的 Gemfile 中属于组的任何内容都将被忽略。

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

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

澄清一下,我看到的错误是因为没有包含 sass-rails(因为它在我的 Gemfile 的 :assets 组中),所以我的资产没有被解析为 Sass,而是被解析为 CSS。由于@import对 CSS 的含义与对 Sass 的不同,因此解析 CSS 文件的任何内容都使用了不同的实现,@import并且无法找到该文件。

于 2012-11-29T17:12:31.067 回答
0

嘿伙计们,我解决了这个问题,我花了大约 5 个小时才找到解决方法(对不起,我的英语,不是我的母语)。

在 Rails 中正常安装 Foundation 对我的引擎不起作用,所以我手动安装:

我在 application.html.erb 中添加了这一行: <meta name="viewport" content="width=device-width, initial-scale=1.0>

将此行添加到 your_engine/app/assets/javascripts/your_engine_name/application.js: //= require foundation

这就是我解决它的方法:

将此行添加到 your_engine/app/assets/stylesheets/your_engine_name/application.css (注意:我没有重命名为 application.scss): *= require your_engine_name/foundation_and_overrides

并且:

对于开发,在 Gemfile 中注释的行中说:“在此处声明任何仍在开发中的依赖项,而不是在 # 你的 gemspec 中。这些可能包括边缘 Rails 或来自你的路径或 #Git 的 gem。记住将这些依赖项移动到你的gemspec 在将 # 你的 gem 发布到 ruby​​gems.org 之前。” 所以我添加了我需要的宝石(Foundation、sass、compass 等)

就是这样,这就是我让我的引擎与 Foundation 合作的方式,

于 2012-12-13T05:24:22.043 回答