繁体   English   中英

如何在gem中运行Rails应用程序?

[英]How to run a Rails application within a gem?

我不确定这种事情是否很常见,但我一直在发现自己试图创建只是围绕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/

我的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组感到有些困惑。

# 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

试试这个,看看它是否有助于你取得进步。

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'

有很多选择供您考虑。 希望这可以帮助!

问题是什么,“我如何在gem中运行Rails应用程序?”。

Rails应用程序具有运行Web服务器的控制器和视图。 您需要的是创建,列出,更新和销毁的操作。 在没有Web服务器的情况下公开这些操作实际上是在类中具有这样的方法。 这首先是普通标准类型的宝石。

所以也许你的问题是真的,我怎么写一个我有ActiveRecord的宝石,以及其他Rails的东西。

首先,您需要使您的宝石依赖于您需要的Rails宝石。 您可以在gem的gemspec文件中执行此操作。

那么它真的只是你的宝石代码需要你需要的正确的Rails宝石。

我不确定这是否会有所帮助,因为我阅读了所有内容,但我找不到你为什么这样做的动机。 我想出的一个原因是制作可以在桌面环境中使用的东西。 在这种情况下,你可以尝试使用像Bowline这样的东西 如果您只想提供其他人可以下载并使用和安装的应用程序,那么您可以假设他们至少可以遵循基本的开发人员指令,您可以在github或zip文件中提供整个应用程序。 Fat Free CRM的github页面上查看其他人做类似事情的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM