【发布时间】:2012-08-20 14:46:12
【问题描述】:
我不确定这种事情是否很常见,但我一直在尝试创建只是 Rails 应用程序包装器的 gem。
我的 gem 将有一个生成器来创建 config.ru,但 Rails 应用程序将位于 gem 的 lib 目录中。我需要知道如何“嵌入”一个 Rails 应用程序并对其进行配置,以便它可以在 gem 中运行。
例如:
$ mygem new project
mygem created a directory called "project" with the following files:
project/config.ru
project/widgets/
project/foobars/
我的 gem 还会生成一些需要以某种方式添加到 Rails 的目录,以便我可以从 Gem 中的 Rails 应用程序访问这些目录中的代码。
如果您能给我任何帮助或建议,我们将不胜感激。
澄清一下,我并不是要创建 Rails 引擎或 Rails 应用程序的插件。我正在尝试创建一个成熟的 Rails 应用程序,但将其打包为 gem,以便我的 gem 的用户可以运行 gem(rails 应用程序),而无需知道它在幕后使用 Rails。
更新:好的,我现在有一点工作。我已经创建了 gem 并在 gem 的 lib 目录中生成了 rails 项目。
$ bundle gem my_gem && cd my_gem/lib
$ rails new my_gem --skip-bundle
剩下的就是:
my_gem/
my_gem.gemspec
bin/my_gem
lib/
my_gem.rb
my_gem/
version.rb # generated by bundler
# the rails app:
app/
config/
Gemfile
...etc
由于这个 gem 需要 Rails,我开始将 Rails Gemfile 中定义的 gem 作为依赖项添加到 gem 的 Gemspec 中,但我对如何处理 Gemfile 中的 assets 组有点困惑。
# Rails Gemfile
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'therubyracer', :platforms => :ruby
gem 'uglifier', '>= 1.0.3'
end
# gemspec
Gem::Specification.new do |gem|
gem.name = "my_gem"
# ...
gem.add_dependency 'rails', '3.2.8'
gem.add_dependency 'sqlite3'
gem.add_dependency 'jquery-rails'
# how to add the assets group gems?
end
【问题讨论】:
-
像 Rails 引擎?引擎可以提供路线、模型、资产等,并包含在 gem 中。它基本上是一个 Rails 应用程序,可以安装在另一个 Rails 应用程序中。
-
就像一个可以独立运行(无需安装)的 Rails 引擎。
-
或者也许有一种方法可以在没有通常创建的所有目录(app、config、lib、test 等)的情况下运行 Rails 应用程序,因为 widgets 和 foobars 目录会替换这些目录。跨度>
-
gem 用户会与 Web 服务器交互吗?还是只有您的应用程序的代码会这样做?如果是这样,运行 Rails 可能是矫枉过正。请描述“幕后”实际使用这个 Rails 应用程序的情况。
-
@Kelvin 我不知道我是否完全理解你的两个问题的区别。我想像任何其他 Rails 应用程序一样开发 gem 中的代码。当用户使用我的 gem 的可执行文件生成一个新应用程序时,他们应该最终得到一个在我的 gem 中运行 Rails 应用程序的 rackup 文件。
标签: ruby-on-rails ruby