Rails 3.1 Sprockets 需要指令 - 有没有办法排除特定文件?
Posted
技术标签:
【中文标题】Rails 3.1 Sprockets 需要指令 - 有没有办法排除特定文件?【英文标题】:Rails 3.1 Sprockets require directives - is there a way to exclude particular files? 【发布时间】:2011-11-27 23:30:12 【问题描述】:如果我在 application.css 中使用 //=require_tree .
,除了诉诸 //=require_directory
和树组织之外,还有其他方法可以排除特定文件吗?
可能类似于//= require_tree ., except: 'something'
【问题讨论】:
【参考方案1】:自 rails 3.2.9 发布以来,它支持将 sprocket 锁定到 2.2.x 版本,以便我们可以使用最新 sprocket 所具有的 //= stub
指令。
//= stub unwanted_js
http://weblog.rubyonrails.org/2012/11/12/ann-rails-3-2-9-has-been-released/
所以,要使用它,只需升级到 Rails 3.2.9
【讨论】:
【参考方案2】:尝试更好的https://github.com/QubitProducts/miniMerge
它不仅支持JS,而且兼容基本模式的链轮。
您不仅可以在文件级别上排除,还可以在块甚至行上排除。
具有多个源库的完整依赖管理。
我过去用过 sprockets,这个更好,我也用它来做 CSS。
【讨论】:
【参考方案3】:注意:这个答案现在已经过时了,更新了 Sprockets 具有此功能。请参阅下面的答案。
===
这在当前的 Sprockets 指令中是不可能的,但它似乎是一个方便的功能。
另一种手动列出所需文件的方法。
也许您可以在Sprockets repo 上将此作为功能请求提交? :-)
【讨论】:
这将是一个方便的功能。 但它看起来不会被添加。见github.com/sstephenson/sprockets/pull/86 现在可以了,请看我的回答。 好消息,但我写的时候答案是正确的,所以现在投反对票并不公平。 :-) 我无法更改,也无法删除,因为它被标记为答案!【参考方案4】:以下猴子补丁为我解决了这个问题:
module Sprockets
class DirectiveProcessor
# support for: require_tree . exclude: "", "some_other"
def process_require_tree_directive(path = ".", *args)
if relative?(path)
root = pathname.dirname.join(path).expand_path
unless (stats = stat(root)) && stats.directory?
raise ArgumentError, "require_tree argument must be a directory"
end
exclude = args.shift == 'exclude:' ? args.map |arg| arg.sub(/,$/, '') : []
context.depend_on(root)
each_entry(root) do |pathname|
if pathname.to_s == self.file or exclude.include?(pathname.basename(pathname.extname).to_s)
next
elsif stat(pathname).directory?
context.depend_on(pathname)
elsif context.asset_requirable?(pathname)
context.require_asset(pathname)
end
end
else
# The path must be relative and start with a `./`.
raise ArgumentError, "require_tree argument must be a relative path"
end
end
end
end
【讨论】:
嗨@Roman,我也希望它能够工作。因此,我在文件config/initializers/sprockets.rb
文件中添加了您的上述补丁并使用了该指令,它仍然可以使用。我在轨道 3.2.1 和链轮 2.1.3 上。
谢谢,但是我应该把这个文件放在哪里?在lib
、config/initializers
中尝试过,均无效。 Gemfile.lock 中的导轨和链轮的版本是什么?
我在 Rails 3.2.9 上,这个文件在初始化程序中。
这个补丁可以排除目录吗?看起来不像。
不知道。最后,这不值得花时间。 Juts 把东西放在一些子目录中,只使用 require_dir 而不是 require_tree。【参考方案5】:
这可以通过 Sprocket 的新 stub
指令实现,该指令在 Sprockets v2.2.0 及更高版本中可用。但是,Rails 3.2 只会使用没有此功能的 Sprockets v2.1.3。到目前为止,当前的 Edge Rails 有 stub
指令,它将正式在 Rails 4.0 及更高版本中。
用法:
//= require jquery
//= require_tree .
//= stub unwanted_js
stub
指令不能被后续的 require
或 include
指令覆盖。
如果您想在 Rails 3.2 项目中使用 stub
指令,则必须切换到 Edge Rails,或者将 Rails gem 分支并将其 Sprockets 依赖项修改为 2.2.0 版。
【讨论】:
当前版本的 Rails (3.2.2) 依赖于没有此功能的 Sprockets 2.1.2! "gem list sprockets" 获取您安装的版本 这也适用于从 Rails 3.2.9 开始的样式表。另外,请注意您的文件命名约定。如果您的文件名为 jsfile.js,请不要使用 //= stub jsfile_js,它将不起作用。而是使用 //= stub jsfile。 我也可以对特定的供应商资产文件夹使用存根吗?我一直在尝试相同但没有工作。 存根可能会导致意外行为。这不仅仅是“不包括这个文件”,而是“不包括这个文件并且不包括它的依赖项”。如果您在两个文件中都包含依赖项,那么它将在使用“存根”的文件中删除。以上是关于Rails 3.1 Sprockets 需要指令 - 有没有办法排除特定文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ruby on Rails 3.1 中禁用资产管道(链轮)消息的日志记录?
如何将dojo工具包与rails 3.1资产管道和coffeescript一起使用?