如何在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项目:

  • Crate:包装独立的Ruby应用程序
    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

    上一篇: How to run a Rails application within a gem?

    下一篇: Creating a gem with associated Rails models