1

为什么 jruby 可以require 'susy'在我的指南针 config.rb 中找到,但@import 'susy'在 *.scss 文件中会产生问题:

 [java]     error Web Content/common/sass/base/foundation_de_DE.scss (Line 9: File to import not found or unreadable: susy.
        [java] Load paths:
        [java]   <removed>/Web Content/common/sass

我现有的应用程序想开始在前端使用响应式设计。但是,在所有开发人员的机器、集成环境、性能环境和生产环境上安装 ruby​​ / compass 会扼杀主动​​权。

根据这个问题和这个简化的教程,我使用我们当前的 Ant build.xml 来使用 jRuby 制作一些目标。

jar 中的 gems技巧,这样我就不需要到处安装 ruby​​:每个最新下载的 jruby-complete-1.6.8.jar jruby 自 2013.03.20 起有相对路径问题

java -jar jruby-complete-1.6.8.jar -S gem install -i ./susy susy  
jar uf jruby-complete-1.6.8.jar -C susy .  
java -jar jruby-complete-1.6.8.jar -S gem list

构建过程中使用的 ant 目标:

 <target name="compass.compile">
     <java classname="org.jruby.Main" fork="true" failonerror="true" classpathref="jruby.classpath">  
                <arg line="${basedir}/compile.rb ${basedir} compile ${basedir}"/>   
            </java>
     </target>

当用户保存 scss 文件时,基于 Eclipse 的 IDE 用于“自动编译”的 ant 目标。 拥有 Eclipse 'auto-build' scss 文件的说明(从第 5 步开始)

<target name="compass.dev">
        <path id="jruby.classpath">
            <fileset dir="../../../release/lib/arch/jruby">
                <include name="jruby-complete.jar"/>
            </fileset>            
        </path>
        <java classname="org.jruby.Main" fork="true" failonerror="true" classpathref="jruby.classpath">  
            <arg line="${basedir}/compile.rb ${basedir} compile ${basedir}"/>  
        </java>
    </target>

最后,这是 ant 目标使用的 'compile.rb':

Dir.entries(ARGV[0]).each do |lib|  
    $LOAD_PATH.unshift "#{ARGV[0]}/#{lib}/lib"  
end

require 'rubygems'
require 'compass' 
require 'susy'
require 'compass/exec'  

exit Compass::Exec::SubCommandUI.new([ARGV[1], ARGV[2], "-q"]).run!

以及指南针使用的 config.rb:

 # Require any additional compass plugins here.  
# Set this to the root of your project when deployed:
require 'susy'

http_path = "./Web Content/"  
css_dir = "./Web Content/common/sass-output-css/"  
sass_dir = "./Web Content/common/sass/"
add_import_path  "./Web Content/sass"  
images_dir = "./Web Content/common/images/"  
javascripts_dir = "./Web Content/common/js/widgets"  
# To enable relative paths to assets via compass helper functions. Uncomment:  
#relative_assets = true  

最后,尝试在 scss 文件中使用 susy:

@import 'reset'; 
@import 'utilities';
@import 'baseColorVariables'; 
@import 'font';  
@import 'susy'; 


$total-columns: 12; 
$column-width: 4em; 
$gutter-width: 1em; 
$grid-padding: 1em;
.magic-container { @include container; } 
4

1 回答 1

1

自 2013.03.20 起更新,此方法有效。但这可能不是在“无红宝石”机器上获得 Susy / compass 的最干净的方法。有人有更清洁的东西吗?

找到了。compass 不在 sass 加载路径中,susy 实际上也不是在“jar 中的宝石”jruby 解决方案下运行时。谢谢 Henning Petersen,特别是您的帖子

JRuby 对所有 Ruby 事物的基于文件的方式进行了相当出色的抽象,因此大多数事物在打包到 JAR 时仍然可以工作。JAR 中的文件的路径大致如下:/path/to/jar/gems.jar!file/in/jar/script.rb。JRuby 在使用 JAR 时保持相关文件和一切正常工作,但有一个很棒的 BUT:没有办法在 JAR 文件中执行目录列表这样的事情。没错,现在所有读取目录列表的东西都坏了。

我更改了 compass 的 frameworks.rb (不是粉丝),因此它的目录列表调用失败不会阻止 compass 将自身加载到 sass 加载路径中:

Compass::Frameworks.discover(:defaults)
Compass::Frameworks.register_directory(File.join(Compass.base_directory, 'frameworks/compass'))
Compass::Frameworks.register_directory(File.join(Compass.base_directory, 'frameworks/blueprint'))

它将 *.scss 自动编译请求更改为:

Syntax error: File to import not found or unreadable: susy.
              Load paths:
                <removed>/Web Content/common/sass
                file:<removed>/release/lib/arch/jruby/jruby-complete.jar!/gems/compass-0.12.2/frameworks/compass/stylesheets
                file:<removed>/release/lib/arch/jruby/jruby-complete.jar!/gems/compass-0.12.2/frameworks/blueprint/stylesheets

好的,现在我们需要进入加载路径。将此行添加到指南针config.rb不起作用,但我希望这样做:add_import_path "../../../release/lib/arch/jruby/jruby-complete.jar!gems/susy-1.0.7/sass"

Henning Petersen 也发现了这一点,这又是因为使用 jruby jar 更改了 compassconfiguration/adapters.rb和 Sass 的目录列表调用importers/filesystem.rb。更改所有这些文件比我所接受的更脏,而且关于 compass && sass 的帖子已经过时了。

因此,我将 sass 目录从 jar 中拉出,让指南针add_import_path按预期工作。到目前为止,我最干净的解决方案是手动附加到gem/compass-0.12.2/lib/frameworks.rb

Compass::Frameworks.register_directory(File.join(Compass.base_directory, 'frameworks/compass'))
Compass::Frameworks.register_directory(File.join(Compass.base_directory, 'frameworks/blueprint'))

然后将此行添加到 compass 项目的 config.rb (提供整个文件):

 # Require any additional compass plugins here.  
# Set this to the root of your project when deployed:
require 'susy'

http_path = "./Web Content/"  
css_dir = "./Web Content/common/sass-output-css/"  
sass_dir = "./Web Content/common/sass/"
add_import_path  "./Web Content/susy-1.0.7-read-only"  
images_dir = "./Web Content/common/images/"  
javascripts_dir = "./Web Content/common/js/widgets"  
# To enable relative paths to assets via compass helper functions. Uncomment:  
#relative_assets = true  

这导致 RAD / eclipse builder scss auto-compile ant target 吐出:

compass.dev:
BUILD SUCCESSFUL
Total time: 16 seconds
于 2013-03-21T15:03:12.647 回答