私のRailsアプリでは、Javascriptの依存関係が大きくなっており、いくつかの問題が発生しています。1つは、非常に多くの場合、さまざまなJavascriptライブラリのバージョンを追跡および更新することが困難になることです。 それらを宝石に変える 、しかしそれから私はそれらを管理しなければなりません。いくつかはすでに宝石です(バックボーン-Railsのように)が、私は1つの一貫したパッケージマネージャーが欲しいです。
だから私は Bower 、「ウェブのパッケージマネージャー」を調べています。いくつかのブログ投稿 kaeffから および af83から は役に立ちましたが、それでも問題が発生します。この質問が、プロジェクトに最適なソリューションを見つけるために人々が使用できるさまざまな回答につながることを願っています。
特に、HerokuデプロイでBowerを介してアセットを管理するためのアドバイスを求めています。
1つの方法は、application.js
がBowerによって定義されたパッケージを要求できるようにするバージョンのSprocketsを使用することです。この機能はSprockets2.6で追加されました。Rails 3.xではバンドルできません バージョン制限のため 。この機能を利用するには、バンドルできます。 gem "sprockets", "2.2.2.backport1"
。
これにより、Sprocketsはvendor/assets/components
でもアセットを探し始めます。 BowerパッケージにはJavascriptだけでなく、CSSまたは画像アセットも含まれる可能性があるため、パスはベンダー/コンポーネントです。 Sprocketsがパッケージが必要なときにどのJavascriptを含めるかを知る方法は、パイプラインに含める必要のあるファイルを示すmain
プロパティのbower.json
ファイルを読み取ることです。ここでの落とし穴は、多くのBowerパッケージがこのプロパティを提供しないか、RequireJSが利用可能であると想定するメインソースを提供しないことです(例: d )。 bower list --map
で定義されているソースメインを確認できます。
main
が適切でない場合は、Bowerを使用して、パッケージの代わりに単一のリモートJSファイルを管理できます。 Josh Peekには これを示す要点 があります。 Bowerの最新バージョンでは、bower.json
ではなくcomponent.json
が必要なので、手順を更新しました。
$ npm install -g bower
$ mkdir -p vendor/assets
$ cd vendor/assets/
$ curl https://raw.github.com/Gist/3667224/component.json > bower.json
$ bower install
その特定のbower.json
はjQueryをロードします。次に、application.js
で//= require jquery
を実行すると、Sprocketsはvendor/assets/components
でそれを見つけます。新しい依存関係を追加するには、それらをbower.json
に含めて、bower install
を再度実行します。次に例を示します。
{
"dependencies": {
"jquery": "http://code.jquery.com/jquery-1.8.1.js",
"d3": "http://cdnjs.cloudflare.com/ajax/libs/d3/3.0.8/d3.js"
}
}
lib
アセットとvendor
アセットを1つの構成ファイルで管理する場合は、 bower-Rails を使用できますが、lib
。そのgemはいくつかのRakeタスクも提供しますが、それらは基本的なBowerコマンド以上のことは何もしません。
私の知る限り、アセットのコンパイル中に必要に応じてBowerをインストールする方法はまだありません。したがって、Herokuのようなデプロイ環境を使用している場合は、vendor/assets/components
ディレクトリをコミットし、bower
コマンドを使用して更新する必要があります。
Bowerの依存関係全体をapplication.js
の1つのディレクティブで設定する必要があるとしたらいいでしょう。 kaeffの要点 は、require_bower_dependencies
ディレクティブを作成する方法を示しています。あなたのためにこれを行う宝石はまだありません。それまでは、bower.json
とapplication.js
の両方で各依存関係を宣言する必要があります。
チェックアウト Rails Assets プロジェクト。使用例:
source 'http://rubygems.org'
source 'https://Rails-assets.org'
# gem 'Rails-assets-BOWER_PACKAGE_NAME'
gem 'Rails-assets-jquery', '~> 1.10.2'
gem 'Rails-assets-sly', '~> 1.1.0'
gem 'Rails-assets-raphael', '~> 2.1.0'
UPD(26.01.2016)
Future ofRails-Assetsプロジェクトが議論されています。 スレッド を確認して、自分で決定してください。使用するか、回避策を見つけてください。
Rails + Bower + Herokuを実行するための ガイド を作成しました。お役に立てば幸いです。
私はこの数日間この問題に取り組んでおり、次のプロセスに落ち着きました。
bower-Rails gemを使用します。これは、bowerの使用をRailsアプリケーションおよびアセットパイプラインと統合するのに役立つ多くのNicerakeタスクを提供します。RubyベースのDSLではなくbower.json構成を使用することを好みます。そのbower-Railsが提供します。vendor/ assets/bower_componentsにアセットを格納するデフォルトのbowerの場所を使用します。必ず以下をapplication.rbに追加してください。
config.assets.paths << Rails.root.join("vendor","assets","bower_components")
Bower.jsonにパッケージを追加したら、次を実行します。
rake bower:install
javascriptパッケージをインストールします。次に、application.jsファイルとapplication.cssファイルでjavacriptを参照します。
上記の@ andrew-hackingのように、Railsとbowerは、cssと画像を含むjavascriptパッケージ、特に画像を参照するcssではうまく機能しません。Bower-Railsは、提供されたrakeでこの問題を修正するのに役立ちます仕事:
rake bower:resolve
コンポーネントcssファイルのurl参照をRailsヘルパーメソッドで書き換えて、アセットパイプラインに適した方法でアセットを参照することにより、コンポーネントの相対アセットパスを解決します。 BowerRails :: Performer#詳細については、resolve_asset_paths を参照してください。
私の好みは、すべてのbower_componentsをリポジトリにチェックインすることです。そのため、bower:installを実行してからbower:resolveを実行します。次に、パッケージ内で参照されているイメージを、ステージング環境と本番環境のconfig.assets.precompileリストに追加する必要があります。たとえば、ここに select2 javascriptコンポーネントをbowerとRailsを使用してRailsプロジェクトに追加するためのセットアップがあります。
bower.json:
{
"name": "Acme",
"private": true,
"dependencies": {
"select2": "3.5.1"
}
}
app/assets/javascripts/application.js.coffee:
#= require select2/select2
app/assets/stylesheets/application.css.sass
//= require select2/select2
config/environment /staging.rbおよびconfig/environment/production.rb:
config.assets.precompile += ["select2/*.png",
"select2/*.gif"]
完璧ではありませんが、JavaScriptコンポーネントの依存関係を管理できます。また、アセットパイプラインで目的のJavaScriptコンポーネントを有効にするために、どのgemを取り込む必要があるかを把握することをお勧めします。
Railsプロジェクトでbowerを使用するのが良い考えだと誰かが思った場合は、もう一度考えてみてください。
Bowerパッケージは、Railsまたはスプロケットと統合するように作成されていません。
これはどういう意味ですか:
bundle install
はプロジェクトの依存関係では機能しなくなり、別のパッケージマネージャーも使用する必要があります対照的に、アセットgemは作成が簡単で、アセットをプロジェクトに取り込むための統一された抽象化を提供します。 Railsプロジェクトでうまく機能するように、元のファイルを変更してアセットヘルパーを使用する機会があります。アセットジェムの作成にはまともな blog があり、ジェムの作成にも一般的な railscast があります。
IMO Railsコミュニティにとって、Railsアセットパイプラインにプラグインするように設計されていないバウアーパッケージの問題に対処する必要があるすべてのプロジェクトよりも、最新のアセットジェムを維持する方がよいでしょう。