我的Rails应用程序中的Javascript依赖关系正在增长,这导致了一些问题。首先,有这么多,跟踪和更新不同Javascript库的版本变得很困难。起初我尝试了turning them into gems,但后来我必须管理它们。有些已经是宝石(比如backbone-rails),但我希望有一个一致的包管理器。
所以我正在研究Bower,“网络包管理器”。一些博文from kaeff和from af83有所帮助,但我仍遇到问题。我希望这个问题可以导致人们可以用来为他们的项目寻找最佳解决方案的各种答案。
我特别希望看到在Heroku部署中通过Bower管理资产的建议。
答案 0 :(得分:26)
一种方法是使用Sprockets版本,允许您的application.js
需要Bower定义的包。 Sprockets 2.6中添加了此功能,Rails 3.x将不允许您捆绑due to a version restriction。要获得该功能,您可以捆绑gem "sprockets", "2.2.2.backport1"
。
这将使Sprockets也开始在vendor/assets/components
中寻找资产。路径是供应商/组件,因为Bower包也可能包含CSS或图像资产,而不仅仅是Javascript。 Sprockets在需要包时知道要包含的Javascript的方法是读取bower.json
属性的main
文件,该文件说明管道应包含哪些文件。这里的问题是许多Bower软件包不提供此属性或提供主要来源,假设RequireJS可用(例如d3)。您可以使用bower list --map
查看已定义的源主要内容。
当main
不适合您时,您只需使用Bower来管理单个远程JS文件而不是包。 Josh Peek有a gist that demonstrates this。 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
资产,可以使用bower-rails,但使用lib
没有太大意义。该gem还提供了一些Rake任务,但它们除了基本的Bower命令之外什么都不做。
据我所知,在资产编制过程中,根本没有必要安装Bower。因此,如果您使用的是Heroku等部署环境,则需要提交vendor/assets/components
目录并通过bower
命令进行更新。
如果您需要在application.js
中使用一个指令设置整个Bower依赖关系,那将是很好的。 gist from kaeff说明了如何创建require_bower_dependencies
指令。没有宝石为你做这件事。在此之前,您必须在bower.json
和application.js
中声明每个依赖项。
答案 1 :(得分:15)
结帐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(2016年1月26日)答案 2 :(得分:8)
刚刚写了a guide来做Rails + Bower + Heroku。希望有所帮助。
答案 3 :(得分:5)
过去几天我一直在解决这个问题,并且已经确定了以下过程。
使用bower-rails gem。它提供了许多不错的rake任务,有助于将bower的使用与rails应用程序和资产管道集成。我更喜欢坚持使用bower.json配置而不是bower-rails提供的基于ruby的DSL。我坚持使用默认的凉亭位置来存储供应商/资产/ bower_components中的资产。确保将以下内容添加到您的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
它通过使用rails helper方法重写组件css文件中的url引用来以资产管道友好的方式引用资产,从而解析组件中的相对资产路径。有关详细信息,请参阅BowerRails::Performer#resolve_asset_paths。
我的首选是将所有bower_components签入我们的存储库,因此我们运行bower:install,然后是bower:resolve。然后,您需要将包中引用的图像添加到您的登台和生产环境的config.assets.precompile列表中。例如,这里是使用bower和rails将select2 javascript组件添加到rails项目的设置。
bower.json:
{
"name": "Acme",
"private": true,
"dependencies": {
"select2": "3.5.1"
}
}
应用程序/资产/ Javascript角/ application.js.coffee:
#= require select2/select2
应用程序/资产/样式表/ application.css.sass
//= require select2/select2
config / environments / staging.rb和config / environments / production.rb:
config.assets.precompile += ["select2/*.png",
"select2/*.gif"]
它并不完美,但它为您提供了javascript组件的依赖关系管理,并且最好还要找出您需要提供哪些宝石才能为资产管道启用所需的javascript组件。
答案 4 :(得分:1)
如果其他人认为在你的rails项目中使用bower是个好主意,那就再想一想。
Bower包根本不与导轨或链轮集成。
这意味着什么:
bundle install
不再适用于您的项目依赖项,您还必须使用其他程序包管理器相比之下,资产宝石很容易创建并提供统一的抽象,以便将资产拉入项目。您有机会修改原始文件并使用资产助手,以便与rails项目良好协作。创建资产宝石有一个不错的blog,以及创建宝石的一般railscast。
IMO对于rails社区来说,维护最新的资产宝石会比每个必须处理从未设计为插入rails资产管道的bower软件包问题的项目更好。