【发布时间】:2011-12-09 16:49:02
【问题描述】:
我有一个基于插件的系统,用于在 Rails 中进行应用程序开发。每个插件都使用 MVC 组件等实现一个引擎。主应用程序只是一个空的工具,它将所有工作委托给已安装的插件。
我目前正在从 Rails 2.3.5 升级到 Rails 3.1,并试图让资产管道与我的框架一起工作。
我遇到的问题是尝试以编程方式将我的插件资产要求放入 application.js 清单等。
我可以像这样手动添加它们:
//= require <plugin_manifest_path>
一切都按预期进行。但是,由于我的框架中有几十个插件,并且每次安装都有不同的组合,我希望根据安装的插件来更改清单。我尝试将此作为解决方案:
<%=
Rails.plugins.collect do |plugin|
"//= require #{plugin}"
end.join("\n")
%>
但我发现资产管道编译的 require/directive 阶段发生在 ERB 扩展之前,因此生成的 cmets 只是以 cmets 结尾。
是否有另一种机制可以包含可能有效的编译路径?有什么方法可以在指令处理开始之前预处理清单文件?
如果我想不出更好的方法,我可能不得不编写一个 rake/deployment 任务,在部署时生成一个 plugin.js 清单文件,但如果可能的话,我希望更清晰、更优雅。谢谢!
编辑:找到解决方案,一旦 stackoverflow 允许我发布完整的解决方案。同时参见下面的 cmets...
【问题讨论】:
-
这很难做到。我尝试了几种解决方案,但没有一个真正奏效(Rob,我不得不删除我的答案。我意识到它“有效”只是因为 //= require_tree . 声明,这是错误的)。
-
嘿伙计。我实际上已经找到了解决方案,但作为一个新手,我无法在接下来的 4 小时内发布它。 :-(
-
这很复杂,但基本上你可以使用 erb 手动调用
require_asset,并在循环迭代中使用它来完成所需的工作。很高兴听到您之前的解决方案不正确,怀疑我试图重现它的理智。感谢您的帮助!
标签: ruby-on-rails plugins dynamic ruby-on-rails-3.1 asset-pipeline