如何在gem中运行Rails应用程序?
我不确定这种事情是否很常见,但我一直在发现自己试图创建只是围绕Rails应用程序的包装的宝石。
我的宝石将有一个生成器来创建一个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/
我的宝石也会生成一些需要以某种方式添加到Rails的目录,以便我可以从Rails应用程序中的Gem内部访问这些目录中的代码。
任何帮助或建议,你可以给我,将不胜感激。
为了澄清,我没有尝试创建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
试试这个,看看它是否有助于你取得进展。
宝石只是文件的目录,你可以把你想要的任何文件放入宝石。
创建:
创建一个空白的gem full-blown 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变量来发送你想要的任何目录。
如果您阅读了有关加载路径功能的信息,请查找将加载目录添加到加载路径前面的简写行,因为您可能需要首先放置外部目录:
$:.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应用程序被打包成一个宝石。
config.ru应该是典型的Rails之一。 AFAIK没有特别的变化。
当你的用户想要安装你的应用时:
$ gem install my_gem
该宝石将安装在用户的典型gem目录中。 如果你想调整它,请参阅rubygems上的这个页面:http://docs.rubygems.org/read/chapter/3
箱:
您可能还想调查Crate项目:
http://www.slideshare.net/copiousfreetime/crate-packaging-standalone-ruby-applications
架:
在这里使用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'
很多选择让你考虑。 希望这可以帮助!
关于这个问题,“我将如何在gem中运行Rails应用程序?”。
Rails应用程序具有运行Web服务器的控制器和视图。 您需要的是创建,列出,更新和销毁的操作。 在没有Web服务器的情况下公开这些操作本质上就是在类中使用这些方法。 首先,这是一种普通的标准类型的宝石。
所以,也许你的问题是真的,我怎么写一个有ActiveRecord的Gem,以及其他Rails的东西。
首先,你需要让你的宝石取决于你需要的Rails宝石。 你在gemspec文件中为你的宝石做这个。
然后,它确实只是你的宝石代码做需要你需要正确的Rails宝石的问题。
我不确定这是否会有所帮助,因为我通读了所有内容,但我无法找到为什么要这样做的动机。 我想出的一个原因是制作了一些可以在桌面环境中使用的东西。 在这种情况下,你可以尝试使用类似Bowline的东西。 如果你只是想提供一个应用程序,其他人可以下载并使用和安装自己,那么你可以假设他们至少可以遵循基本的开发者类型的指示,你可以在github上提供整个应用程序或作为一个zip文件。 在Fat Free CRM的github页面上查看别人正在做类似的事情的例子。
链接地址: http://www.djcxy.com/p/14249.html