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 上。 谢谢,但是我应该把这个文件放在哪里?在libconfig/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 指令不能被后续的 requireinclude 指令覆盖。

如果您想在 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 需要指令 - 有没有办法排除特定文件?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3.1 指南针和链轮。使困惑

如何在 Ruby on Rails 3.1 中禁用资产管道(链轮)消息的日志记录?

如何将dojo工具包与rails 3.1资产管道和coffeescript一起使用?

Compass for Rails 3.1 的价值是啥?

如何开始使用 Backbone.js 和 Rails 3.1

使用 Rails 3.1 资产管道有条件地使用某些 css