[英]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.