GemSpec中包含的依赖性未添加到Rails引擎中的资产管道[英] Dependency included in gemspec not added to asset pipeline in rails engine

本文是小编为大家收集整理的关于GemSpec中包含的依赖性未添加到Rails引擎中的资产管道的处理方法,想解了GemSpec中包含的依赖性未添加到Rails引擎中的资产管道的问题怎么解决?GemSpec中包含的依赖性未添加到Rails引擎中的资产管道问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在编写一个有一些依赖的rails引擎.我在GemSpec中指定了依赖关系,当我运行bundle install(即gemfile.lock看起来正确时,引擎正在找到它们.当我想在Ruby文件中使用该插件时,我可以这样做,但需要在文件顶部显式require dependency-name.

但是,当我想使用依赖性的资产管道时,链轮找不到它.

我正在使用的应用程序(现在)是rails插件的测试文件夹中的虚拟应用程序.如果我在引擎的GemFile中指定它们我不想依赖于Gemfile,因为这意味着任何使用我的插件的应用程序都需要手动将我的所有依赖性添加到他们的Gemfile中.出于同样的原因,我不希望一个解决方案,涉及更新应用程序的配置文件.

此工作(在Ruby文件中)从GemSpec中包含依赖项时:

require 'dependency-name'

但是这个(在js文件中)在gemspec中包含依赖项时不起作用:

//= require 'dependency-name'

依赖于Gemfile时需要require.我认为它很清楚,但如果您需要更多的细节,请告诉我.

推荐答案

我需要在我的Engine.RB中明确地包含依赖关系,以便其资产结束我的资产管道.不确定为什么这是必要的,因为Alastor的回答对我来说听起来很正确.值得注意的是,依赖关系是我使用Bundler创建的宝石,尽管我没有看到为什么应该有所作为.

module MyRailsPluginFull
  class Engine < ::Rails::Engine
    require 'dependency1'
    require 'dependency2'
  end
end

添加11/23/12

花了一些时间与发动机一起使用,我想我现在更加了解这一点. GemSpecs仅属于所需的依赖项列表,但GemSpec不会指示启动中的应用程序,以从这些依赖项加载文件.另一方面,Gemfiles在启动期间加载所有文件.

添加了3/20/2015

我的声明从2年前的"宝石,另一方面,在启动期间加载所有文件"并不完全是真的.它在rails中大多是真实的,默认情况下,它默认运行Bundler.require要要求gemfile中列出的所有依赖项,如生成器文件 - 请注意,轨道的默认行为从Rails3更改为Rails 4,如这里本讨论 Bundler.require与Bundler.setup.

此外,由于@nruth指出了评论中,这可能导致加载不必要的类.但是,如果依赖性设计良好,它的类主要是自动加载的,从而为需要整个依赖性而产生最小的开销.或者,如果它在孤立中可以要求的文件中定义其引擎,则可以包含引擎文件,该引擎文件应该将必要的文件添加到资产路径中,允许您在CSS&JS Maillest中要求其资产.看这个bootstrap-sass example ,宝石两者都将其所有资产添加到config.assets.paths并将其中一些添加到config.assets.precompile.

While this question is a few years old and I don't even remember what Rails Engine I was writing at the time, I suspect the right way to do it would have been closer to this:

module MyRailsPluginFull
  class Engine < ::Rails::Engine
    initializer 'bootstrap-sass.assets.precompile' do |app|
      require 'dependency1'

      # add dependency1's assets to the list of paths
      app.config.assets.paths << ...
    end
  end
end

但请注意,这不应该是必要的 - 依赖性本身应该已经定义了这个初始化程序,以便简单要求它是足够的,因为上面的引导示例.

其他推荐答案

您根据 http://edergeguides.rubyonrails.org/egine. html ?如果您的引擎类继承过Rails :: Engine,它真的应该自己找到所有资产.

本文地址:https://www.itbaoku.cn/post/786519.html