【问题标题】:How to manage Javascript dependencies with Bower in Rails apps?如何在 Rails 应用程序中使用 Bower 管理 Javascript 依赖项?
【发布时间】:2013-04-22 09:41:41
【问题描述】:

我的 Rails 应用程序中的 Javascript 依赖项不断增长,这导致了一些问题。一方面,有这么多,很难跟踪和更新不同 Javascript 库的版本。起初我尝试了turning them into gems,但后来我必须管理这些。有些已经是宝石(例如骨干轨),但我希望有一个一致的包管理器。

所以我正在研究Bower,“网络包管理器”。一些博客帖子from kaefffrom af83 很有帮助,但我仍然遇到问题。我希望这个问题可以为人们提供各种答案,以便为他们的项目找到最佳解决方案。

我特别希望看到有关在 Heroku 部署中通过 Bower 管理资产的建议。

【问题讨论】:

    标签: ruby-on-rails sprockets bower


    【解决方案1】:

    一种方法是使用 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"
      }
    }
    

    如果您想在一个配置文件中管理您的libvendor 资产,您可以使用bower-rails,但使用lib 没有多大意义。该 gem 还提供了一些 Rake 任务,但它们只执行基本的 Bower 命令。

    据我所知,目前还没有办法在资产编译期间根据需要安装 Bower。因此,如果您使用的是 Heroku 之类的部署环境,则需要提交您的 vendor/assets/components 目录并通过 bower 命令对其进行更新。

    如果你能在 application.js 中使用一个指令来要求你的整个 Bower 依赖集,那就太好了。 gist from kaeff 说明了如何创建 require_bower_dependencies 指令。还没有宝石可以为您做到这一点。在此之前,您必须在 bower.jsonapplication.js 中声明每个依赖项。

    【讨论】:

    • 自 2013 年 5 月 24 日起,sprockets 将其版本提升至 2.10.0,发行说明声明他们已添加“对 bower.json 的支持”。我还没有找到它的文档,但现在可能支持在资产编译期间解决 bower 依赖项。
    • 编辑:我查看了提交,看来这是支持 Bower 从 component.json 到 bower.json 的约定更改的更改
    • “这将使 Sprockets 也开始在供应商/资产/组件中寻找资产” - config.assets.paths << Rails.root.join("vendor", "assets", "components") 怎么样?当然,您不需要为此进行反向移植,还是我遗漏了什么?
    • chris edwards 是正确的 - 如果你需要 more details
    • "Sprockets 知道当您需要包时要包含哪些 Javascript,方法是读取主要属性的 bower.json 文件..." 如果您尝试包含 S/CSS 或图像怎么办组件?
    【解决方案2】:

    结帐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)
    Rails-Assets 项目的未来正在讨论中。请检查the thread 并做出自己的决定:使用它或找到解决方法。

    【讨论】:

    • 这样也避免了构建时的nodejs/npm/bower依赖,直接使用bower会引入。
    【解决方案3】:

    刚刚写了 a guide 用于 Rails+Bower+Heroku。希望对您有所帮助。

    【讨论】:

    • 我没有使用 Heroku,但我使用了您的 config/application.rb sn-p,因为 Sprockets 被 Bower 提取的源映射文件阻塞。发挥了魅力。
    【解决方案4】:

    过去几天我一直在解决这个问题,并确定了以下过程。

    使用bower-rails gem。它提供了许多不错的 rake 任务,有助于将 bower 的使用与 rails 应用程序和资产管道集成。我更喜欢使用 bower.json 配置,而不是 bower-rails 提供的基于 ruby​​ 的 DSL。我坚持将资产存储在 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 
    

    它通过使用 rails 辅助方法重写组件 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"
        }
    }
    

    app/assets/javascripts/application.js.coffee:

    #= require select2/select2
    

    app/assets/stylesheets/application.css.sass

    //= require select2/select2
    

    config/environments/staging.rb 和 config/environments/production.rb:

    config.assets.precompile += ["select2/*.png",
                                "select2/*.gif"]
    

    它并不完美,但它为您提供了 javascript 组件的依赖关系管理,而且最好先弄清楚您需要拉入哪些 gem 才能为资产管道启用所需的 javascript 组件。

    【讨论】:

      【解决方案5】:

      如果其他人认为在您的 rails 项目中使用 bower 是个好主意,请三思。

      Bower 套件根本无法与导轨或链轮集成。

      这是什么意思:

      • 他们通常不会指定清单 index.js 来通过 sprocket 需要指令包含您的 javascript。
      • 您必须在 bower 包中进行分析和搜索,并准确确定您需要什么以及从哪里开始(您的需求路径有点长)
      • bower 包没有统一指定主键,即使它们指定了当前的 sprockets/bower 支持似乎也忽略了它们
      • 字体、图像和模板等其他资产不会包含在您的生产资产编译中(Rails 4 仅包含 app/assets/xxx)
      • 使用 config.assets.precompile 模式来尝试“解决”问题是粗粒度的,并且会在您的凉亭组件目录中找到很多垃圾
      • bower 包不会使用 sprocket url 路径帮助器,因此 CSS/SCCS 中对图像和字体的任何引用都不会具有正确的资产路径。祝你好运。
      • 您必须解决使用 bower 包的每个项目中的所有问题
      • bundle install 不再适用于您的项目依赖项,您还必须使用另一个包管理器

      相比之下,资产 gem 易于创建,并提供统一的抽象来将资产拉入您的项目。您有机会修改原始文件并使用资产助手,以便在您的 Rails 项目中正常工作。有一个不错的blog 来创建资产宝石,还有一个通用的railscast 来创建宝石。

      IMO 对于 Rails 社区而言,维护最新的资产 gem 比每个项目都必须处理从未设计为插入到 rails 资产管道的 bower 包的问题要好。

      【讨论】:

      • Bower 注册表中有很多晦涩难懂的纯 JavaScript 库,要对它们全部进行宝石化将是一项巨大的工作;更不用说通过错误修复/功能使 Gems 保持最新。
      • @brendan 可能是这种情况,但是将 bower 与 rails 资产管道一起使用并不是解决方案。您似乎认为 bower 解决了您的 rails 应用程序的问题,但事实并非如此。 bower 为 rails 提供的唯一价值是运行 `git' 来为您提取源代码。为此,您可以改用 git 子模块从其原始存储库中提取 JS 并完全避免使用凉亭。
      猜你喜欢
      • 2017-11-10
      • 2015-06-06
      • 1970-01-01
      • 2015-09-20
      • 2012-11-22
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多