7

この種のことが非常に一般的かどうかはわかりませんが、Rails アプリケーションの単なるラッパーである gem を作成しようとしていることに気づき続けています。

私の gem には を作成するためのジェネレーターがあります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 は、Gem 内にある Rails アプリからそれらのディレクトリ内のコードにアクセスできるように、何らかの方法で Rails に追加する必要があるいくつかのディレクトリも生成します。

あなたが私に与えることができる助けやアドバイスをいただければ幸いです。

明確にするために、私は Rails エンジンや Rails アプリケーションへのプラグインを作成しようとしているわけではありません。本格的な Rails アプリケーションを作成しようとしていますが、それを gem としてパッケージ化して、gem のユーザーが背後で Rails を使用していることを知らなくても gem (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に追加し始めましたがassets、Gemfileでグループをどのように処理するかについて少し混乱しています。

# 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
4

3 に答える 3

13

これを試して、進歩に役立つかどうかを確認してください。

gem は単なるファイルのディレクトリであり、好きなファイルを gem に入れることができます。

作成:

空の 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 ディレクトリのに移動することを意味する ".." に注意してください。これにより、gem に相対的なパスが得られます。

必要に応じて、絶対パスを指定できます。たとえば、ユーザーが外部ファイルを常に "~/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 アプリが gem としてパッケージ化されました。

config.ru は典型的な Rails のものである必要があります。特別な変更はありません。

ユーザーがアプリをインストールしたい場合:

$ 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'

考慮すべき選択肢がたくさんあります。お役に立てれば!

于 2012-09-11T20:16:06.390 に答える
0

私はすべてを読み通し、あなたがこれを行った理由の背後にある動機を見つけることができなかったので、これが役立つかどうかはわかりません。私が思いついた理由の1つは、デスクトップ環境で使用できるものを作成することでした。その場合は、もやい結びのようなものを使ってみることができます。他の人が自分でダウンロードして使用およびインストールできるアプリケーションを提供したいだけの場合は、少なくとも基本的な開発者の指示に従うことができ、アプリ全体をgithubまたはzipファイルとして提供できると考えられます。Fat Free CRMのgithubページで、他の誰かが同様のことをしている例を参照してください。

于 2012-09-15T12:52:52.330 に答える
0

「gem 内で Rails アプリケーションを実行するにはどうすればよいですか?」という質問についてはどうでしょうか。

Rails アプリケーションには、Web サーバーを実行するためのコントローラーとビューがあります。必要なのは、作成、一覧表示、更新、および破棄するアクションです。Web サーバーなしでこれらのアクションを公開することは、基本的に、クラスにそのようなメソッドを持つことです。そもそも普通のスタンダードタイプの宝石です。

だから多分あなたの質問は、ActiveRecord と他の Rails のものを持っている宝石をどのように書くのですか?

まず、必要な Rails gem に依存する gem を作成する必要があります。これは、gem の gemspec ファイルで行います。

あとは、必要な適切な Rails gem の require を行う gem コードの問題だけです。

于 2012-09-13T21:03:43.753 に答える