我不确定这种事情是否很常见,但我不断发现自己试图创建只是围绕Rails应用程序包装的宝石。
我的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 app)而无需知道它在幕后使用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,我开始在gem的Gemspec中添加Rails Gemfile中定义的gems作为依赖项,但是我对如何处理Gemfile中的assets
组感到困惑。 / p>
# 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
答案 0 :(得分:11)
试试这个,看看它是否有助于你取得进步。
Gems只是文件的目录,您可以将所需的任何文件放入gem中。
创建一个空白宝石成熟的Rails项目:
$ bundle gem my_gem
然后是一个Rails应用程序:
$ rails new my_app --skip-bundle
将Rails文件复制到gem:
$ cp -R my_app/* my_gem
将所有内容捆绑到您的Rails应用中:
$ cd my_gem
$ bundle install --binstubs --path vendor/bundle
$ cd -
让Rakefile具有gem任务和Rails设置:
#!/usr/bin/env rake
require "bundler/gem_tasks"
require File.expand_path('../config/application', __FILE__)
MyApp::Application.load_tasks
验证它是否已启动:
$ rails server
要控制Rails查找文件的位置,例如“外部”配置文件,您可以将文件config / application.rb与任何目录路径一起使用,如下所示:
# Add additional load paths for your own custom dirs
# config.load_paths += %W( #{config.root}/../customdir )
注意“..”,这意味着去上面 Rails目录。这为您提供了相对于宝石的路径。
如果您愿意,可以指定绝对路径,例如,如果您知道用户将始终将其外部文件保存在“〜/ myfiles /”中。您还可以选择使用ENV vars发送您想要的任何目录。
如果您阅读了有关加载路径功能的信息,请查找用于将目录添加到加载路径前面的简写行,因为您可能希望先放置外部指令:
$:.unshift File.dirname(__FILE__)
编辑my_gem.gemspec以添加您自己的描述,主页,摘要等,然后构建:
$ gem build my_gem.gemspec
Successfully built RubyGem
Name: my_gem
Version: 0.0.1
File: my_gem-0.0.1.gem
现在您的Rails应用程序已打包为gem。
config.ru应该是典型的Rails之一。 AFAIK没有特别的变化。
当您的用户想要安装您的应用时:
$ gem install my_gem
gem将安装在用户的典型gem目录中。如果您想调整此项,请参阅rubygems上的此页面:http://docs.rubygems.org/read/chapter/3
您可能还想调查Crate项目:
在这里使用config.ru是典型的Rails设置:
# Rails.root/config.ru
require "config/environment"
use Rails::Rack::LogTailer
use ActionDispatch::Static
run ActionController::Dispatcher.new
对于您的项目,您希望在Rails之前需要一些文件。您将需要了解Ruby“require”以及如何使用LOAD_PATH查找文件。
简单方法:
# Rails.root/config.ru
require_relative 'filename'
require "config/environment"
或者将用户的自定义目录放在几个目录级别:
require './../../filename' # not the best for security
或者使用绝对路径,请阅读File.expand_path:
File.expand_path(__FILE__)
或者使用当前目录并将其放在加载路径上:
$LOAD_PATH.unshift(File.dirname(__FILE__))
require 'filename'
您需要考虑很多选择。希望这有帮助!
答案 1 :(得分:0)
问题是什么,“我如何在gem中运行Rails应用程序?”。
Rails应用程序具有运行Web服务器的控制器和视图。您需要的是创建,列出,更新和销毁的操作。在没有Web服务器的情况下公开这些操作实际上是在类中具有这样的方法。这首先是普通标准类型的宝石。
所以也许你的问题是真的,我怎么写一个我有ActiveRecord的宝石,以及其他Rails的东西。
首先,您需要让您的宝石依赖于您需要的Rails宝石。您可以在gem的gemspec文件中执行此操作。
然后,这只是你的宝石代码要求你需要正确的Rails宝石。
答案 2 :(得分:0)
我不确定这是否会有所帮助,因为我阅读了所有内容,但我找不到你为什么这样做的动机。我想出的一个原因是制作可以在桌面环境中使用的东西。在这种情况下,您可以尝试使用Bowline之类的内容。如果您只想提供其他人可以下载并使用和安装的应用程序,那么您可以假设他们至少可以遵循基本的开发人员指令,您可以在github或zip文件中提供整个应用程序。查看其他人在Fat Free CRM's github page上执行类似操作的示例。