警卫与守卫,守卫和守卫咖啡不一致

时间:2014-08-13 07:31:53

标签: coffeescript sass haml guard

我想为大多数项目配置一个配置。它在我的项目文件夹中搜索任何sass,haml或coffee文件夹。我添加新地点制作sass文件时,我不想更新配置。

启动文件夹结构

 - sass
     - test.sass
 - coffee
     - test.coffee
 - haml
     - test.html.haml
 - a
     - folder
         - somewhere 
             - deep
                 - sass
                     - test2.sass
                 - coffee
                     - test2.coffee
                 - haml
                     - test2.html.haml
 - Guardfile

带有生成的文件和文件夹的通缉文件夹结构:

 - sass
     - test.sass
 - css
     - test.css
 - coffee
     - test.coffee
 - js
     - test.js
 - haml
     - test.html.haml
 - test.html
 - a
     - folder
         - somewhere 
             - deep
                 - sass
                     - test2.sass
                 - css
                     - test2.css
                 - coffee
                     - test2.coffee
                 - js
                     - test2.js
                 - haml
                     - test2.html.haml
                 - test2.html
 - Guardfile

到目前为止,haml与

完美配合
guard :haml, input: 'haml' do
  watch(/^.+(\.html\.haml)$/)
end

和sass一样,coffeescript的工作方式与完全相同的代码不同

guard :coffeescript, input: 'coffee', output: 'js' do 
  watch(/^.+(\.coffee)$/) 
end 

guard :sass, input: 'sass', output: 'css' do
  watch(/^.+(\.sass)$/)
end

最终结果导致将目标css和js文件夹放在项目文件夹的根目录中。即使我删除了output:属性,它也会在根目录下创建一个咖啡和sass文件夹。

结果文件夹结构

 - sass
     - test.sass
 - css
     - test.css
     - test2.css
 - coffee
     - test.coffee
 - js
     - test.js
     - test2.js
 - haml
     - test.html.haml
 - test.html
 - a
     - folder
         - somewhere 
             - deep
                 - sass
                     - test2.sass
                 - coffee
                     - test2.coffee
                 - haml
                     - test2.html.haml
                 - test2.html
 - Guardfile

我不知道发生了什么,有人可以启发我吗?

使用Guard版本2.6.1

1 个答案:

答案 0 :(得分:0)

每个插件都有自己对如何解释/使用目录的想法。

在coffeescript中,有一个"技巧"通过将输入目录部分放在regexp组中来告诉它输出目录,例如:

guard :coffeescript, input: 'coffee', output: 'js' do
  watch(/^(.+)\\.coffee$/)
end

但是我猜这会产生例如js/a/folder/somewhere/deep,您需要a/folder/somewhere/deep/js

如果你没有指定输出目录,你可能会得到:a/folder/somewhere/deep - 它很接近,但最后没有/js/文件夹

事实上,Haml提供了不同的文件,因为虽然您希望(...)coffee/test2.coffee最终为(...)/js/test2.js,但您希望(...)/haml/test2.html.haml最终为(...)/test2.html.haml,而不是(...)/html/test2.html.haml {1}}(意思是:你不希望它出现在html子文件夹中 - 我同意这会很愚蠢)......

...这意味着guard-haml就是您对其他插件的期望。

所以短篇小说是:

您不能期望guard-coffeescriptguard-sass的行为类似于guard-haml, because at the same time you're expecting them to *not* behave the same way (no html output folder for。haml`文件 - 这显然是可以理解的。)

在haml的工作中你只想要 ,因为你没有为它提供:output选项(试试看看会发生什么)。

与此同时,guard-coffeescript已更新(由我)使用更新版本的后卫,因此模板现在有点不同,您可能需要:

input_dir = 'a/folder/somewhere/deep'

coffeescript_options = {
  input: "#{input_dir}/coffee,
  output: "#{input_dir}/js",
  patterns: [%r{^#{input_dir}/(.+\.(?:coffee|coffee\.md|litcoffee))$}]
}

guard 'coffeescript', coffeescript_options do
  coffeescript_options[:patterns].each { |pattern| watch(pattern) }
end

guard-sass尚未针对较新版本的Guard进行更新(实际上,它从未迁移到Guard 2.0),所以我甚至不愿意去调查。< / p>

我看到的选择是:

  • 更改guard-coffeescript以执行您想要的操作(反向输入/输出文件夹顺序)

  • 重新组织您的结构(可能推荐并更快)

由于Guardfile是纯ruby,你可以选择迭代 - 如果有帮助,例如:

# I don't know which parts of the structure are projects, so I'm guessing it's the first part
Dir[*].each do |project|
  next unless File.directory?(project)
  next if %w(sass css coffee js).include?(project) #(skip top level non-project folders)
  input_dir = "#{project}/a/folder/somewhere/deep"

  coffeescript_options = {
    input: "#{input_dir}/coffee,
    output: "#{input_dir}/js",
    patterns: [%r{^#{input_dir}/(.+\.(?:coffee|coffee\.md|litcoffee))$}]
  }

  guard 'coffeescript', coffeescript_options do
    coffeescript_options[:patterns].each { |pattern| watch(pattern) }
  end

  # guard 'sass' would go here with a similar setup
end