簡體   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