有人知道如何使用JRuby和Compass模块在build.xml中编译SASS(*.scss)文件吗?
我可以使用Sass独立安装中的Sass::Exec模块以以下方式从*.scss编译到*.css:
<!-- Compile SCSS files copied to target folder -->
<property name="stylesheetFolder" location="myproject/stylesheet"/>
<property name="inputFiles" value="${stylesheetFolder}/[^_]*.scss" />
<echo message="Compiling SCSS files from ${stylesheetFolder}..." />
<script language="ruby" classpath="${env.EP_LIB}/jruby/complete/${jruby-complete.build.jar}">
<![CDATA[
require $project.getProperty('env.EP_LIB') + '/sass/sass-3.2.9/lib/sass'
require 'sass/exec'
files = Dir.glob($project.getProperty('inputFiles'))
files.each do |file|
opts = Sass::Exec::Sass.new(["--style", "compressed", "--load-path", File.dirname(file), file, File.join(File.dirname(file), File.basename(file, ".*") + ".css")])
opts.parse
end
]]>
</script>
<echo message="Done compiling SCSS source files." />
然而,这并没有给我Compass框架的力量。我下载了compass gem作为一个独立的,我想使用compass Ruby模块中的一个来用以下内容替换Ant build.xml中的上述代码:
<script language="ruby" classpath="${env.EP_LIB}/jruby/complete/${jruby-complete.build.jar}">
<![CDATA[
require $project.getProperty('env.EP_LIB') + '/compass/compass-0.12.2/lib/compass'
require 'compass/exec'
files = Dir.glob($project.getProperty('inputFiles'))
files.each do |file|
opts = Compass::Exec::Compass.new(["--style", "compressed", "--load-path", File.dirname(file), file, File.join(File.dirname(file), File.basename(file, ".*") + ".css")])
opts.parse
end
]]>
</script>
有人成功地做到了吗?
好吧,我终于花了很多功夫,用过时的文档完成了它。以下是对我们有效的方法:
将gem绑定到可执行jar中
- 下载
jruby-complete-1.7.4.jar
(适用于我的工作版本)(来自http://jruby.org/files/downloads/1.7.4/) C:jrubycomplete>
java -jar jruby-complete-1.7.4.jar -S gem install -i ./compass compass
C:jrubycomplete>
jar uf jruby-complete-1.7.4.jar -C compass .
C:jrubycomplete>
java -jar jruby-complete-1.7.4.jar -S gem list
- 成功运行上述cmd后,您的
jruby-complete-1.7.4.jar
将被修改。现在它应该包含捆绑的宝石(包括指南针)。这也适用于您想要捆绑并在Compass项目中使用的其他宝石
compile.rb
Dir.entries(ARGV[0]).each do |lib|
$LOAD_PATH.unshift "#{ARGV[0]}/#{lib}/lib"
end
require 'rubygems'
require 'compass'
require 'compass/exec'
command_line_class = Compass::Exec::SubCommandUI.new([ARGV[1], ARGV[2], "-q"]).run!
配置.rb
http_path = "/"
css_dir = "."
sass_dir = "."
images_dir = "../images"
javascripts_dir = "../js"
output_style = :compressed
line_comments = false
build.xml
<path id="jruby.classpath">
<fileset dir="${env.LIB}/jruby/complete">
<include name="${jruby-complete.build.jar}"></include>
</fileset>
</path>
<java fork="true" failonerror="true" classpathref="jruby.classpath" classname="org.jruby.Main">
<arg line="${stylesheetFolder}/compass/compile.rb ${rubyCompleteFolder}/compass/gems compile ${stylesheetFolder}"></arg>
</java>
以下是帮助我进行Compass和Ant集成的支持文档:
- http://www.verious.com/tutorial/tutorial-using-compass-and-sass-in-a-java-project/
- http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar/
我希望这能帮你节省很多时间:)
这是我的解决方案,它支持在一个java fork中批量编译多个不同的SASS项目,方法是在您的java项目中搜索多个config.rb文件(基于此答案:https://stackoverflow.com/a/21051968/6440953):
对于表示不同sass项目路径(包含config.rb文件)的每个参数,运行compile命令:
compile.rb
require 'rubygems'
require 'compass'
require 'compass/exec'
ARGV.each do |arg|
Compass::Exec::SubCommandUI.new(["compile", arg, "--force"]).run!
end
在所有SASS项目路径中创建类似的config.rb文件:
配置.rb
http_path = "/"
css_dir = "."
sass_dir = "."
images_dir = "../images"
javascripts_dir = "../js"
output_style = :compressed
line_comments = false
设置你的红宝石完整罐子的路径,里面绑着指南针宝石(请参阅https://stackoverflow.com/a/21051968/6440953)。
在Java项目中搜索所有config.rb文件,并将它们的路径连接到一个属性。将此属性作为参数行发送到执行SASS编译的java fork。
build.xml
<path id="jruby.classpath">
<fileset dir="${ext.path}/lib/jruby/complete">
<include name="jruby-complete*.jar"></include>
</fileset>
</path>
<macrodef name="sassToCss">
<sequential>
<dirset id="configRubyDirSet" dir="${ext.path}webwebroot_ui">
<present targetdir="${ext.path}webwebroot_ui">
<mapper type="glob" from="*" to="*/config.rb" />
</present>
</dirset>
<pathconvert property="config.rb.dirs.str" pathsep=" " refid="configRubyDirSet"/>
<java fork="true" failonerror="true" classpathref="jruby.classpath" classname="org.jruby.Main">
<arg path="${ext.path}compile.rb"></arg>
<arg line="${config.rb.dirs.str}"></arg>
</java>
</sequential>
</macrodef>