我创建了一个小型CSS预处理器,它有点类似于SASS,现在我想在现实生活中测试它。方案,所以我试图为它创建一个rails插件,就像sass-rails
的工作方式一样。
我试过这个,却不确定我在做什么:
require 'toss-ruby'
require 'sprockets'
module Toss
module Rails
class Template < ::Tilt::Template
def prepare
end
def evaluate(scope, locals, &block)
g = ::Toss::Generator.new
g.parse_string data
g.generate_string
end
end
end
end
Sprockets.register_engine '.toss', ::Toss::Rails::Template
根据文档,最后一行应该注册我的模板,所以链轮可以使用它,但它不会发生,所以我认为它从未被调用过。像thin
,sass-rails
等一些宝石如何只能通过放入Gemfile
来工作?何时以及如何调用他们的代码?
答案 0 :(得分:1)
有一种约定可以在Gemfile中包含的gem中执行代码。
如果gem的代码库的lib目录中存在一个文件,其名称与gem相同并且扩展名为.rb
,则默认情况下Bundler加载gem时需要该文件。
以一个名为“Mygem”的宝石为例。这是gem的典型目录结构:
mygem/ (gem's root directory)
|-- lib/
| |-- mygem.rb <-- automatically required!
| `-- mygem/
| |-- base.rb
| `-- version.rb
|-- test/
|-- bin/
|-- Rakefile
`-- mygem.gemspec
当Bundler加载'mygem'宝石时,它会自动需要lib/mygem.rb
。 Rails插件和引擎依赖此行为来加载其代码。通常,他们使用此文件来要求lib目录中的其他文件。在这种情况下,lib/mygem.rb
文件可能需要lib/mygem/base.rb
文件等
在开发gem时,通常使用Bundler:path指令将其添加到Gemfile中,该指令告诉Bundler在本地文件系统的某个路径上查找gem,而不是在rubygems上查找。假设您正在测试应用程序的vendor / engines目录下构建gem。
您的测试应用的Gemfile:
gem 'rails'
gem 'mygem', path: './vendor/engines/mygem'
启动Rails应用程序时,其中一个步骤是load it's gems。当加载'mygem'gem时,Bundler需要'./vendor/engines/mygem/lib/mygem.rb'来执行其中的代码。您放入的任何代码都将在Rails初始化之前运行。
如果您的代码需要作为应用程序初始化的一部分运行,则需要遵循guide for creating Rails plugins/engines。通常,您将从:: Rails :: Engine继承您的插件并在其中调用initializer
并传递包含初始化代码的块。
考虑到所有这些,请再次查看sass-rails gem的源代码,特别是在加载gem时需要的lib/sass-rails.rb以及它递归需要lib/sass/rails/railtie.rb的方法,插件与Rails集成的必要设置和初始化。